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 (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”), 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.
- Via 1 (Cliente $\to$ Servidor): Sincroniza a direção Cliente $\to$ Servidor (Propõe ISN
X). - 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 ISNY). - 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.