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:
-
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
SYNcomSeq = X, o servidor enviaAck = X + 1. -
Isso significa: “Recebi seu SYN (que ocupou o número
X). Estou aguardando o byteX + 1.”
3. Flags: -
SYN = 1: Indica que o servidor está propondo sua própria conexão. ACK = 1: Indica que o campoAcknowledgment Numberé válido.
- O servidor preenche este campo com o seu próprio ISN (Initial Sequence Number). Vamos chamar este valor de
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.
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 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.
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).