03 - ACK
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 Numberno 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 Numberindica o próximo byte que o receptor espera receber. - Enviar
ACK 1001significa: "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
5001confirmando 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:
- SYN (Cliente):
ACK = 0. O cliente ainda não tem nada para confirmar, pois a conexão não existe. - 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 mandouSYN (Seq=100), o servidor responde comACK 101. - 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 Numberconfirmando 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 1duas 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
ACKatualizado, 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.