Diyelim ki bir HTTP yanıtı Squid’den geçtikten sonra yakalanan birkaç TCP segmentinde görünüyor. Bu, yanıtın yanlış bölündüğünün kanıtı değil, olağan TCP davranışı olabilir.

Yönlendirici proxy genellikle iki bağlantıya sahiptir:

client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin

Her bağlantının kendi TCP durumu, sıra numaraları ve paketlemesi vardır. Proxy bir bağlantıdan veri okuyup diğerine yazabilir; özgün segment boyutlarını korumaz. Arabelleğe alma, gönderim zamanı, tıkanıklık ve yolun boyut sınırları başka bir gruplama üretebilir.

Ayrı tutulmaya değer üç sınır

SınırOnu ne belirler
TCP segmentiTaşıma ve ağ yolu
Bir soket okumasının sonucuKullanılabilir akış baytları ve çağıranın arabelleği
HTTP iletisi veya çerçevesiHTTP protokolünün çerçeveleme kuralları

Tek bir okuma bir başlığın parçasını, tam bir başlığı gövde baytlarıyla birlikte ya da birden fazla uygulama düzeyi sınırını aşan veriyi içerebilir. TCP «HTTP yanıtının sonunu» başarılı bir okumanın sonuna bağlamaz.

Bu yüzden HTTP/1.1 ayrıştırıcısı başlıkları biriktirir ve geçerli gövde çerçeveleme kurallarını uygular; bunlara uzunluk, aktarım kodlaması veya izin verilen bağlantı kapanışı dahildir. HTTP/2 çerçevesi, kendisi TCP segmentlerini aşabilen bir protokol yapısıdır; ağ paketinin başka bir adı değildir.

Başarılı bir CONNECT tüneli tünel içindeki bayt akışını korur ama yine iki TCP bacağı kullanır. Proxy tünel içindeki baytları değiştirmemiş olsa bile segment sınırları farklı olabilir.

Bozulmayı araştırırken yeniden birleştirilen uygulama verilerini karşılaştırın. Paket sayılarını karşılaştırmak veya iki tarafta aynı paket uzunluklarını beklemek, TCP’den vermediği bir sınır garantisi istemektir.

İlgili makaleler