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.