Yönlendirici proxy TCP segment sınırlarını korumaz
Yönlendirici proxy’nin iki tarafındaki trafiği incelerken TCP segmentasyonunu, soket okumalarını ve HTTP çerçevelemesini ayrı tutun.
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ır | Onu ne belirler |
|---|---|
| TCP segmenti | Taşıma ve ağ yolu |
| Bir soket okumasının sonucu | Kullanılabilir akış baytları ve çağıranın arabelleği |
| HTTP iletisi veya çerçevesi | HTTP 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.