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

01 - Garante Sequência e Entrega

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

Diferente da camada de Rede (IP), onde cada pacote é tratado de forma isolada e pode chegar fora de ordem ou até ser perdido, o TCP garante que o fluxo de dados seja entregue à aplicação exatamente como foi enviado.

1. O Número de Sequência (Sequence Number)

O segredo por trás da ordenação é o campo Sequence Number no cabeçalho do segmento:
- Cada byte enviado recebe um número sequencial exclusivo.
- O emissor informa o número do Primeiro Byte contido naquele segmento.
- O receptor usa esse número para colocar os segmentos na ordem correta, mesmo que eles cheguem embaralhados pela Internet.

ISN (Initial Sequence Number)

O número de sequência não começa em 0 ou 1. Cada conexão sorteia um ISN aleatório de 32 bits para dificultar ataques de TCP Sequence Prediction. O algoritmo tradicional baseia-se em um contador incrementado a cada 4 microssegundos (RFC 793), mas sistemas modernos (Linux, Windows) usam hashes criptográficos misturados com IPs e portas para garantir imprevisibilidade.

2. Acknowledgment (ACK) Cumulativo

O TCP usa ACK cumulativo: o campo Acknowledgment Number informa o próximo byte esperado, indicando implicitamente que todos os bytes anteriores foram recebidos. Se o emissor enviou os bytes 1-1000 e 1001-2000, e o receptor manda ACK = 2001, está dizendo "recebi tudo até o byte 2000, quero o 2001".

Regra do Delayed ACK

Para não saturar a rede com ACKs, o receptor pode atrasar a confirmação em até 200 ms ou até que acumule 2 segmentos recebidos (RFC 1122). Isso melhora a eficiência, mas pode aumentar a latência.

3. Remontagem do Fluxo (Reassembly)

Quando os pacotes chegam ao destino:
1. O Receptor coloca os segmentos recebidos em um Buffer de Recepção.
2. O Receptor verifica se há "buracos" (segmentos que ainda não chegaram).
3. Se um segmento chega fora de ordem (ex: recebeu o Segmento 3 antes do 2), ele o guarda no buffer mas não o entrega imediatamente à aplicação.
4. Quando o Segmento 2 chega (o "elo perdido"), o TCP remonta o fluxo e entrega os Segmentos 2 e 3 de uma só vez para a Aplicação.

O tamanho do buffer de recepção é anunciado no campo Window Size. Em Linux o padrão é ~64 KB, mas com Window Scale pode chegar a 1 GB.

4. Detecção e Filtro de Duplicatas

Graças ao número de sequência, o receptor consegue identificar facilmente se um segmento já foi recebido anteriormente (ex: devido a uma retransmissão desnecessária):
- O receptor simplesmente descarta o segmento duplicado e envia um ACK informando que já possui os dados.
- Duplicatas ocorrem com frequência quando o RTO (Retransmission Timeout) está mal calibrado e o ACK original ainda estava em trânsito.

5. Timeout e RTO

Cada segmento enviado (e ainda não confirmado) é armazenado em uma retransmission queue com um temporizador. Se o temporizador expira antes de chegar o ACK, o segmento é retransmitido.

Cálculo do RTT e SRTT

O RTT (Round-Trip Time) é o tempo entre o envio de um segmento e a chegada do seu ACK. Como o RTT varia com a congestão, o TCP mantém uma média ponderada exponencial chamada SRTT (Smoothed RTT):

SRTT = (1 - α) * SRTT + α * RTT_novo     (α típico = 0,125)
RTTVAR = (1 - β) * RTTVAR + β * |SRTT - RTT_novo|   (β = 0,25)
RTO = SRTT + max(G, 4 * RTTVAR)

Onde G é o clock granularity (tipicamente 1 tick de kernel). O RTO resultante deve ser ≥ 1 segundo e ≤ 60 segundos (RFC 6298).

6. Algoritmo de Karn

O Algoritmo de Karn resolve o problema de medir RTT em retransmissões: se o emissor retransmitiu um segmento, não sabe se o ACK que chegou corresponde ao segmento original ou ao retransmitido (retransmission ambiguity). Regras:

  1. Não usar o RTT medido de segmentos retransmitidos para recalcular o SRTT.
  2. Aplicar exponential backoff: cada retransmissão duplica o RTO, até um limite de 60 s. O RTO só volta ao valor normal após um ACK bem-sucedido de um segmento não retransmitido.

