01 - Garante Sequência e Entrega
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:
- Não usar o RTT medido de segmentos retransmitidos para recalcular o SRTT.
- 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 |
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.