SYN-ACK é o nome dado ao segundo segmento TCP enviado durante o Three-Way Handshake (Aperto de Mão de Três Vias). Ele é enviado pelo Servidor em resposta ao segmento inicial SYN enviado pelo Cliente.

A denominação “SYN-ACK” deriva do fato de que este segmento possui duas flags de controle ativadas simultaneamente no cabeçalho: a flag SYN (Synchronize) e a flag ACK (Acknowledgment). É essa combinação que permite ao servidor aceitar a conexão do cliente e iniciar a conexão inversa em um único pacote.

1. A Dupla Natureza do Segmento

O poder do segmento SYN-ACK reside na sua capacidade de realizar duas tarefas lógicas ao mesmo tempo, aproveitando o modelo Full-Duplex (comunicação bidirecional) do TCP:

  • Parte ACK (A Função de Aceitação): O servidor confirma que recebeu a solicitação de conexão do cliente. Isso valida o Número de Sequência Inicial (ISN) do cliente.
  • Parte SYN (A Função de Sincronização Inversa): O servidor também quer abrir um canal de comunicação para enviar dados de volta para o cliente. Ele propõe seu próprio Número de Sequência Inicial independente.

2. Os Campos Técnicos do Cabeçalho

Para entender o SYN-ACK, é preciso analisar os três campos numéricos críticos do cabeçalho neste momento:

  1. Sequence Number (Número de Sequência):

    • O servidor preenche este campo com o seu próprio ISN (Initial Sequence Number). Vamos chamar este valor de Y.
    • Isso informa ao cliente: “Quando eu começo a enviar dados para você, o primeiro byte será o número Y.”
      2. Acknowledgment Number (Número de Confirmação):

    • O servidor preenche este campo com o ISN do cliente + 1.

    • Se o cliente enviou SYN com Seq = X, o servidor envia Ack = X + 1.
    • Isso significa: “Recebi seu SYN (que ocupou o número X). Estou aguardando o byte X + 1.”
      3. Flags:

    • SYN = 1: Indica que o servidor está propondo sua própria conexão.

    • ACK = 1: Indica que o campo Acknowledgment Number é válido.

3. O Fluxo Lógico

Vamos visualizar a troca de números (assumindo ISN do Cliente = X e ISN do Servidor = Y):

  1. **Cliente

    Servidor: SYN, Seq = X, Ack = 0.
    2.
    Servidor

    Cliente: SYN-ACK, Seq = Y, Ack = X + 1.
    3.
    Cliente

    Servidor:** ACK, Seq = X + 1, Ack = Y + 1.

Note que o SYN-ACK responde à tentativa de conexão do cliente enquanto simultaneamente inicia a comunicação no sentido inverso. Sem essa flag SYN extra, o servidor precisaria enviar um ACK puro primeiro e esperar o cliente enviar um SYN depois, tornando o handshake de três vias em quatro vias, o que seria ineficiente.

4. Mudança de Estado no Servidor

O envio do SYN-ACK marca uma transição crítica no estado da conexão no lado do servidor:

  • Estado Anterior (LISTEN): O socket estava passivamente aguardando conexões.
  • Ação: O servidor recebe o SYN, aloca recursos (buffer, TCB) e envia o SYN-ACK.
  • Estado Posterior (SYN-RECEIVED): O servidor agora entrou no estado SYN-RECEIVED. Ele está “metade conectado”. Ele enviou a proposta e está aguardando a confirmação final do cliente (o terceiro passo do handshake) para mover para o estado ESTABLISHED.

5. Negociação de Opções (TCP Options)

O segmento SYN-ACK é o veículo para o servidor concordar ou negociar parâmetros de desempenho propostos pelo cliente no primeiro SYN.

  • Se o cliente enviou MSS (Maximum Segment Size) de 1460 bytes, o servidor pode responder no SYN-ACK confirmando MSS de 1460 ou propondo um valor menor se sua rede tiver limitações.
  • Negociação de Window Scaling (Escala de Janela) e SACK (Selective Acknowledgment) também ocorrem através das opções no cabeçalho SYN-ACK.

6. Caso de Falha: RST (Rejeição)

Se o servidor não puder ou não quiser aceitar a conexão (por exemplo, o processo não está escutando na porta ou um firewall bloqueia), ele não enviará um SYN-ACK.

Em vez disso, ele enviará um segmento com a flag RST (Reset) ativada.

  • RST: “Conexão recusada”. Isso encerra o handshake imediatamente. O cliente receberá um erro de “Connection Refused” (Conexão recusada).