04 - Three-Way Handshake
video: https://youtu.be/... no frontmatter da nota.Three-Way Handshake (Aperto de Mão de Três Vias)
O Three-Way Handshake é o procedimento de 3 passos padronizado pelo protocolo TCP para estabelecer uma conexão lógica confiável entre um cliente e um servidor antes da transferência de dados. Ele é o mecanismo que transforma a rede "sem conexão" (IP) em um "circuito virtual" (TCP).
O termo "Três Vias" refere-se à troca de três mensagens específicas: SYN, SYN-ACK, e ACK. Esse processo é essencial para sincronizar os números de sequência iniciais (ISN) de ambos os lados e confirmar que ambos os lados estão prontos para receber dados.
1. O Fluxo das Três Mensagens
Para ilustrar, assumimos que o Cliente quer se conectar ao Servidor na porta 443.
Passo 1: SYN (Sincronização do Cliente)
O Cliente ativo inicia o processo enviando um segmento TCP com a flag SYN (Synchronize) ativada.
- Flags:
SYN = 1,ACK = 0. - Sequence Number: O cliente escolhe um número de sequência inicial aleatório, chamado ISN (Initial Sequence Number). Vamos chamá-lo de
X. - Payload: Vazio (0 bytes de dados). O cabeçalho TCP ocupa 20 bytes (sem opções).
- Objetivo: O cliente diz: "Olá, quero me conectar. Vou começar a contar meus bytes a partir do número
X." - Estado do Cliente: O cliente passa para o estado SYN-SENT.
Passo 2: SYN-ACK (Sincronização e Confirmação do Servidor)
O Servidor recebe o SYN. Se houver um processo escutando na porta de destino, o servidor aceita a conexão e responde. Esta resposta é um segmento com duas flags ativadas.
- Flags:
SYN = 1,ACK = 1. - Sequence Number: O servidor escolhe seu próprio ISN aleatório. Vamos chamá-lo de
Y. - Acknowledgment Number: O servidor confirma o ISN do cliente definindo o ACK como
X + 1. Isso significa: "Recebi seu SYN (byteX). Aguardo o byteX+1". - Objetivo: O servidor diz: "Recebi sua proposta de conexão. Aceito (
ACK X+1). Além disso, também quero me conectar, e vou começar a contar meus bytes a partir deY(SYN Y)." - Estado do Servidor: O servidor passa para o estado SYN-RECEIVED.
Passo 3: ACK (Confirmação Final do Cliente)
O Cliente recebe o SYN-ACK. Para finalizar o estabelecimento, ele deve confirmar o ISN do servidor.
- Flags:
ACK = 1,SYN = 0. - Sequence Number: O cliente envia
X + 1(o próximo número de sequência esperado). - Acknowledgment Number: O cliente define o ACK como
Y + 1. Isso significa: "Recebi seu SYN (byteY). Estou pronto para o byteY+1." - Payload: Opcionalmente, o cliente já pode enviar dados de aplicação neste primeiro pacote (uma técnica chamada "TCP Fast Open", RFC 7413), mas classicamente este é apenas um pacote de controle.
- Objetivo: O cliente diz: "Confirmado. A conexão está estabelecida dos dois lados."
- Estado Final: Quando o servidor recebe este ACK, ele passa para o estado ESTABLISHED. O cliente já passou para ESTABLISHED assim que enviou o ACK.
2. Diagrama de Estado
CLIENTE SERVIDOR
(Fechado) (Escutando - LISTEN)
| |
| --- SYN, Seq=X, Ack=0, Win=Size ---------> | (Recebe SYN)
| | (Aloca Buffer/TCB)
| |
| <--- SYN, ACK, Seq=Y, Ack=X+1, Win=Size ---| (Envia SYN-ACK)
(Recebe SYN-ACK) |
(Confirma conexao) |
| |
| --- ACK, Seq=X+1, Ack=Y+1, Win=Size -----> | (Recebe ACK)
| (Estado ESTABLISHED)
| |
(Conexao Estabelecida) |
(Estado ESTABLISHED) |
| |
| <-------- Dados fluem Full-Duplex -------->|
3. Por que Três Vias? (A Lógica da Confirmação)
Você poderia perguntar: "Por que não duas vias? (Cliente: Vamos conectar? Servidor: Sim!)".
O protocolo exige três vias porque a conexão TCP é Full-Duplex (duplo sentido). Os dados podem fluir em ambas as direções simultaneamente, e cada direção precisa de sua própria sincronização de números de sequência.
- Via 1 (Cliente → Servidor): Sincroniza a direção Cliente → Servidor (Propõe ISN
X). - Via 2 (Servidor → Cliente): Confirma a direção Cliente → Servidor (ACK
X+1) E sincroniza a direção Servidor → Cliente (Propõe ISNY). - Via 3 (Cliente → Servidor): Confirma a direção Servidor → Cliente (ACK
Y+1).
Se faltasse a terceira via, o servidor não saberia se o cliente recebeu corretamente o ISN Y. Se o pacote SYN-ACK se perdesse, o cliente acharia que a conexão falhou, mas o servidor acharia que teve sucesso. A terceira via alinha o estado dos dois lados perfeitamente.
4. Opções TCP Negociadas no Handshake
Durante o handshake, opções TCP importantes são negociadas nos campos Options do cabeçalho:
| Opção | Tipo | Função |
|---|---|---|
| MSS | 2 | Maximum Segment Size (típico 1460 bytes em Ethernet) |
| Window Scale | 3 | Multiplica o valor de Window para janelas maiores que 64 KB |
| SACK Permitted | 4 | Selective ACK permite confirmar blocos não contíguos |
| Timestamps | 8 | Para RTT estimation e PAWS (Protect Against Wrapped Sequence) |
| TCP Fast Open | 34 | Permite enviar dados no SYN (RFC 7413) |
Exemplo Real de Handshake (com opções)
Cliente → Servidor: SYN, Seq=3557824024, Win=64240, MSS=1460, WS=256, SACK
Servidor → Cliente: SYN, ACK, Seq=4177692920, Ack=3557824025, Win=65535, MSS=1460
Cliente → Servidor: ACK, Seq=3557824025, Ack=4177692921, Win=64240
5. Segurança: Randomização do ISN
Observe que o ISN (X e Y) não é 0 nem 1. Ele deve ser um número aleatório difícil de prever.
- Segurança: Se um atacante pudesse adivinhar o número de sequência inicial de uma conexão existente, ele poderia forjar pacotes TCP e injetar dados ou derrubar a conexão (ataques de Spoofing / Blind Hijacking).
- Ataque histórico de Mitnick (1994): Kevin Mitnick usou previsibilidade de ISN em máquinas SunOS para sequestrar conexão TCP. Foi um dos primeiros ataques públicos de TCP sequence prediction.
- Mecanismo Moderno: Os sistemas operacionais usam algoritmos criptográficos (ex: MD5-based, AES-CTR) para gerar o ISN baseados em relógios internos de alta resolução (RFC 6528), garantindo que cada conexão tenha um ponto de partida único e imprevisível.
6. Estados da Máquina TCP (FSM) Durante o Handshake
| Estado | Quem está | Ocorrência |
|---|---|---|
| CLOSED | Cliente inicial | Antes de iniciar |
| LISTEN | Servidor | Aguardando conexões |
| SYN-SENT | Cliente | Enviou SYN, aguarda SYN-ACK |
| SYN-RECEIVED | Servidor | Recebeu SYN, enviou SYN-ACK, aguarda ACK |
| ESTABLISHED | Ambos | Conexão ativa, dados fluindo |
7. Casos de Falha (Rejeição)
O Three-Way Handshake também permite que o servidor recuse a conexão.
Porta Fechada (RST)
Se o cliente tentar conectar a uma porta onde nenhum processo está escutando (ex: porta 80 quando o servidor web está desligado), o servidor responderá com um segmento RST (Reset) em vez de SYN-ACK:
Cliente → Servidor: SYN, Seq=X
Servidor → Cliente: RST, ACK, Seq=0, Ack=X+1
O cliente recebe RST e a conexão falha imediatamente. Em connect() isto retorna ECONNREFUSED.
Firewall Bloqueante (Drop)
Um firewall no caminho pode bloquear o SYN com política DROP (silenciosa):
- Cliente envia SYN.
- Nenhuma resposta volta.
- Cliente retransmite SYN com backoff exponencial (1s, 3s, 7s, 15s, 31s...).
- Após
tcp_syn_retries(default 6 no Linux), cliente desiste comETIMEDOUT.
SYN Flood (Ataque DDoS)
Atacante envia milhares de SYN por segundo com IPs forjados. Servidor aloca TCB (Transmission Control Block) para cada SYN-ACK enviado e fica esperando ACK que nunca vem. Memória do servidor exaure.
- Mitigação: SYN Cookies (RFC 4987) — servidor não aloca estado até receber ACK válido, codificando o ISN como hash criptográfico de origem+destino+tempo.
8. TCP Fast Open (TFO)
Para reduzir latência em conexões repetidas, a RFC 7413 introduziu TCP Fast Open:
- Primeira conexão: handshake normal + cliente recebe cookie TFO.
- Conexões subsequentes: cliente envia SYN + dados (já com cookie). Servidor valida cookie e processa dados imediatamente, economizando 1 RTT.
Usado por Chrome, Google frontends, etc.
9. Conclusão
O Three-Way Handshake é o ritual de negociação que transforma duas estranhas na rede em parceiros de comunicação confiáveis, garantindo que ambos estejam na mesma página sobre "quando" e "como" começar a contar os dados. Sua aparente simplicidade esconde sofisticação: randomização criptográfica de ISN, negociação de opções críticas (MSS, SACK, Window Scale) e resiliência contra ataques como SYN Flood. Sem ele, o TCP não seria possível.
| Atributo | Valor |
|---|---|
| Passos | 3 (SYN, SYN-ACK, ACK) |
| Flags | SYN=1, ACK varia |
| ISN | Aleatório, 32 bits, criptograficamente seguro |
| RFC referência | 793 (1981), 9293 (2022 modernizado) |
| Opções comuns | MSS, Window Scale, SACK, Timestamps, TFO |
| Estado final cliente | ESTABLISHED após enviar ACK |
| Estado final servidor | ESTABLISHED após receber ACK |
| Ataques conhecidos | SYN Flood, Blind Hijack, ISN Prediction |
| Mitigações | SYN Cookies, ISN randomization (RFC 6528) |