Dopředná proxy nezachovává hranice TCP segmentů
Při zkoumání provozu na obou stranách dopředné proxy oddělte segmentaci TCP, čtení ze socketu a rámování HTTP.
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é
| Hranice | Co ji určuje |
|---|---|
| TCP segment | Transportní a síťová cesta |
| Výsledek čtení ze socketu | Dostupné bajty proudu a buffer volajícího |
| Zpráva nebo rámec HTTP | Pravidla 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.