7. Duplicate ACKs e Fast Retransmit

Esperar o timeout (RTO) é lento — em redes de alta latência, pode significar segundos. Para acelerar a recuperação, o TCP usa Duplicate ACKs:

  • Sempre que recebe um segmento fora de ordem, o receptor reenvia o mesmo ACK cumulativo.
  • O emissor interpreta 3 ACKs duplicados consecutivos como forte indicativo de perda, retransmitindo o segmento faltante antes do timeout expirar (mecanismo Fast Retransmit, RFC 5681).
  • Após o Fast Retransmit, o TCP entra em Fast Recovery (congestion control) ao invés de Slow Start.

8. Selective Acknowledgment (SACK)

O ACK cumulativo tem um problema: se segmentos 1, 3 e 5 chegam mas o 2 e o 4 se perdem, o receptor só pode ACKar até o 1. O emissor teria que retransmitir 2, 3, 4 e 5.

A opção SACK (RFC 2018) permite ao receptor informar explicitamente quais blocos não contíguos já recebeu (blocks: 1001-2000, 3001-4000). O emissor então retransmite apenas o que falta (2 e 4), economizando banda. Habilitado por padrão em Linux desde kernel 2.6.

9. Detecção de Perda por RST

Algumas situações de erro não envolvem perda, mas descarte explícito:
- Se um segmento chega para uma porta sem socket aberto, o receptor envia RST, encerrando a conexão imediatamente.
- Se um segmento chega com seq number totalmente fora da janela esperada, é descartado silenciosamente (ou ACKado para re-sincronizar).

10. Exemplo Prático de Recuperação

Considere uma transferência de 4 segmentos onde o segmento 2 se perde:

Emissor  →  Seg 1 (seq=1)      Receptor
Emissor  →  Seg 2 (seq=1001)   [PERDIDO]
Emissor  →  Seg 3 (seq=2001)    Receptor (fora de ordem, buffer)
         ←  ACK 1001 (dup ACK 1)
Emissor  →  Seg 4 (seq=3001)    Receptor (fora de ordem, buffer)
         ←  ACK 1001 (dup ACK 2)
         ←  ACK 1001 (dup ACK 3) →  Fast Retransmit!
Emissor  →  Seg 2 (seq=1001)    Receptor (retransmissão)
         ←  ACK 4001 (ack cumulativo confirma tudo)

Note que o receptor envia ACKs duplicados com o mesmo número (1001) a cada segmento fora de ordem recebido. Após 3 duplicatas, o emissor retransmite sem esperar o timeout.

11. Estado da Fila de Retransmissão

Cada segmento enviado e ainda não confirmado fica armazenado na retransmission queue do kernel. Em Linux:

# Ver sockets TCP com dados em fila de retransmissão
ss -tin | grep -E 'bytes_retrans'

# Ver estatísticas de retransmissão por interface
nstat -az TcpRetransSegs

# Ajustar RTO mínimo (ms) — útil em redes de baixa latência
echo 200 > /proc/sys/net/ipv4/tcp_min_rto

12. Resumo dos Mecanismos de Garantia

Mecanismo Função
Sequence Number Identificação única de cada byte
ACK cumulativo Confirmação implícita de todos os bytes anteriores
ISN aleatório Segurança contra TCP Sequence Prediction
Retransmission Timeout (RTO) Detecção de perda por tempo
SRTT / RTTVAR Estimativa adaptativa de RTT
Algoritmo de Karn Trata ambiguidade de retransmissão
Duplicate ACKs Detecção rápida de perda
Fast Retransmit Recuperação sem esperar timeout
Fast Recovery Reajusta cwnd sem voltar a Slow Start
SACK Retransmissão seletiva de blocos perdidos
Reassembly buffer Reordenação de segmentos fora de ordem
Detecção de duplicatas Descarte de segmentos já recebidos

Tip

Em auditorias de segurança de Cyber, atacantes podem tentar prever o número de sequência de uma conexão para realizar o ataque de TCP Sequence Prediction, o que permitiria a injeção de pacotes maliciosos na sessão do usuário. Sistemas modernos usam números de sequência iniciais (ISN) aleatórios para dificultar esse tipo de ataque.