Předpokládejme, že se odpověď HTTP po průchodu Squidem objeví v několika zachycených TCP segmentech. Může jít o běžné chování TCP, nikoli o důkaz, že odpověď byla rozdělena nesprávně.

Dopředná proxy má obvykle dvě spojení:

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

Každé spojení má vlastní stav TCP, pořadová čísla a packetizaci. Proxy může číst data z jednoho spojení a zapisovat je do druhého, aniž by zachovala původní velikosti segmentů. Bufferování, časování odesílání, zahlcení a limity velikosti cesty mohou vytvořit jiné seskupení.

Tři hranice, které je vhodné držet oddělené

HraniceCo ji určuje
TCP segmentTransportní a síťová cesta
Výsledek čtení ze socketuDostupné bajty proudu a buffer volajícího
Zpráva nebo rámec HTTPPravidla rámování protokolu HTTP

Jedno čtení může obsahovat část hlavičky, celou hlavičku spolu s bajty těla nebo data přesahující více než jednu hranici aplikační vrstvy. TCP nepřipojuje „konec odpovědi HTTP“ ke konci úspěšného čtení.

Parser HTTP/1.1 proto shromažďuje hlavičky a používá příslušná pravidla rámování těla, včetně délky, přenosového kódování nebo povoleného uzavření spojení. Rámec HTTP/2 je struktura protokolu, která sama může procházet TCP segmenty; není jiným názvem pro síťový paket.

Úspěšný tunel CONNECT zachovává tunelovaný bajtový proud, přitom však stále používá dvě TCP nohy. Jeho hranice segmentů se mohou lišit, i když proxy bajty uvnitř tunelu nezměnila.

Při vyšetřování poškození porovnávejte znovu sestavená aplikační data. Porovnávání počtu paketů nebo očekávání stejných délek paketů na obou stranách žádá po TCP záruku hranic, kterou neposkytuje.

Související články