Pretpostavimo da se HTTP odgovor pojavi u nekoliko snimljenih TCP segmenata nakon prolaska kroz Squid. To može biti uobičajeno TCP ponašanje, a ne dokaz da je odgovor pogrešno podijeljen.

Prednji proxy obično ima dvije veze:

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

Svaka veza ima vlastito TCP stanje, redne brojeve i paketizaciju. Proxy može čitati podatke s jedne veze i pisati ih na drugu bez čuvanja izvornih veličina segmenata. Međuspremanje, vrijeme slanja, zagušenje i ograničenja veličine puta mogu stvoriti drukčije grupiranje.

Tri granice koje valja držati odvojeno

GranicaŠto je određuje
TCP segmentTransportni i mrežni put
Rezultat čitanja utičniceDostupni bajtovi toka i međuspremnik pozivatelja
HTTP poruka ili okvirPravila uokviravanja HTTP protokola

Jedno čitanje može sadržavati dio zaglavlja, cijelo zaglavlje zajedno s bajtovima tijela ili podatke koji prelaze više od jedne granice aplikacijske razine. TCP ne veže „kraj HTTP odgovora“ uz kraj uspješnog čitanja.

Zato HTTP/1.1 parser nakuplja zaglavlja i primjenjuje važeća pravila uokviravanja tijela, uključujući duljinu, prijenosno kodiranje ili dopušteno zatvaranje veze. HTTP/2 okvir je protokolna struktura koja i sama može prijeći TCP segmente; to nije drugi naziv za mrežni paket.

Uspješan CONNECT tunel čuva tunelirani tok bajtova, ali i dalje koristi dvije TCP dionice. Njegove granice segmenata mogu se razlikovati čak i kada proxy nije promijenio bajtove unutar tunela.

Kada istražujete oštećenje, usporedite ponovno sastavljene aplikacijske podatke. Uspoređivanje broja paketa ili očekivanje jednakih duljina paketa s obje strane traži od TCP-a jamstvo granica koje ono ne pruža.

Povezani članci