Un proxy forward non conserva i confini dei segmenti TCP
Distinguere segmentazione TCP, letture del socket e incorniciatura HTTP quando si esamina il traffico ai due lati di un proxy forward.
Supponiamo che una risposta HTTP compaia in più segmenti TCP acquisiti dopo aver attraversato Squid. Può trattarsi di normale comportamento TCP, non della prova che la risposta sia stata suddivisa in modo errato.
Un proxy forward ha di norma due connessioni:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Ogni connessione ha il proprio stato TCP, i propri numeri di sequenza e la propria pacchettizzazione. Il proxy può leggere dati da una connessione e scriverli nell’altra senza conservare le dimensioni originali dei segmenti. Buffering, istante di invio, congestione e limiti di dimensione del percorso possono produrre un raggruppamento diverso.
Tre confini da tenere separati
| Confine | Che cosa lo determina |
|---|---|
| Segmento TCP | Il percorso di trasporto e di rete |
| Risultato di una lettura del socket | I byte disponibili del flusso e il buffer del chiamante |
| Messaggio o frame HTTP | Le regole di incorniciatura del protocollo HTTP |
Una singola lettura può contenere parte di un’intestazione, un’intestazione intera più byte del corpo, o dati che attraversano più di un confine applicativo. TCP non collega «fine della risposta HTTP» alla fine di una lettura riuscita.
Un parser HTTP/1.1 accumula quindi le intestazioni e applica le regole di incorniciatura del corpo pertinenti, tra cui lunghezza, codifica di trasferimento o chiusura della connessione consentita. Un frame HTTP/2 è una struttura di protocollo che può essa stessa attraversare segmenti TCP; non è un altro nome per un pacchetto di rete.
Un tunnel CONNECT riuscito conserva il flusso di byte incapsulato pur usando ancora due tratte TCP. I suoi confini di segmento possono differire anche quando il proxy non ha modificato i byte all’interno del tunnel.
Quando si indaga su una corruzione, confrontare i dati applicativi riassemblati. Confrontare il numero di pacchetti o attendersi lunghezze identiche sui due lati chiede a TCP una garanzia sui confini che non fornisce.