02 - SYN-ACK
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:
- 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."
- O servidor preenche este campo com o seu próprio ISN (Initial Sequence Number). Vamos chamar este valor de
- Acknowledgment Number (Número de Confirmação):
- O servidor preenche este campo com o ISN do cliente + 1.
- Se o cliente enviou
SYNcomSeq = X, o servidor enviaAck = X + 1. - Isso significa: "Recebi seu SYN (que ocupou o número
X). Estou aguardando o byteX + 1."
- Flags:
SYN = 1: Indica que o servidor está propondo sua própria conexão.ACK = 1: Indica que o campoAcknowledgment 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):
- Cliente -> Servidor:
SYN,Seq = X,Ack = 0. - Servidor -> Cliente:
SYN-ACK,Seq = Y,Ack = X + 1. - 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 confirmandoMSSde 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.