Bir web isteğinin anatomisi
Bu flood’da bir web isteğinin başlangıcından cevaplanmasına kadar istemci ve sunucu tarafında yapılan işlemleri kabaca tanıyacağız.
Bilindiği gibi web istekleri HTTP
protokolünü, HTTP
de taşıma katmanında TCP
protokolünü kullanır. Web sunucunun isteklere cevap verebilmesi için kurulu olduğu sunucuda istekleri karşılayacağı TCP
portunu dinlemek üzere işletim sisteminden izin alması gerekir.
Şimdi python
ile basit bir web sunucu ayağa kaldırarak ilk açılışı sırasında işletim sistemi ile olan iletişimini anlamlandırmaya çalışalım. Bunun için önceki flood'larda anlattığımız strace
adlı aracı kullanacağız.
Ekran çıktısında görüldüğü gibi sunucuda bir soket açılmış ve bind
sistem çağrısı ile işletim sisteminden 8090
numaralı TCP
portu talep edilmiştir. 8090
portu halihazırda başka bir uygulama tarafından kullanılmadığı için ilgili web sunucuya rezerve edilebilmiştir. Web sunucu portu rezerve ettikten sonra listen
sistem çağrısı ile işletim sistemine, ilgili porta gelen bütün paketleri kendisine göndermesi için talepte bulunur. İşletim sisteminin dinlenen porta gelen paketleri uygulamaya nasıl aktardığını sonraki flood'larda ele alacağız.
Bu noktaya kadar sunucu tarafında bir web isteğinin karşılanması için yapılan hazırlıkları gözlemledik. Şimdi de istemci tarafında bir web isteğini başlatırken yapılan işlemlere göz atalım. İstemcinin kendi işletim sistemi ile olan iletişimini daha rahat gözlemleyebilmek için komut satırından web istekleri yapmamızı sağlayan curl
adlı aracı kullanacağız. Bir yandan istemci tarafında strace
ile sistem çağrılarını gözlemlerken bir yandan da yine strace
ile sunucu tarafındaki sistem çağrılarını gözlemleyeceğiz.
Aşağıdaki ekran çıktısında istemci tarafında kullanılan curl
aracının işletim sistemi çekirdeğine yaptığı çağrılar gösterilmiştir. Görüldüğü üzere istemci bir TCP
soket açıp uzak sunucuya bağlantı kurmuş ve HTTP
isteğini yollayarak cevap almıştır.
Aşağıdaki ekran çıktısında ise istemcinin yaptığı istek sırasında sunucuda meydana gelen olaylar gösterilmiştir. Görüldüğü gibi sunucu öncelikle TCP
bağlantısını kabul etmiş sonra HTTP
isteğini okuyarak cevaplamıştır.
Şimdi de web sunucuya tarayıcı ile bağlanıp ağ trafiğini Wireshark
ile dinleyelim. Wireshark
çıktısında, işletim sisteminin kendisi tarafından yürütüldüğü için strace
'de görünmeyen TCP 3-way Handshake
'i de görebiliyoruz.
Anlaşılacağı üzere istemciler, web sunucularla bağlantı kurabilmek için soket açmaktadırlar. rfc2616
, sunucu ile kalıcı bağlantı oluşturan istemciler için kurulacak maksimum bağlantı sayısını 2 olarak belirlemiştir. Bu limitin amacı bir istemcinin çok fazla TCP
bağlantısı açarak sunucuyu gerekenden fazla meşgul etmesini engellemek ve web sunucu hizmetinin istemciler arasında adil bir şekilde dağıtılmasını sağlamaktır. Bu limit artan interaktivite sonucu güncel tarayıcılar için 2018 itibariyle 6 ile güncellenmiş görünmektedir.
İlerleyen flood’larda tarayıcıların 6 farklı bağlantı kullanarak günümüz interaktif web sitelerini nasıl yüklediklerini detaylı olarak inceleyeceğiz.