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

LimiteO que o determina
Segmento TCPO caminho de transporte e de rede
Resultado de uma leitura de socketOs bytes disponíveis do fluxo e o buffer de quem chama
Mensagem ou quadro HTTPAs 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.

Artigos relacionados