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

04 - Three-Way Handshake

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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 (byte X). Aguardo o byte X+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 de Y (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 (byte Y). Estou pronto para o byte Y+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.

  1. Via 1 (Cliente → Servidor): Sincroniza a direção Cliente → Servidor (Propõe ISN X).
  2. Via 2 (Servidor → Cliente): Confirma a direção Cliente → Servidor (ACK X+1) E sincroniza a direção Servidor → Cliente (Propõe ISN Y).
  3. 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 com ETIMEDOUT.

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:

  1. Primeira conexão: handshake normal + cliente recebe cookie TFO.
  2. 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)