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

03 - ACK

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

ACK (Acknowledgment)

ACK é o nome da flag (bit 4) e do mecanismo de confirmação utilizado pelo protocolo TCP para garantir a confiabilidade da comunicação. A sigla significa Acknowledgment (Confirmação ou Reconhecimento). A função do ACK é informar ao remetente que os dados enviados foram recebidos com sucesso pelo receptor.

Enquanto as flags SYN e FIN são usadas para gerenciar o início e o fim da conexão, a flag ACK é usada continuamente durante toda a duração da transferência de dados para controlar o fluxo e a recuperação de erros.

1. A Flag ACK no Cabeçalho

No cabeçalho TCP, existe um bit específico reservado para o controle de confirmação:

  • Bit 4 (ACK):
  • ACK = 0: O campo Acknowledgment Number no cabeçalho é inválido e deve ser ignorado. Isso ocorre apenas no primeiro segmento enviado pelo cliente (o SYN inicial).
  • ACK = 1: O campo Acknowledgment Number é válido. Isso indica que o segmento está confirmando o recebimento de dados. Exceto pelo primeiro SYN, todos os segmentos TCP devem ter essa flag ligada.

2. O Campo ACK Number (Número de Confirmação)

A presença da flag ACK valida o uso do campo ACK Number (32 bits). Este número contém a informação crítica de feedback.

  • Significado Cumulativo: O ACK Number indica o próximo byte que o receptor espera receber.
  • Enviar ACK 1001 significa: "Recebi com sucesso todos os bytes até o 1000. Agora estou aguardando o byte 1001."
  • Eficiência: Como é cumulativo, um único ACK pode confirmar o recebimento de vários segmentos de dados de uma só vez. Se o emissor enviou bytes de 1000 a 5000 e todos chegaram, o receptor pode enviar um único ACK 5001 confirmando tudo.

3. O ACK no Estabelecimento de Conexão

A flag ACK desempenha um papel vital nas três fases do handshake, mas com significados ligeiramente diferentes em cada uma:

  1. SYN (Cliente): ACK = 0. O cliente ainda não tem nada para confirmar, pois a conexão não existe.
  2. SYN-ACK (Servidor): ACK = 1. O servidor usa o ACK para confirmar que recebeu o número de sequência inicial (ISN) do cliente. Se o cliente mandou SYN (Seq=100), o servidor responde com ACK 101.
  3. ACK (Cliente): ACK = 1. O cliente confirma que recebeu o ISN do servidor. Isso finaliza o handshake e sincroniza a conexão.

4. O ACK durante a Transferência de Dados (Piggybacking)

Durante o envio de dados, o ACK é frequentemente combinado com os dados sendo enviados na direção oposta. Isso é chamado de Piggybacking (carona).

  • Cenário: Você está baixando um arquivo (Cliente recebe dados do Servidor). Ao mesmo tempo, você está enviando comandos (Cliente envia dados para o Servidor).
  • Ação: Quando o cliente envia seus dados, ele inclui no cabeçalho TCP o ACK Number confirmando o recebimento do arquivo.
  • Benefício: Isso evita o envio de pacotes separados apenas para confirmação, economizando largura de banda e reduzindo a latência.

5. ACK e a Detecção de Perdas

O comportamento do ACK é a principal ferramenta que o TCP usa para detectar que algo deu errado (perda de pacotes).

  • ACK Duplicado (Duplicate ACK):
  • Se o emissor enviou o Byte 1, Byte 2 e Byte 3.
  • O receptor recebe o 1 e o 3, mas o 2 se perde.
  • O receptor envia ACK 1 (estou esperando 1).
  • Quando o 3 chega, o receptor guarda o 3 no buffer, mas não pode entregar à aplicação porque falta o 2. Ele envia novamente ACK 1.
  • O emissor recebe ACK 1 duas vezes. Ele deduz: "O receptor está insistindo no 1, isso significa que o 2 se perdeu." Isso dispara a Retransmissão Rápida.
  • Timeout (Tempo Esgotado):
  • O emissor envia dados e inicia um temporizador.
  • Se o temporizador expirar antes de receber um ACK atualizado, o emissor assume que o pacote se perdeu e o reenvia.

6. O ACK de 1 Byte

