Um proxy forward não preserva os limites dos segmentos TCP
Separe a segmentação TCP, as leituras de socket e o enquadramento HTTP ao inspecionar o tráfego dos dois lados de um proxy forward.
Suponha que uma resposta HTTP apareça em vários segmentos TCP capturados depois de passar pelo Squid. Isso pode ser um comportamento normal do TCP, e não a prova de que a resposta foi dividida incorretamente.
Um proxy forward normalmente tem duas conexões:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Cada conexão tem o seu próprio estado TCP, números de sequência e empacotamento. O proxy pode ler dados de uma conexão e gravá-los na outra sem preservar os tamanhos originais dos segmentos. O armazenamento em buffer, o momento do envio, o congestionamento e os limites de tamanho do caminho podem produzir outro agrupamento.
Três limites que vale a pena manter separados
| Limite | O que o determina |
|---|---|
| Segmento TCP | O caminho de transporte e de rede |
| Resultado de uma leitura de socket | Os bytes disponíveis do fluxo e o buffer de quem chama |
| Mensagem ou quadro HTTP | As regras de enquadramento do protocolo HTTP |
Uma única leitura pode conter parte de um cabeçalho, um cabeçalho inteiro mais bytes do corpo, ou dados que atravessam mais de um limite de nível de aplicação. O TCP não liga «fim da resposta HTTP» ao fim de uma leitura bem-sucedida.
Por isso um analisador HTTP/1.1 acumula cabeçalhos e aplica as regras de enquadramento do corpo cabíveis, incluindo comprimento, codificação de transferência ou encerramento de conexão permitido. Um quadro HTTP/2 é uma estrutura de protocolo que pode, ele próprio, atravessar segmentos TCP; não é outro nome para um pacote de rede.
Um túnel CONNECT bem-sucedido preserva o fluxo de bytes tunelizado embora ainda use dois trechos TCP. Os seus limites de segmento podem diferir mesmo quando o proxy não alterou os bytes dentro do túnel.
Ao investigar corrupção, compare os dados de aplicação remontados. Comparar contagens de pacotes ou esperar comprimentos idênticos nos dois lados pede ao TCP uma garantia de limites que ele não oferece.