Un proxy forward nu păstrează limitele segmentelor TCP
Separați segmentarea TCP, citirile din socket și încadrarea HTTP atunci când inspectați traficul de ambele părți ale unui proxy forward.
Să presupunem că un răspuns HTTP apare în mai multe segmente TCP capturate după ce a trecut prin Squid. Acesta poate fi un comportament TCP obișnuit, nu dovada că răspunsul a fost împărțit incorect.
Un proxy forward are de obicei două conexiuni:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Fiecare conexiune are propriul său stare TCP, numere de secvență și împachetare. Proxy-ul poate citi date dintr-o conexiune și le poate scrie în cealaltă fără a păstra dimensiunile inițiale ale segmentelor. Memorarea în tampon, momentul trimiterii, congestia și limitele de dimensiune ale căii pot produce o altă grupare.
Trei limite care merită ținute separat
| Limită | Ce o determină |
|---|---|
| Segment TCP | Calea de transport și de rețea |
| Rezultatul unei citiri din socket | Octeții disponibili din flux și tamponul apelantului |
| Mesaj sau cadru HTTP | Regulile de încadrare ale protocolului HTTP |
O singură citire poate conține parte dintr-un antet, un antet întreg plus octeții corpului sau date care traversează mai mult de o limită de nivel aplicație. TCP nu leagă „sfârșitul răspunsului HTTP” de sfârșitul unei citiri reușite.
De aceea un parser HTTP/1.1 acumulează antete și aplică regulile de încadrare a corpului aplicabile, inclusiv lungimea, codificarea de transfer sau închiderea permisă a conexiunii. Un cadru HTTP/2 este o structură de protocol care poate ea însăși traversa segmente TCP; nu este un alt nume pentru un pachet de rețea.
Un tunel CONNECT reușit păstrează fluxul de octeți tunelat, folosind totuși două tronsoane TCP. Limitele segmentelor sale pot diferi chiar și atunci când proxy-ul nu a modificat octeții din interiorul tunelului.
Când investigați o corupere, comparați datele aplicației reasamblate. Compararea numărului de pachete sau așteptarea unor lungimi identice pe ambele părți cere de la TCP o garanție a limitelor pe care acesta nu o oferă.