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.