05 - Campos do Segmento
video: https://youtu.be/... no frontmatter da nota.O Cabeçalho TCP é uma estrutura de dados de 20 bytes (sem as opções) que contém todas as informações necessárias para gerenciar a conexão confiável entre os dois hosts.
1. Diagrama Completo do Segmento
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data Offset| Reserv |C|E|U|A|P|R|S|F| Window | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (0-40 bytes) | 0-40 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2. Campos Fundamentais
| Campo | Tamanho (Bits) | Função |
|---|---|---|
| Porta de Origem | 16 | Identifica o processo transmissor. |
| Porta de Destino | 16 | Identifica o processo receptor. |
| Sequence Number | 32 | Número do primeiro byte de dados de um segmento. |
| Acknowledgment Number | 32 | Número do próximo byte de dados esperado. |
| Data Offset | 4 | Indica o tamanho do cabeçalho TCP (onde começam os dados). |
| Reserved | 4 | Reservado para uso futuro (deve ser zero). |
| Control Flags | 8 | Bits que controlam o estado da conexão (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN). |
| Window Size | 16 | Tamanho da janela de recepção (usada para Controle de Fluxo). |
| Checksum | 16 | Usado para detecção de erros no cabeçalho e dados. |
| Urgent Pointer | 16 | Identifica dados urgentes (raramente usado hoje). |
Detalhamento de Cada Campo
- Source Port / Destination Port (16 bits cada): Identificam o processo de origem e o de destino. A combinação com IPs forma o 5-tuple que identifica a conexão.
- Sequence Number (32 bits): Quando
SYN=0é o número do primeiro byte no payload. QuandoSYN=1é o Initial Sequence Number (ISN) inicial e o primeiro byte de dados seráISN+1. Com 32 bits, o número se repete após ~4 GB transmitidos; em links de 10 Gbps isso ocorre em ~3,4 s — o TCP cuida do wrap-around com a opção Timestamps (PAWS). - Acknowledgment Number (32 bits): Válido apenas se
ACK=1. Indica o próximo byte esperado (ACK cumulativo). - Data Offset (4 bits): Tamanho do cabeçalho em palavras de 32 bits. Mínimo = 5 (20 bytes); máximo = 15 (60 bytes). Como o campo não tem unidade própria, esta é a única forma de saber onde terminam as opções e começa o payload.
- Reserved (4 bits): Sempre zero em RFC 793. A RFC 3540 redefiniu parcialmente o último bit como NS (Nonce Sum) para ECN-nonce.
- Window Size (16 bits): Anuncia o espaço livre no buffer de recepção, em bytes. Com a opção Window Scale, o valor real é
Window Size × 2^Nonde N é negociado (até 14). Permite janelas de até 1 GB, essenciais em redes de alto Bandwidth-Delay Product. - Checksum (16 bits): Cobertura inclui cabeçalho TCP, payload e pseudo-header (IPs de origem/destino, protocolo=6, comprimento TCP). É obrigatório em IPv4 e IPv6.
- Urgent Pointer (16 bits): Válido apenas se
URG=1. Aponta para o último byte de dados urgentes no payload. Quase nunca usado em aplicações modernas.
3. As 8 Flags de Controle
As flags são bits de controle (0 ou 1) que definem o propósito do segmento:
| Flag | Sigla | Função |
|---|---|---|
| CWR | Congestion Window Reduced | Emissor reduziu cwnd em resposta a ECN |
| ECE | ECN-Echo | Receptor detectou congestionamento via IP ECN |
| URG | Urgent | Campo Urgent Pointer é válido |
| ACK | Acknowledgment | Campo Acknowledgment Number é válido |
| PSH | Push | Entrega imediatamente os dados à aplicação |
| RST | Reset | Encerra conexão abruptamente (erro, política de segurança) |
| SYN | Synchronize | Inicia conexão / sincroniza ISN |
| FIN | Finish | Encerra conexão amigavelmente (sem mais dados a enviar) |
Combinações Comuns de Flags
| Combinação | Estado / Propósito |
|---|---|
SYN |
Início de conexão (cliente) |
SYN+ACK |
Resposta do servidor ao SYN |
ACK |
Confirmação de dados / keepalive |
FIN+ACK |
Solicitação de fechamento de conexão |
RST+ACK |
Rejeição imediata (porta fechada, política) |
PSH+ACK |
Dados que devem ser entregues imediatamente |
URG+ACK |
Dados urgentes (raro) |
ECN: CWR e ECE
As flags CWR e ECE suportam ECN (Explicit Congestion Notification), definido na RFC 3168:
1. Roteador marca o campo ECN do cabeçalho IP quando congestiona (ao invés de descartar o pacote).
2. Receptor TCP vê a marca e seta ECE=1 nos próximos ACKs.
3. Emissor TCP reduz cwnd e seta CWR=1 para confirmar.
4. Quando o receptor vê CWR=1, para de setar ECE=1.
Isso evita perdas desnecessárias e melhora desempenho em redes de alta latência (CDNs, datacenters).
4. As Opções TCP
Após o cabeçalho fixo, o TCP pode incluir Opções (até 40 bytes, pois Data Offset máximo = 15 palavras = 60 bytes, menos 20 do fixo = 40). Cada opção tem o formato Kind (1 byte) + Length (1 byte) + Value.
| Kind | Nome | Tamanho | Negociado em | Função |
|---|---|---|---|---|
| 0 | EOL | 1 byte | — | Fim da lista de opções |
| 1 | NOP | 1 byte | — | Preenchimento para alinhamento |
| 2 | MSS | 4 bytes | SYN | Tamanho máximo do segmento |
| 3 | Window Scale | 3 bytes | SYN | Multiplicador da janela (até 214) |
| 4 | SACK Permitted | 2 bytes | SYN | Habilita SACK |
| 5 | SACK | variável | Dados | Blocos recebidos fora de ordem |
| 8 | Timestamps | 10 bytes | SYN+ACK | TSval, TSecr para RTT e PAWS |
| 19 | MD5 Signature | 18 bytes | Dados | Autenticação BGP (RFC 2385) |
| 29 | TCP Authentication | variável | SYN+ACK | Substitui MD5 (RFC 5925) |
| 34 | TCP Fast Open Cookie | variável | SYN+ACK | Habilita TFO (RFC 7413) |
MSS (Maximum Segment Size)
Negociado durante o Three-Way Handshake. Valor típico em Ethernet: 1460 bytes. Em IPv6: 1220 bytes (considerando MTU 1280 mínimo). Sempre anunciado pelo lado que está recebendo — "eu aceito segmentos de até X bytes".
SACK (Selective Acknowledgment)
Permite avisar exatamente quais blocos chegaram, ao invés de só o número cumulativo:
- Sem SACK: se segmentos 1, 3 e 5 chegam mas 2 e 4 se perdem, o ACK só confirma até o 1. Emissor retransmite 2, 3, 4, 5 (desperdício).
- Com SACK: o receptor envia ACK=1, SACK=[3-3, 5-5]. Emissor retransmite apenas 2 e 4.
Timestamps e PAWS
A opção Timestamps adiciona dois campos de 32 bits:
- TSval: timestamp do emissor (em unidades arbitrárias, tipicamente ms desde boot).
- TSecr: eco do TSval do par (para cálculo de RTT).
Isso também habilita o PAWS (Protect Against Wrapped Sequences): um segmento antigo (com TS muito menor que o esperado) é descartado mesmo que seu número de sequência esteja na janela atual. Crítico em links de alta velocidade onde o seq number "dá a volta" em poucos segundos.
Window Scale
Permite janelas maiores que 65.535 bytes (limite de 16 bits). Negociado como shift count N no SYN: o valor real da janela será Window Size × 2^N, com N até 14 (janela máxima de 1 GB). Essencial em redes de alto BDP (ex: 10 Gbps com 100 ms RTT = 125 MB de BDP).
5. Captura Prática
# Capturar handshake completo com detalhes de flags e opções
sudo tcpdump -i eth0 -nn -vvv 'tcp port 443 and (tcp[tcpflags] & tcp-syn != 0)' -X
# Exemplo: SYN do cliente
# Flags [S], cksum 0x1234 (correct), seq 2825831680, win 64240,
# options [mss 1460,nop,wscale 8,nop,nop,sackOK,TS val 1234567 ecr 0],
# length 0
# Exemplo: SYN+ACK do servidor
# Flags [S.], cksum 0xabcd (correct), seq 3851780352, ack 2825831681,
# win 29200, options [mss 1460,nop,nop,sackOK,TS val 9876543 ecr 1234567,
# nop,wscale 7], length 0
Note o wscale 8 do cliente e wscale 7 do servidor, indicando janelas reais de até 64240 × 256 = ~16 MB (cliente) e 29200 × 128 = ~3,7 MB (servidor).
6. Resumo de Tamanhos
| Item | Tamanho |
|---|---|
| Cabeçalho fixo | 20 bytes |
| Cabeçalho máximo (com opções) | 60 bytes |
| Opções máximas | 40 bytes |
| Payload típico Ethernet | 1460 bytes |
| Segmento típico (cabeçalho + payload) | 1500 bytes (cabe na MTU) |
| Segmento máximo teórico | 65.515 bytes (limitado por IP) |
O cabeçalho TCP é uma das estruturas mais densas da pilha de protocolos da Internet. Cada bit foi cuidadosamente projetado para permitir confiabilidade, controle de fluxo, controle de congestão, segurança (ECN, MD5/AO) e otimizações modernas (SACK, Window Scale, Timestamps, Fast Open). Conhecer esses campos é fundamental para analisar capturas com tcpdump/Wireshark, diagnosticar lentidão em conexões e projetar sistemas de alta performance.