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

02 - SYN-ACK

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

SYN-ACK (Synchronize-Acknowledge)

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.

Essa dualidade é o que torna possível a montagem de uma conexão bidirecional confiável em apenas três mensagens — sem SYN-ACK, seriam necessários quatro passos: SYN, ACK, SYN, ACK.

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.

Tabela de Bits de Flags no SYN-ACK

Bit Flag Valor no SYN-ACK
0 CWR 0 (varia conforme congestão)
1 ECE 0 (varia conforme ECN)
2 URG 0
3 ACK 1
4 PSH 0
5 RST 0
6 SYN 1
7 FIN 0

O valor hexadecimal resultante no campo de flags é 0x12 (SYN=0x02, ACK=0x10, somados).

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.

Exemplo Numérico Completo

Considere:
- ISN do cliente: X = 1.000.000.000
- ISN do servidor: Y = 2.500.000.000

Passo Origem Flags Seq Ack
1 Cliente SYN 1.000.000.000 0
2 Servidor SYN-ACK 2.500.000.000 1.000.000.001
3 Cliente ACK 1.000.000.001 2.500.000.001

Após o passo 3, ambos os lados sabem exatamente qual byte cada um espera receber do outro.

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.

Máquina de Estados TCP (Resumo)

Cliente:                              Servidor:
CLOSED                                LISTEN
  | SYN enviado                         | SYN recebido
  v                                     v
SYN-SENT                              SYN-RECEIVED
  | SYN-ACK recebido, ACK enviado       | ACK recebido
  v                                     v
ESTABLISHED                           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.

Opções Comuns no SYN-ACK

Opção Tipo Função
MSS 2 (0x02) Tamanho máximo de segmento (server propõe o seu)
Window Scale 3 (0x03) Fator de escala da janela (0 a 14)
SACK Permitted 4 (0x04) Indica suporte a ACK seletivo
Timestamps 8 (0x08) Para cálculo de RTT e PAWS

Se o servidor não suportar uma opção, ele simplesmente a omite do SYN-ACK — e a conexão opera sem aquele recurso.

6. Timeout e Retransmissão

O SYN-ACK é armazenado no kernel do servidor aguardando o ACK final do cliente. Se esse ACK não chegar dentro de um tempo determinado (geralmente iniciando em 1 segundo, dobrando exponencialmente), o servidor retransmite o SYN-ACK:

  • 1ª retransmissão: +1s
  • 2ª retransmissão: +2s
  • 3ª retransmissão: +4s
  • ...
  • Após ~63 segundos sem resposta (Linux default), o estado SYN-RECEIVED expira e os recursos são liberados.

O número de retransmissões é controlado por tcp_synack_retries (Linux default = 5).

7. 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).

Tabela de Comportamentos do Servidor

Situação Resposta do Servidor
Porta aberta, processo escutando SYN-ACK
Porta fechada, sem firewall RST
Porta filtrada (DROP no firewall) Silêncio (cliente faz timeout)
Porta filtrada (REJECT no firewall) RST
Servidor sob SYN Flood SYN-ACK pode não ser enviado (SYN Cookies)

8. SYN-ACK no Wireshark

Em uma captura típica, o SYN-ACK aparece com filtro tcp.flags == 0x12:

Transmission Control Protocol, Src Port: 443, Dst Port: 54321, Seq: 0, Ack: 1
    Source Port: 443
    Destination Port: 54321
    Sequence number (relative): 0
    Sequence number (raw): 2821093324
    Acknowledgment number (relative): 1
    Header Length: 32 bytes (12 bytes options)
    Flags: 0x012 (SYN, ACK)
        .... .... ..1. .... = Syn: Set
        .... .... ...1 .... = Acknowledgment: Set
    Window: 64240
    Checksum: 0x4a7c
    Urgent Pointer: 0
    Options: (12 bytes), MSS, SACK, Window scale, Timestamps

9. Conclusão

O SYN-ACK é um dos pacotes mais elegantes do TCP: em uma única transmissão, ele cumpre o duplo papel de aceitar a conexão do cliente e estabelecer a conexão inversa. Essa eficiência de protocolo reduz para três o número de pacotes necessários para abrir um canal bidirecional confiável, economizando latência e largura de banda em bilhões de conexões estabelecidas diariamente na internet. Entender sua estrutura — flags, números de sequência, opções e estados — é essencial para qualquer analista de redes que precise diagnosticar problemas de estabelecimento de conexão, configurar firewalls ou investigar ataques como SYN Flood e hijacking de sessão TCP.