Antes de o TCP enviar dados da aplicação, ele deve estabelecer o estado em ambas as extremidades da conexão. Esse processo de configuração é o handshake triplo TCP. Acontece tão rapidamente que a maioria dos usuários nem percebe, mas quando os sites parecem lentos, as portas parecem fechadas ou os firewalls quebram os aplicativos de maneiras estranhas, muitas vezes é no aperto de mão que a história começa.
O handshake triplo TCP
Os três pacotes são:
- SYN do cliente
- SYNACK do servidor
- ACK do cliente
Depois disso, a conexão é estabelecida e a transferência normal de dados começa.
Explicação passo a passo
1. Cliente envia SYN
Na verdade, o cliente diz: "Quero iniciar uma conexão e aqui está meu número de sequência inicial."
2. O servidor responde com SYN-ACK
O servidor reconhece o número de sequência do cliente e envia de volta seu próprio número de sequência inicial.
3. Cliente envia ACK
O cliente reconhece o número de sequência do servidor. Neste ponto, ambos os lados concordam sobre o estado básico necessário para a troca confiável de dados.
Por que o TCP precisa de um aperto de mão
O aperto de mão não é apenas uma cerimônia. Resolve problemas reais de protocolo:
- confirma que ambos os endpoints podem enviar e receber
- negocia o rastreamento da sequência inicial
- evita que pacotes atrasados de sessões mais antigas sejam confundidos com tráfego atual
- estabelece o estado necessário para uma entrega confiável
Sem esta configuração, o TCP não poderia fornecer o comportamento de fluxo ordenado e confiável que as aplicações esperam.
Por que o TCP usa três etapas em vez de duas
Uma troca em duas etapas não provaria totalmente que ambos os lados estão prontos para transmitir e reconhecer os números de sequência um do outro. O terceiro pacote confirma que a resposta do servidor foi recebida e que o estado da conexão está sincronizado em ambas as direções.
É por isso que o handshake é de “três vias” e não simplesmente um par solicitação-resposta.
O que acontece quando o aperto de mão falha
As falhas de handshake geralmente se enquadram em alguns padrões reconhecíveis.
SYN enviado, sem resposta
Possíveis causas:
- host de destino está inativo
- firewall está descartando pacotes silenciosamente
- IP ou porta errado
- problema de roteamento no caminho
Sintomas comuns:
- tempo limite de conexão
- o navegador gira por um tempo e depois falha
telnetou o aplicativo cliente trava antes de desistir
SYN enviado, RST retornado
Possíveis causas:
- porta está fechada
- o serviço não está escutando
- firewall está configurado para rejeitar em vez de descartar
Sintoma comum:
- "conexão recusada" imediata
SYN e SYN-ACK aparecem, então a sessão termina
Possíveis causas:
- roteamento assimétrico
- problema de firewall com estado
- dispositivo NAT quebrado
- configuração incorreta do balanceador de carga
- Produto de segurança baseado em host interferindo após aceitação inicial
Como é o aperto de mão no Wireshark
Se você capturar tráfego no Wireshark, um início de TCP íntegro geralmente se parecerá com:
SYNSYN, ACKACK
Se você vir apenas pacotes SYN retransmitidos repetidamente, a resposta do servidor nunca retornará. Se você vir um RST, o destino rejeitou ativamente a conexão. Essa visibilidade é a razão pela qual as capturas de pacotes são tão úteis para solução de problemas de rede.
Por que os apertos de mão são importantes para o desempenho
Toda conexão TCP começa com pelo menos uma viagem de ida e volta antes do início do fluxo de dados.
Se a latência for 100 ms:
- o aperto de mão custa cerca de uma viagem de ida e volta
- TLS adiciona mais negociações depois disso
- conexões de curta duração parecem visivelmente mais lentas
Este é um dos motivos pelos quais o ajuste de desempenho moderno se preocupa com a reutilização de conexões, comportamento de manutenção de atividade HTTP, CDNs e protocolos como HTTP/2 e HTTP/3.
Handshake TCP e TLS não são a mesma coisa
Esta é uma fonte comum de confusão.
- Aperto de mão TCP estabelece a conexão de transporte.
- Aperto de mão TLS negocia criptografia e confiança de certificado nessa conexão.
Portanto, quando você abre um site HTTPS, o sistema geralmente executa:
- Aperto de mão TCP
- Aperto de mão TLS
- Solicitação e resposta HTTP
Se um site demorar para "iniciar o carregamento", o atraso poderá ocorrer em qualquer uma das camadas de handshake.
Relacionamento com varredura de porta
Muitos scanners dependem do comportamento de aperto de mão:
- SYNACK geralmente significa que a porta está aberta
- RST geralmente significa fechado
- sem resposta geralmente significa filtrado ou descartado
Isso torna o handshake central não apenas para a rede, mas também para enumeração e testes de segurança.
Ataques de inundação SYN
Uma inundação SYN abusa do handshake enviando um grande número de pacotes SYN sem completar o ACK final. O servidor aloca recursos para muitas sessões semiabertas e pode ficar sobrecarregado.
Mitigações comuns:
- Cookies SYN
- limitação de taxa
- filtragem upstream
- proteções de firewall
- ajuste do balanceador de carga
A desmontagem da conexão é diferente
Iniciar uma sessão utiliza o handshake triplo. Seu fechamento geralmente usa um processo diferente envolvendo pacotes FIN e ACK em ambas as direções.
Essa desmontagem é importante ao depurar soquetes presos TIME_WAIT ou CLOSE_WAIT, mas é separado do handshake de conexão inicial.
Conclusão
O handshake TCP é a inicialização em três etapas para uma comunicação TCP confiável:
- SYN
- SYNACK
- ACK
É importante porque cada solicitação web, sessão SSH, conexão de banco de dados ou chamada de API construída em TCP depende disso. Se uma conexão expirar, for recusada ou parecer lenta antes da movimentação de qualquer dado, o handshake é um dos primeiros locais a investigar.