Een forward-proxy bewaart geen TCP-segmentgrenzen
Onderscheid TCP-segmentatie, socket-leesbewerkingen en HTTP-framing bij het inspecteren van verkeer aan beide zijden van een forward-proxy.
Stel dat een HTTP-antwoord na het passeren van Squid in meerdere opgevangen TCP-segmenten verschijnt. Dat kan gewoon TCP-gedrag zijn, en geen bewijs dat het antwoord verkeerd is opgesplitst.
Een forward-proxy heeft gewoonlijk twee verbindingen:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Elke verbinding heeft zijn eigen TCP-status, volgnummers en pakkettering. De proxy kan gegevens van de ene verbinding lezen en naar de andere schrijven zonder de oorspronkelijke segmentgroottes te bewaren. Buffering, verzendmoment, congestie en de groottelimieten van het pad kunnen een andere groepering opleveren.
Drie grenzen die je gescheiden wilt houden
| Grens | Wat die bepaalt |
|---|---|
| TCP-segment | Het transport- en netwerkpad |
| Resultaat van een socket-leesbewerking | De beschikbare stroombytes en de buffer van de aanroeper |
| HTTP-bericht of -frame | De framingregels van het HTTP-protocol |
Eén leesbewerking kan een deel van een header, een volledige header plus body-bytes of gegevens bevatten die meer dan één grens op applicatieniveau overschrijden. TCP koppelt ‘einde van het HTTP-antwoord’ niet aan het einde van een geslaagde leesbewerking.
Een HTTP/1.1-parser verzamelt daarom headers en past de geldende regels voor body-framing toe, waaronder lengte, transfercodering of toegestane verbindingssluiting. Een HTTP/2-frame is een protocolstructuur die zelf TCP-segmenten kan overschrijden; het is geen andere naam voor een netwerkpakket.
Een geslaagde CONNECT-tunnel bewaart de getunnelde bytestroom maar gebruikt nog steeds twee TCP-benen. De segmentgrenzen kunnen verschillen, zelfs wanneer de proxy de bytes in de tunnel niet heeft gewijzigd.
Vergelijk bij het onderzoeken van corruptie de opnieuw samengestelde applicatiegegevens. Pakketaantallen vergelijken of aan beide zijden identieke pakketlengtes verwachten, vraagt TCP om een grensgarantie die het niet geeft.