Un proxy directo non conserva os límites dos segmentos TCP
Separe a segmentación TCP, as lecturas de socket e o entramado HTTP ao inspeccionar o tráfico a ambos os lados dun proxy directo.
Supoñamos que unha resposta HTTP aparece en varios segmentos TCP capturados despois de pasar por Squid. Iso pode ser un comportamento normal de TCP e non unha proba de que a resposta se dividise incorrectamente.
Un proxy directo adoita ter dúas conexións:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Cada conexión ten o seu propio estado TCP, os seus números de secuencia e a súa paquetización. O proxy pode ler datos dunha conexión e escribilos na outra sen conservar os tamaños orixinais dos segmentos. A almacenaxe en búfer, o momento do envío, a conxestión e os límites de tamaño da ruta poden producir outra agrupación.
Tres límites que convén manter separados
| Límite | Que o determina |
|---|---|
| Segmento TCP | A ruta de transporte e de rede |
| Resultado dunha lectura de socket | Os bytes dispoñibles do fluxo e o búfer de quen chama |
| Mensaxe ou trama HTTP | As regras de entramado do protocolo HTTP |
Unha soa lectura pode conter parte dunha cabeceira, unha cabeceira completa xunto con bytes do corpo ou datos que cruzan máis dun límite de nivel de aplicación. TCP non vincula «fin da resposta HTTP» co final dunha lectura correcta.
Por iso un analizador HTTP/1.1 acumula cabeceiras e aplica as regras de entramado do corpo que correspondan, incluíndo a lonxitude, a codificación de transferencia ou o peche de conexión permitido. Unha trama HTTP/2 é unha estrutura de protocolo que pode cruzar por si mesma segmentos TCP; non é outro nome para un paquete de rede.
Un túnel CONNECT correcto conserva o fluxo de bytes tunelizado aínda que segue usando dous tramos TCP. Os seus límites de segmento poden diferir mesmo cando o proxy non cambiou os bytes dentro do túnel.
Ao investigar unha corrupción, compare os datos de aplicación reensamblados. Comparar recontos de paquetes ou esperar lonxitudes idénticas en ambos os lados pide a TCP unha garantía de límites que non ofrece.