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

01 - Sequence Number

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Sequence Number (TCP)

O campo Sequence Number (Número de Sequência) é um campo de 32 bits localizado no cabeçalho TCP (bytes 4 a 7). Ele é fundamental para o serviço de confiabilidade do protocolo, pois identifica a posição de cada byte de dados dentro do fluxo de comunicação.

Diferente de outros protocolos que numeram "pacotes" (como o Frame Relay, X.25 ou IPX), o TCP numera bytes. Isso permite um controle granular e preciso sobre o fluxo de dados, possibilitando a detecção de perdas, a reordenação de pacotes que chegaram fora de ordem e a eliminação de duplicatas.

1. Localização no Cabeçalho TCP

 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        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |  ← este campo
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
...
Atributo Valor
Tamanho 32 bits (4 bytes)
Offset Bytes 4-7 do cabeçalho TCP
Faixa 0 a 4.294.967.295 (2^32 - 1)
RFC RFC 793 (1981), RFC 9293 (2022, consolida)

2. O Conceito de Fluxo de Bytes (Byte-Stream)

O TCP trata os dados não como blocos isolados, mas como um fluxo contínuo e infinito de bytes que flui do remetente para o receptor.

  • Numeração Absoluta: O primeiro byte de dados enviado em uma conexão recebe um número de sequência inicial (ISN - Initial Sequence Number). Todos os bytes subsequentes são numerados sequencialmente em relação a esse início.
  • Não é Número de Pacote: O Sequence Number no cabeçalho de um segmento não identifica "Este é o pacote número 10". Ele identifica "O primeiro byte deste pacote é o byte número X do fluxo total".
  • Exemplo Prático:
    • Se o Sequence Number de um segmento é 1000 e o segmento carrega 100 bytes de dados:
    • Este segmento transporta os bytes de número 1000 a 1099.
    • O próximo segmento enviado (imediatamente após, sem perdas) terá obrigatoriamente o Sequence Number 1100.

Importância da Granularidade por Byte

A numeração por byte (e não por pacote) é o que diferencia o TCP de protocolos como UDP ou SCTP. Ela permite:

  1. Retransmissão parcial: Se 100 de 1000 bytes foram perdidos, só estes 100 são retransmitidos (não o segmento todo).
  2. Combinar dados em novo segmento: O remetente pode agrupar bytes originalmente enviados em pacotes separados em um único reenvio, otimizando throughput.
  3. Ack seletivo: Combinado com SACK (Selective Acknowledgment, RFC 2018), permite confirmar blocos não contíguos de bytes recebidos.

3. Funções do Sequence Number

O número de sequência cumpre quatro papéis críticos na arquitetura TCP:

A. Identificação e Ordenação (Reordering)

Como a internet (IP) não garante a ordem de entrega, os pacotes podem chegar fora de ordem. O receptor usa o Sequence Number para saber onde encaixar os dados recebidos.

  • Se o receptor tem os bytes até o 2000 e recebe um pacote começando no 3000, ele sabe que existe uma lacuna (bytes 2001-2999). Ele guarda o pacote do 3000 em um buffer (Out-of-Order Buffer) e aguarda o pacote faltante chegar para remontar o fluxo na ordem correta.
  • Tamanho típico do buffer: 64 KB sem window scaling, até 1 GB com Window Scaling option (RFC 7323).

B. Detecção de Perdas (Loss Detection)

O mecanismo de ACK Cumulativo depende do Sequence Number. O receptor envia de volta um ACK Number que indica o próximo byte que espera.

  • Se o emissor enviou até o byte 5000, mas recebe um ACK dizendo "Esperando o byte 4001", ele sabe que tudo de 4001 a 5000 foi perdido ou está em trânsito. O número de sequência permite localizar exatamente onde o buraco está.
  • Retransmissão: Combinado com timers (RTO - Retransmission Timeout) ou detecção de 3 ACKs duplicados (Fast Retransmit, RFC 5681), o emissor reenvia os bytes não confirmados.

C. Eliminação de Duplicatas

Se a rede duplicar um pacote e o receptor receber o mesmo segmento duas vezes, ele usará o Sequence Number para verificar se já processou aqueles bytes. Se o número de sequência for menor ou igual ao último byte confirmado, o segmento é descartado como duplicata (mas um novo ACK é enviado para atualizar o estado do emissor).

D. Controle de Fluxo

A janela deslizante (Sliding Window) opera em bytes. O receptor anuncia quantos bytes a mais de espaço ele tem no buffer (campo Window). O cálculo é baseado no Sequence Number do último byte recebido com sucesso + window size = máximo Sequence Number que pode ser enviado.

4. O ISN (Initial Sequence Number) e a Segurança

Um detalhe técnico crucial é que o Sequence Number não começa em 0 ou 1 quando uma conexão é estabelecida.

Aleatoriedade (ISN)

Durante o Three-Way Handshake (SYN, SYN-ACK, ACK), ambos os lados escolhem um Número de Sequência Inicial (ISN) aleatório. Este valor deve ser gerado de forma criptograficamente segura e imprevisível.

  • Proteção contra Ataques: Se o ISN fosse sempre 0, um atacante poderia facilmente forjar pacotes TCP para injetar dados ou encerrar conexões (ataques de predição de sequência, como o famoso ataque de Kevin Mitnick em 1994 contra Tsutomu Shimomura).
  • Método moderno: Linux usa algoritmo baseado em hash MD5 do estado interno + timestamp + 4-tuple (IP/Porta origem e destino), definido em RFC 6528. A randomização garante que seja computacionalmente inviável adivinhar o ISN.
  • Sincronização: O ISN negociado no handshake é o ponto de partida. O primeiro byte de dados enviado após a conexão estabelecida terá o número ISN + 1 (porque o pacote SYN "consome" um número de sequência).

