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.

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”), 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)
   |                                            |
   | --- 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 conexão)                             |
   |                                            |
   | --- ACK, Seq=X+1, Ack=Y+1, Win=Size -----> | (Recebe ACK)
   |                                    (Estado ESTABLISHED)
   |                                            |
(Conexão Estabelecida)                          |
(Estado ESTABLISHED)                            |

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 $\to$ Servidor): Sincroniza a direção Cliente $\to$ Servidor (Propõe ISN X).
  2. Via 2 (Servidor $\to$ Cliente): Confirma a direção Cliente $\to$ Servidor (ACK X+1) E sincroniza a direção Servidor $\to$ Cliente (Propõe ISN Y).
  3. Via 3 (Cliente $\to$ Servidor): Confirma a direção Servidor $\to$ 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. 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).
  • Mecanismo: Os sistemas operacionais usam algoritmos criptográficos para gerar o ISN baseados em relógios internos e hashes, garantindo que cada conexão tenha um ponto de partida único e imprevisível.

5. Casos de Falha (Rejeição)

O Three-Way Handshake também permite que o servidor recuse a conexão.

  • Porta Fechada: 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.
  • Firewall: Um firewall no caminho pode bloquear o SYN (nada volta) ou bloquear o SYN-ACK. O cliente eventualmente dará timeout na tentativa de conexão.

Em resumo, 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.