Oletetaan, että HTTP-vastaus näkyy useassa kaapatussa TCP-segmentissä Squidin läpikulun jälkeen. Se voi olla tavallista TCP-käyttäytymistä eikä todiste siitä, että vastaus jaettiin väärin.

Edelleenvälittävällä välityspalvelimella on yleensä kaksi yhteyttä:

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

Jokaisella yhteydellä on oma TCP-tilansa, järjestysnumeronsa ja paketointinsa. Välityspalvelin voi lukea dataa yhdestä yhteydestä ja kirjoittaa sen toiseen säilyttämättä alkuperäisiä segmenttikokoja. Puskurointi, lähetysajankohta, ruuhka ja polun kokorajat voivat tuottaa toisenlaisen ryhmittelyn.

Kolme rajaa, jotka kannattaa pitää erillään

RajaMikä sen määrää
TCP-segmenttiKuljetus- ja verkkopolku
Socket-luennan tulosKäytettävissä olevat virran tavut ja kutsujan puskuri
HTTP-viesti tai -kehysHTTP-protokollan kehyssäännöt

Yksi luenta voi sisältää osan otsakkeesta, kokonaisen otsakkeen ja runko-osan tavut tai dataa, joka ylittää useamman kuin yhden sovellustason rajan. TCP ei liitä “HTTP-vastauksen loppua” onnistuneen luennan loppuun.

Siksi HTTP/1.1-jäsennin kerää otsakkeita ja soveltaa asianmukaisia rungon kehyssääntöjä, mukaan lukien pituus, siirtokoodaus tai sallittu yhteyden sulkeminen. HTTP/2-kehys on protokollarakenne, joka voi itse ylittää TCP-segmenttejä; se ei ole verkkopaketin toinen nimi.

Onnistunut CONNECT-tunneli säilyttää tunneloidun tavuvirran mutta käyttää silti kahta TCP-osuutta. Sen segmenttirajat voivat poiketa, vaikka välityspalvelin ei olisi muuttanut tunnelin sisäisiä tavuja.

Kun tutkit vioittumista, vertaa uudelleen koottua sovellusdataa. Pakettimäärien vertaaminen tai samojen pakettipituuksien odottaminen molemmilla puolilla pyytää TCP:ltä rajantakausta, jota se ei anna.

Aiheeseen liittyvät artikkelit