Predpokladajme, že sa odpoveď HTTP po prechode cez Squid objaví v niekoľkých zachytených TCP segmentoch. Môže ísť o bežné správanie TCP, nie o dôkaz, že odpoveď bola rozdelená nesprávne.

Dopredná proxy má zvyčajne dve spojenia:

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

Každé spojenie má vlastný stav TCP, poradové čísla a packetizáciu. Proxy môže čítať dáta z jedného spojenia a zapisovať ich do druhého bez zachovania pôvodných veľkostí segmentov. Bufferovanie, časovanie odosielania, preťaženie a limity veľkosti cesty môžu vytvoriť iné zoskupenie.

Tri hranice, ktoré je vhodné držať oddelené

HranicaČo ju určuje
TCP segmentTransportná a sieťová cesta
Výsledok čítania zo socketuDostupné bajty toku a buffer volajúceho
Správa alebo rámec HTTPPravidlá rámcovania protokolu HTTP

Jedno čítanie môže obsahovať časť hlavičky, celú hlavičku spolu s bajtmi tela alebo dáta presahujúce viac ako jednu hranicu aplikačnej vrstvy. TCP nepripája „koniec odpovede HTTP“ ku koncu úspešného čítania.

Preto parser HTTP/1.1 zhromažďuje hlavičky a používa príslušné pravidlá rámcovania tela, vrátane dĺžky, prenosového kódovania alebo povoleného zatvorenia spojenia. Rámec HTTP/2 je štruktúra protokolu, ktorá sama môže prechádzať TCP segmentmi; nie je iným názvom pre sieťový paket.

Úspešný tunel CONNECT zachováva tunelovaný bajtový tok, no stále používa dve TCP vetvy. Jeho hranice segmentov sa môžu líšiť, aj keď proxy nezmenila bajty vnútri tunela.

Pri vyšetrovaní poškodenia porovnávajte znovu zostavené aplikačné dáta. Porovnávanie počtu paketov alebo očakávanie rovnakých dĺžok paketov na oboch stranách žiada od TCP záruku hraníc, ktorú neposkytuje.

Súvisiace články