Em conexões interativas (como SSH ou Telnet), onde o usuário digita caractere por caractere, pode ocorrer um fenômeno chamado "ACK de 1 Byte".

  • O servidor envia 1 byte (o caractere 'A').
  • O cliente envia de volta um segmento apenas com ACK (sem dados) confirmando esse byte.
  • Isso significa que, para cada byte de dado, há um pacote de confirmação viajando na direção oposta. Embora pareça ineficiente, é necessário para garantir a confiabilidade em links lentos ou interativos.

O algoritmo Nagle (RFC 896) foi criado para mitigar esse problema: ele agrupa pequenos dados em um único segmento enquanto aguarda ACK pendente, reduzindo o overhead na rede.

7. Tipos de ACK no TCP Moderno

Tipo de ACK RFC Função
ACK Cumulativo RFC 793 Confirma todos os bytes até o número indicado
SACK (Selective ACK) RFC 2018 Informa blocos específicos já recebidos fora de ordem
DSACK (Duplicate SACK) RFC 2883 Informa duplicatas recebidas, melhorando RTT
Timestamps (RTTM) RFC 7323 Estima RTT preciso para cálculo de RTO
ACK Delayed RFC 1122 Atraso de até 200 ms para aguardar dados para piggyback

8. Atraso de ACK (Delayed ACK)

Para reduzir o número de pacotes na rede, o TCP moderno implementa o Delayed ACK:

  • Ao receber dados, o receptor não envia o ACK imediatamente.
  • Ele aguarda até 200 ms ou até que tenha dados próprios para enviar (piggyback).
  • Se novos dados chegarem antes desse prazo, um único ACK confirma os dois.
  • Vantagem: reduz pela metade o número de ACKs em fluxos bidirecionais.
  • Desvantagem: pode aumentar a latência percebida em fluxos não interativos.

9. Exemplo de Captura (tcpdump/wireshark)

No.  Time     Source         Destination    Protocol  Info
1    0.000    192.168.1.10   192.168.1.1    TCP       54321 > 80 [SYN] Seq=0 Win=65535 Len=0
2    0.001    192.168.1.1    192.168.1.10   TCP       80 > 54321 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0
3    0.002    192.168.1.10   192.168.1.1    TCP       54321 > 80 [ACK] Seq=1 Ack=1 Win=65535 Len=0
4    0.005    192.168.1.10   192.168.1.1    HTTP       GET / HTTP/1.1
5    0.010    192.168.1.1    192.168.1.10   TCP       80 > 54321 [ACK] Seq=1 Ack=200 Win=65535 Len=0

Note que no segmento 2 (SYN-ACK) o Ack=1 confirma o SYN do cliente, e no segmento 5 o Ack=200 confirma o recebimento da requisição HTTP completa.

10. Considerações sobre Performance e Tuning

Otimizar o comportamento do ACK é decisivo para throughput em redes de longa distância (LFN - Long Fat Networks). Em links de 10 Gbps com 100 ms de RTT, o produto banda x atraso (BDP) é de aproximadamente 125 MB, o que exige janelas TCP grandes e estratégia inteligente de ACK para evitar saturação da CPU do receptor com processamento de confirmações.

Recomendações práticas para tuning:

Parâmetro Valor Linux Justificativa
net.ipv4.tcp_sack 1 Habilita SACK para retransmissão seletiva
net.ipv4.tcp_dsack 1 Habilita DSACK para diagnóstico de duplicatas
net.ipv4.tcp_timestamps 1 RTT preciso para cálculo de RTO
net.ipv4.tcp_low_latency 0 Default moderno; melhora throughput
net.ipv4.tcp_quickack 1 Reduz delayed ACK em ambientes interativos
net.ipv4.tcp_ecn 1 Notificação explícita de congestionamento
net.ipv4.tcp_window_scaling 1 Permite janelas acima de 64 KB

Em servidores de alto volume (CDNs, data centers), o uso de ACK coalescing via hardware (NIC com offload de LRO/GRO) reduz ainda mais a CPU necessária para processar milhares de confirmações por segundo, tornando o TCP viável mesmo em links de 100 Gbps.

11. Conclusão

A flag ACK é o coração da confiabilidade do TCP. Sem ela, o emissor não teria como saber se os dados chegaram intactos, transformando o protocolo em mero "fire-and-forget" equivalente ao UDP. Combinada com temporizadores, números de sequência e janelas deslizantes, a flag ACK constrói o serviço confiável que sustenta a maioria das aplicações da internet, desde navegação web até transferências bancárias. O estudo detalhado do seu comportamento é indispensável para diagnóstico de problemas de rede, análise de performance e tuning de pilhas TCP em sistemas de alta carga.