Dopredná proxy nezachováva hranice TCP segmentov
Pri skúmaní prevádzky na oboch stranách doprednej proxy oddeľte segmentáciu TCP, čítania zo socketu a rámcovanie HTTP.
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 segment | Transportná a sieťová cesta |
| Výsledok čítania zo socketu | Dostupné bajty toku a buffer volajúceho |
| Správa alebo rámec HTTP | Pravidlá 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.