Não. Um único segmento TCP não pode transportar duas mensagens de requisição HTTP distintas. Esta é uma propriedade fundamental de como HTTP e TCP interagem.
Camadas de Protocolo
Aplicação: HTTP Requisição 1 | HTTP Requisição 2 | HTTP Requisição 3 ... Transporte: Segmento TCP 1 | Segmento TCP 2 | Segmento TCP 3 ... Rede: Pacote IP 1 | Pacote IP 2 | Pacote IP 3 ...
Por Que Não?
1. Limites de Mensagem HTTP ≠ Limites de Segmento TCP
- Mensagens HTTP são unidades da camada aplicação com enquadramento explícito (Content-Length, Transfer-Encoding: chunked)
- Segmentos TCP são unidades da camada transporte dimensionados por MSS (Max Segment Size), MTU do caminho, janela de congestionamento
- Uma requisição HTTP tipicamente abrange múltiplos segmentos TCP (linha requisição + cabeçalhos + corpo > 1460 bytes)
- Inversamente, um segmento TCP pode transportar partes de múltiplas mensagens HTTP apenas se pipelining + mensagens pequenas + algoritmo Nagle alinharem — mas nunca duas requisições completas e distintas
2. Pipelining HTTP/1.1 (Contexto Histórico)
Clientes podiam enviar múltiplas requisições sem esperar respostas (pipelining). Mas:
- Requisições ainda enviadas sequencialmente no fio
- Segmentos TCP transportam bytes, não mensões — limites de segmento não alinham com limites de requisição
- Pipelining depreciado devido a head-of-line blocking; removido no HTTP/2
3. HTTP/2 & HTTP/3: Multiplexação, Não Empacotamento de Segmento
- HTTP/2: Frames (HEADERS, DATA) multiplexados sobre uma conexão TCP. Frames de diferentes streams se intercalam. Ainda: frames ≠ segmentos TCP.
- HTTP/3 (QUIC): Streams sobre UDP. Pacotes QUIC carregam frames. Sem TCP.
4. Matemática do Maximum Segment Size
- MSS típico = 1460 bytes (Ethernet MTU 1500 – 20 IP – 20 TCP)
- GET HTTP mínimo: ~200 bytes (cabe em um segmento)
- Mas: Dois GETs mínimos = 400 bytes. Poderia caber em um segmento se algoritmo Nagle coalescer.
- Porém: Permanecem duas mensagens HTTP distintas. O segmento carrega um fluxo de bytes contendo ambas. O parser HTTP do receptor as separa via enquadramento do protocolo — não limites de segmento.
A Distinção Crítica
TCP é protocolo de fluxo de bytes. Entrega bytes ordenados. HTTP é protocolo de mensagens. Define limites de mensagem dentro desse fluxo de bytes.
- Remetente: Escreve bytes requisição HTTP no socket → TCP segmenta arbitrariamente
- Destinatário: TCP remonta fluxo de bytes → Parser HTTP encontra limites mensagem (Content-Length / chunked)
Limites de segmento são invisíveis para HTTP. São otimização de transporte, não limite semântico.
Implicação Prática
Nunca projete lógica de aplicação assumindo "um segmento = uma requisição" ou vice-versa. Sempre parseie HTTP por suas próprias regras de enquadramento. Use Content-Length ou Transfer-Encoding: chunked.
Exceção: HTTP/1.0 Sem Keep-Alive
Cada requisição em nova conexão → cada conexão tem seus próprios segmentos TCP. Ainda: uma requisição → tipicamente múltiplos segmentos.
Conclusão: TCP segmenta bytes; HTTP enquadra mensagens. Operam em camadas diferentes com limites diferentes.