Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

05 - Campos do Segmento

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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. Quando SYN=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^N onde 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)

Note

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.