O three-way handshake (handshake de três vias) é o procedimento que o TCP usa para estabelecer uma conexão entre cliente e servidor. Em três mensagens (SYN, SYN+ACK e ACK) os dois lados confirmam que estão online, combinam os números de sequência iniciais e só então começam a trocar dados.
O que é o TCP
O TCP (Transmission Control Protocol) é um protocolo da camada de transporte orientado a conexão. Ele garante que os dados cheguem completos, sem erros e na ordem certa, usando números de sequência, confirmações (ACK), retransmissão e controle de fluxo.
Por isso é usado onde nenhum erro é aceitável: HTTP/HTTPS, FTP, SSH, e-mail. Em troca, é mais lento que o UDP, que não estabelece conexão nem confirma entregas.
Flags usadas no handshake
| Flag | Significado | Função |
|---|---|---|
SYN | Synchronize (sincronizar) | Inicia a conexão e informa o número de sequência inicial (ISN). |
ACK | Acknowledgement (reconhecimento) | Confirma o recebimento, indicando o próximo número esperado. |
FIN | Finish (finalizar) | Encerra a conexão de forma ordenada. |
RST | Reset | Derruba a conexão imediatamente (porta fechada, erro). |
Como funciona, passo a passo
- SYN: o cliente envia um segmento com a flag SYN ativa e o seu número de sequência inicial (por exemplo,
seq=100). - SYN + ACK: o servidor responde com SYN e ACK ativos: envia o seu próprio número (
seq=200) e confirma o do cliente (ack=101). - ACK: o cliente confirma o número do servidor (
seq=101,ack=201). A conexão passa a ESTABLISHED nos dois lados.
Cliente Servidor
| |
| ---- SYN seq=100 -------------> | (1) quero conectar
| |
| <--- SYN+ACK seq=200, ack=101 ---- | (2) ok, também quero
| |
| ---- ACK seq=101, ack=201 ----> | (3) combinado
| |
| ========= conexão ESTABLISHED ======== |
| ---- dados ---------------------------> |
Em linguagem simples: "Posso falar com você? Começo na mensagem 100" → "Pode. Começo na 200 e espero a sua 101" → "Beleza, espero a sua 201".
Estados do TCP durante o handshake
| Lado | Antes | Depois de enviar/receber |
|---|---|---|
| Servidor | LISTEN (aguardando) | Recebe SYN → SYN-RECEIVED → recebe ACK → ESTABLISHED |
| Cliente | CLOSED | Envia SYN → SYN-SENT → recebe SYN+ACK e envia ACK → ESTABLISHED |
Por que são três passos e não dois?
Cada lado precisa escolher o seu número de sequência e ter a confirmação do outro. Com dois passos, o servidor nunca saberia se o cliente recebeu o seu número. O terceiro passo também evita que SYNs antigos e duplicados, perdidos na rede, abram conexões fantasmas.
Como ver o handshake na prática
Capture o tráfego com o tcpdump (Linux) ou o Wireshark e filtre pela porta desejada:
sudo tcpdump -nn -i any 'tcp port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'
No Wireshark, use o filtro tcp.flags.syn == 1 e acompanhe os três primeiros pacotes de uma conexão. Para listar o estado das conexões locais:
ss -tan state established
ss -tan state syn-sent
SYN Flood: o ataque ao handshake
No SYN flood (DoS), o atacante envia muitos SYNs, geralmente com IP falsificado, e nunca completa o terceiro passo. O servidor fica com milhares de conexões "meio abertas" em SYN-RECEIVED e esgota a fila de conexões. As defesas mais comuns são os SYN cookies, a redução do tempo de espera, limites de taxa e firewalls/CDN com mitigação.
# Linux: habilitar SYN cookies
sudo sysctl -w net.ipv4.tcp_syncookies=1
E o encerramento da conexão?
Para fechar, o TCP usa o four-way handshake (FIN, ACK, FIN, ACK), porque cada sentido da conexão é encerrado separadamente.
Resumo
- O handshake de três vias estabelece conexões TCP:
SYN→SYN+ACK→ACK. - Serve para sincronizar os números de sequência e confirmar que ambos os lados estão prontos.
- Fica visível em ferramentas como Wireshark, tcpdump e ss.
- É alvo de ataques SYN flood, mitigados com SYN cookies e limites de taxa.
