Prednji proxy ne čuva granice TCP segmenata
Odvojite TCP segmentaciju, čitanja utičnice i HTTP uokviravanje kada pregledavate promet s obje strane prednjeg proxyja.
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 segment | Transportni i mrežni put |
| Rezultat čitanja utičnice | Dostupni bajtovi toka i međuspremnik pozivatelja |
| HTTP poruka ili okvir | Pravila 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.