02 - ACK Number
video: https://youtu.be/... no frontmatter da nota.Campo ACK Number (Acknowledgment Number) do Cabeçalho TCP
1. Definição e Localização
O campo ACK Number (Acknowledgment Number) é um campo de 32 bits localizado no cabeçalho TCP, especificamente nos bytes 9 a 12 (após o campo Sequence Number). Ele funciona como o mecanismo de feedback do receptor para o remetente, informando quais dados foram recebidos com sucesso.
Juntamente com o Sequence Number, o ACK Number forma o coração do sistema de confiabilidade do TCP. Enquanto o Sequence Number diz "de onde vêm estes dados", o ACK Number diz "estou pronto para o que vem depois". Essa troca constante permite que o TCP saiba o que foi entregue e o que precisa ser reenviado.
Características Formais
- Tamanho: 32 bits (4 bytes)
- Posição no cabeçalho: Bytes 9-12 (offset 8-11)
- Endianness: Big-endian (network byte order)
- Faixa: 0 a 4.294.967.295 (232 - 1)
- RFC de referência: RFC 793 (1981)
2. O Conceito de Confirmação Cumulativa
A característica mais importante do ACK Number é que ele é cumulativo. Ele não confirma apenas o último segmento recebido, mas sim todos os bytes anteriores a ele.
Semântica
O valor ACK N significa: "Recebi com sucesso e processei todos os bytes até o número N-1. Agora estou aguardando o byte N."
Eficiência
Isso permite que um único ACK confirme o recebimento de múltiplos segmentos de uma só vez. Se o remetente enviou 4 segmentos cobrindo os bytes 1000 a 1999, e todos chegaram, o receptor pode enviar um único ACK 2000. Isso confirma que tudo (1000 a 1999) chegou bem.
Contraste com ACK Seletivo (SACK)
O TCP padrão usa ACK cumulativo. Embora existam opções para "ACK Seletivo" (SACK - Selective Acknowledgment, RFC 2018) que informam lacunas específicas, o campo ACK Number principal sempre aponta para o próximo byte esperado na sequência contínua.
| Modo | Vantagem | Desvantagem |
|---|---|---|
| Cumulativo (padrão) | Simples, um número basta | Ineficiente em perdas múltiplas |
| Seletivo (SACK) | Detalha gaps exatos | Exige opção extra no cabeçalho |
3. Como Funciona na Prática
O ACK Number é sempre relativo ao fluxo de bytes enviado pelo outro lado.
No Receptor
- O receptor recebe o byte
1500. - Ele verifica se
1500é o próximo byte esperado (ou seja, se ele já recebeu tudo até1499). - Se sim, ele envia um segmento de retorno com
ACK Number = 1501(próximo byte esperado).
No Emissor
- O emissor recebe o segmento com
ACK 1501. - Ele olha para seu buffer de envio.
- Ele sabe que todos os bytes menores que 1501 estão seguros e podem ser descartados do buffer de retransmissão.
- Ele sabe que precisa se preocupar apenas com os bytes a partir de 1501.
Exemplo Numérico Detalhado
Tempo Emissor Receptor ACK enviado
T1 envia seq=1000, len=500 --
T2 -- recebe 1000 ACK 1500
T3 recebe ACK 1500 -- --
T4 envia seq=1500, len=500 --
T5 -- recebe 1500 ACK 2000
T6 recebe ACK 2000 -- --
4. Detecção de Perdas (Gaps)
O poder do ACK Number reside em sua capacidade de revelar "buracos" no fluxo de dados sem que o receptor precise explicitamente gritar "perdi o pacote X".
Cenário de Perda
- Emissor envia byte 1000.
- Emissor envia byte 1100.
- O byte 1100 chega, mas o byte 1000 se perde.
Reação do Receptor
- O receptor recebe o 1100, mas não pode entregá-lo à aplicação porque falta o 1000. Ele guarda o 1100 no buffer fora de ordem.
- Ele envia de volta um
ACK Number = 1000. (Dizendo: "Ainda estou esperando o 1000, não avance").
Reação do Emissor
- O emissor vê o
ACK 1000repetido (ACK Duplicado). - Como ele já havia enviado dados além do 1000, ele deduz: "Enviei até o 1100, mas o receptor ainda está pedindo o 1000. O 1000 deve estar perdido."
- Isso dispara a Retransmissão Rápida (Fast Retransmit) quando 3 ACKs duplicados são recebidos.
5. ACKs Duplicados e Fast Retransmit
| Conceito | Significado |
|---|---|
| ACK normal | ACK com número maior que o anterior |
| ACK duplicado | Mesmo ACK Number do segmento anterior |
| 3 ACKs duplicados | Trigger para Fast Retransmit |
Quando 3 ACKs duplicados são recebidos, o TCP não espera o timer de retransmissão (RTO) expirar — ele retransmite imediatamente, reduzindo significativamente a latência percebida em perdas isoladas.
6. O Bit de Flag ACK
No cabeçalho TCP, existe uma flag dedicada chamada ACK no campo de Flags (offset 4, byte 14). Esta flag deve estar setada (ligada) com valor 1 para que o campo ACK Number seja válido.
Durante o Handshake
No estabelecimento da conexão, as mensagens iniciais (SYN e SYN-ACK) usam a flag ACK para reconhecer o recebimento do SYN do outro lado. Nesse momento, o ACK Number confirma o número de sequência inicial (ISN) + 1.
Cliente -> SYN, Seq=1000 (SYN flag)
Servidor -> SYN+ACK, Seq=3000, ACK=1001 (ACK flag ligada)
Cliente -> ACK, Seq=1001, ACK=3001 (ACK flag ligada)
Durante a Transferência de Dados
Em quase todos os segmentos após a conexão estabelecida, a flag ACK está ligada. O TCP raramente envia dados sem confirmar o recebimento de dados anteriores (piggybacking).
7. Relação com a Janela Deslizante
O ACK Number trabalha em conjunto com o campo Window Size para controlar o fluxo.
- O
ACK Numberdiz ao emissor: "Você pode descartar tudo antes desse número, é meu." - O
Window Sizediz: "Você pode enviar mais X bytes além desse número."
Juntos, eles definem a janela de envio atual:
Janela de Envio = [ACK Number, ACK Number + Window Size]
Diagrama de Janela
Bytes enviados e confirmados | Bytes enviados, não confirmados | Bytes que pode enviar | Não pode enviar
[0 .. ACK-1] | [ACK .. ACK+window-1] | próximos | ...
8. Cálculo do Próximo ACK
A regra geral é:
ACK Number = Maior byte recebido em sequência + 1
Ou equivalentemente:
ACK Number = Seq Number do último segmento recebido em ordem + Length do payload
Casos Especiais
| Situação | Comportamento |
|---|---|
| Segmento recebido em ordem | ACK avança |
| Segmento fora de ordem | ACK repete (duplicado) |
| Segmento com payload vazio | ACK = Seq + 1 (consome SYN/FIN) |
| Flags SYN ou FIN | Consomem 1 número de sequência cada |
9. Wrapping do ACK Number
Como o campo tem 32 bits, ele "wraps" (volta a zero) após 4.294.967.295 bytes (≈ 4 GB). Em links de alta velocidade (10 Gbps), isso ocorre em segundos. Para evitar ambiguidade, o TCP usa timestamps (opção RFC 1323) para distinguir números antigos de novos após o wrap.
10. Detecção de Problemas
Delayed ACK
Para reduzir tráfego, o TCP não envia ACK imediato para cada segmento. Ele "atrasa" o ACK por até 200ms, na esperança de ter dados para enviar de volta (piggybacking). Se nada for enviado nesse intervalo, um ACK standalone é enviado.
Problemas com ACKs Falsos
Atacantes podem forjar ACKs para confundir o emissor. Para evitar isso:
- Authentication: TCP-AO (RFC 5925) adiciona autenticação.
- State tracking: Roteadores stateful descartam ACKs para conexões inexistentes.
- Sequence validation: Receptor só aceita ACKs dentro da janela válida.
11. Resumo Técnico
| Atributo | Valor |
|---|---|
| Tamanho do campo | 32 bits |
| Posição | Bytes 9-12 do cabeçalho TCP |
| Semântica | Próximo byte esperado |
| Tipo de ACK | Cumulativo (padrão) |
| Variação | SACK (RFC 2018) |
| Flag associada | ACK bit |
| Endianness | Big-endian |
12. Conclusão
O ACK Number é o sinal de "vida" da conexão do ponto de vista do emissor. Sem ele, o remetente estaria voando às cegas, sem saber se seus dados estão sendo úteis ou se estão se perdendo no vácuo da rede. Ao confirmar cumulativamente o recebimento até um certo ponto, o ACK Number permite que o TCP descarte com segurança o que já foi entregue e foque seus esforços de retransmissão apenas no que ainda está faltando. Para engenheiros de rede e desenvolvedores de protocolos, entender o comportamento do ACK Number é essencial para diagnosticar problemas de throughput, retransmissões e otimizar parâmetros comoDelayed ACK, SACK e Window Scaling.