RFC 6528 - Randomização do ISN

A RFC 6528 (2012) estabelece que implementações TCP DEVEM gerar ISN de forma imprevisível, idealmente usando PRNG criptográfico (CSPRNG) seedado com entropia suficiente.

5. SYN Consumindo um Número de Sequência

Um comportamento não intuitivo do TCP é que o segmento SYN inicial (mesmo sem carregar dados) consome um número de sequência. Da mesma forma, o segmento FIN final também consome um.

Cliente → SYN (seq=1000)
Servidor → SYN+ACK (seq=5000, ack=1001)  ← Servidor espera próximo byte = 1001
Cliente → ACK (seq=1001, ack=5001)        ← Cliente confirma recebimento do SYN do servidor
Cliente → DADOS (seq=1001, payload=10 bytes)  ← Seq=1001, próximo byte esperado = 1011

Esse comportamento garante que o receptor saiba exatamente quantos bytes "lógicos" foram enviados, incluindo os "bytes fantasma" do SYN e do FIN.

6. Wrap Around (Retorno ao Zero)

Como o campo tem 32 bits, ele pode contar até aproximadamente 4,29 bilhões (2^32 = 4.294.967.296). Em links de alta velocidade, esse número pode ser esgotado em pouco tempo.

Tempo até Wrap Around

Velocidade do Link Tempo para Esgotar
1 Mbps ~9,5 horas
10 Mbps ~57 minutos
100 Mbps ~5,7 minutos
1 Gbps ~34 segundos
10 Gbps ~3,4 segundos
100 Gbps ~0,34 segundos
  • Ciclo: Quando o contador atinge o limite máximo (2^32 - 1), ele "volta" para zero e começa a contar novamente (Wrap Around), usando aritmética modular.
  • PAWS (Protect Against Wrapped Sequences): O TCP moderno utiliza uma opção chamada Timestamps (RFC 7323) para diferenciar pacotes antigos (da volta anterior) de pacotes novos, evitando confusão quando o número de sequência reseta. Cada segmento carrega dois timestamps (TSval e TSecr), permitindo ao receptor detectar segmentos "velhos" mesmo com Sequence Number coincidente.

7. Relação com o Campo de Dados

O cabeçalho TCP não tem um campo explícito de "tamanho dos dados". O receptor sabe onde os dados terminam calculando:

formula
$$\text{Fim dos Dados} = \text{Sequence Number} + \text{Tamanho do Payload} - 1$$

O tamanho do payload é derivado do campo Total Length do cabeçalho IP subtraindo o tamanho do cabeçalho IP e o tamanho do cabeçalho TCP (campo Data Offset × 4 bytes). Isso permite que o receptor saiba exatamente quais bytes aquele segmento específico contribui para o fluxo global.

8. Captura Prática e Inspeção

# Capturar TCP e mostrar números de sequência
tcpdump -n -i eth0 -S 'tcp and host 192.168.1.10'
# A flag -S mostra números absolutos (default mostra relativos)

# Exemplo de saída:
# IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [S], seq 1234567890, win 64240
# IP 192.168.1.1.80 > 192.168.1.10.54321: Flags [S.], seq 9876543210, ack 1234567891, win 65535
# IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [.], ack 9876543211, win 64240
# IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [P.], seq 1234567891:1234567991, ack 9876543211

A notação seq X:Y indica que o segmento contém bytes de X a Y-1 (tamanho = Y - X bytes).

Verificação de ISN Randomização

# Capturar múltiplos SYN e observar variabilidade
for i in 1 2 3 4 5; do
    nc -zv 192.168.1.1 80 2>&1 &
    tcpdump -n -c 1 -i lo 'tcp[tcpflags] & tcp-syn != 0 and src host 192.168.1.10' 2>&1 | grep -oP 'seq \d+'
done
# Sequências devem ser completamente imprevisíveis entre tentativas

9. RFCs de Referência

RFC Ano Conteúdo
RFC 793 1981 TCP original (define Sequence Number)
RFC 1323 1992 Window Scaling + Timestamps (PAWS)
RFC 2018 1996 SACK (Selective Acknowledgment)
RFC 5681 2009 Congestion Control (Fast Retransmit)
RFC 6528 2012 Randomização de ISN
RFC 7323 2014 Atualização de TCP Timestamps
RFC 9293 2022 TCP revisão consolidada

10. Conclusão

O campo Sequence Number é o coração do mecanismo de confiabilidade do TCP. Sua granularidade por byte (e não por pacote) permite que o TCP ofereça um serviço de entrega "byte perfeito" sobre uma camada de rede (IP) que não oferece garantias. Combinado com ISN aleatório (RFC 6528), Timestamps para PAWS (RFC 7323) e SACK (RFC 2018), o Sequence Number evoluiu ao longo das décadas para suportar desde conexões dial-up de 56 Kbps até backbones de 100+ Gbps, mantendo simultaneamente segurança, performance e confiabilidade. Para engenheiros de redes, dominar a interpretação de Sequence Numbers em capturas tcpdump/Wireshark é fundamental para diagnosticar desde retransmissões até predição de ISN em testes de penetração.