05 - Estabelecimento de Conexão
video: https://youtu.be/... no frontmatter da nota.O Estabelecimento de Conexão é o processo pelo qual dois hosts (cliente e servidor) concordam em iniciar uma comunicação confiável, sincronizam seus números de sequência (ISN) e negociam os parâmetros da sessão TCP. Esse processo é conhecido como Three-Way Handshake (aperto de mão de três vias) e está especificado na RFC 793.
1. Por que Três Vias (e não duas)?
A pergunta clássica é: por que dois pacotes (request/ack) não são suficientes?
- Em um modelo de duas vias, o cliente envia
CONNECTe o servidor respondeOK. Porém, o servidor nunca teria a confirmação de que o cliente recebeu oOK. Se o pacoteOKse perder na rede, o servidor acharia que a conexão está estabelecida e alocaria recursos, enquanto o cliente ainda aguardaria resposta. - O TCP resolve isso com três mensagens:
1. Cliente -> Servidor: SYN (vou começar a partir do ISN X).
2. Servidor -> Cliente: SYN+ACK (vou começar a partir do ISN Y, e recebi seu X).
3. Cliente -> Servidor: ACK (recebi seu Y, confirmado). - Assim, ambos os lados têm certeza de que o outro está ouvindo e que os ISNs foram corretamente trocados.
2. O Three-Way Handshake Passo a Passo
Passo 1: SYN (Sincronização)
- O cliente escolhe um Número de Sequência Inicial (ISN) aleatório (ex:
1000). - Envia um segmento com a flag SYN ligada e SEQ = 1000.
- O segmento não contém dados (apenas cabeçalho).
- O cliente transita do estado
CLOSEDparaSYN-SENT.
Passo 2: SYN-ACK (Sincronização e Confirmação)
- O servidor recebe o pedido e também escolhe seu próprio ISN (ex:
5000). - Envia um segmento com as flags SYN e ACK ligadas.
- SEQ = 5000, ACK = 1001 (ISN do cliente + 1).
- O servidor transita de
LISTENparaSYN-RECEIVED. - A conexão agora está "meio aberta" (half-open): o servidor reservou buffer e TCB (Transport Control Block) aguardando o ACK final.
Passo 3: ACK (Confirmação)
- O cliente recebe o SYN-ACK.
- Envia um segmento apenas com a flag ACK ligada.
- SEQ = 1001, ACK = 5001 (ISN do servidor + 1).
- Cliente transita para
ESTABLISHED. - Ao receber este ACK, o servidor também transita para
ESTABLISHED.
A partir deste momento, a conexão é estabelecida e os dois hosts podem começar a enviar dados. O terceiro segmento (ACK) pode, opcionalmente, já carregar payload de aplicação.
Diagrama do Handshake
Cliente Servidor
(CLOSED) (LISTEN)
| |
|------- SYN, SEQ=1000 --------------->| (passa a SYN-RECEIVED)
| |
(SYN-SENT) |
|<------ SYN, ACK, SEQ=5000, ACK=1001 --|
| |
|------- ACK, SEQ=1001, ACK=5001 ------>| (passa a ESTABLISHED)
| |
(ESTABLISHED) (ESTABLISHED)
| |
|======= DADOS (full-duplex) =========>|
3. Estados da Máquina TCP
A RFC 793 define uma máquina de estados finita (FSM) para a conexão. Os estados relevantes ao estabelecimento são:
| Estado | Quem está | Descrição |
|---|---|---|
CLOSED |
Ambos | Sem conexão ativa. Ponto inicial e final. |
LISTEN |
Servidor | Aguardando pedido de conexão (passivo). |
SYN-SENT |
Cliente | Enviou SYN, aguarda SYN-ACK. |
SYN-RECEIVED |
Servidor | Recebeu SYN, enviou SYN-ACK, aguarda ACK final. |
ESTABLISHED |
Ambos | Conexão aberta; dados podem fluir. |
Visualizar estados com ss no Linux:
ss -tan state established '( sport = :80 or dport = :80 )'
ss -tan state syn-recv
4. Números de Sequência Iniciais (ISN)
O ISN não começa em 0 ou 1. Ele é um valor de 32 bits pseudoaleatório por dois motivos:
- Evitar reuso acidental de SEQs: Se a conexão anterior (mesmo par IP:porta) usou SEQ 1000 e um pacote velho chegar atrasado, ele não deve ser confundido com dado da conexão nova. Com ISNs aleatórios, a chance de colisão é estatisticamente desprezível.
- Segurança (blindagem contra session hijacking): Um atacante que adivinha o próximo ISN pode forjar segmentos e injetar comandos na sessão (ataque clássico de Kevin Mitnick contra Shimomura, 1994). Por isso a RFC 6528 recomenda ISNs imprevisíveis.
Fórmula simplificada (BSD/Linux): combinação de um contador de 4 µs com hash criptográfico do quadricômetro de conexões (4-tuple: IP origem, porta origem, IP destino, porta destino).
5. Opções Negociadas no Handshake
Durante o SYN/SYN-ACK, são trocadas opções do cabeçalho TCP (TCP Options):
- MSS (Maximum Segment Size): Tamanho máximo do payload que cada lado aceita. Típico em Ethernet: 1460 bytes (MTU 1500 - 20 IP - 20 TCP).
- Window Scale (RFC 7323): Fator de ampliação da janela de recepção (até 14 bits), permitindo janelas maiores que 64 KiB.
- SACK-Permitted (RFC 2018): Confirmações seletivas permitem ACKs por faixa, melhorando recuperação em perdas múltiplas.
- Timestamps (RFC 7323): Para RTTM (medição de RTT) e PAWS (proteção contra segmentos velhos).
- TCP Fast Open (RFC 7413): Permite enviar dados já no SYN (cookie prévio), economizando 1 RTT em conexões repetidas.
6. Segurança: SYN Flood e SYN Cookies
O processo de handshake é alvo de um dos ataques de negação de serviço (DoS) mais clássicos: o SYN Flood.
- Como funciona: Um atacante com IP falsificado (spoofed) envia milhares de mensagens SYN sem nunca enviar o ACK final (Passo 3).
- Efeito: O servidor aloca TCB e buffer para cada SYN-ACK enviado e fica no estado
SYN-RECEIVEDaguardando o ACK (default timeout ~75s). A "Tabela de Conexões Meio-Abertas" enche, impedindo usuários legítimos de se conectarem. - Mitigação: SYN Cookies (RFC 4987, implementação de Daniel Bernstein).
- Em vez de alocar TCB imediatamente ao receber o SYN, o servidor codifica estado (ISN do servidor, MSS, timestamp) em um hash criptográfico (tipo MD5) do quadricômetro + segredo secreto.
- Esse hash é devolvido como o ISN do SYN-ACK. Nada é guardado em memória.
- Quando o ACK final chega, o servidor subtrai 1 do ACK number, recalcula o hash e valida a autenticidade. Se válido, reconstrói o TCB e abre a conexão.
- Custo: não suporta opções TCP (MSS é comprimido em 3 bits) e remove a possibilidade de TCP Fast Open.
Verificar SYN cookies ativos no Linux:
sysctl net.ipv4.tcp_syncookies # 1 = habilitado
sysctl net.ipv4.tcp_max_syn_backlog # tamanho da fila SYN
ss -n state syn-recv | wc -l # conexões half-open atuais
7. Ferramentas de Diagnóstico e Ataque
tcpdump/wireshark: Filtrotcp[tcpflags] == tcp-syncaptura apenas SYNs.nmap -sS(Stealth Scan): Envia SYN, espera SYN-ACK (porta aberta) ou RST (porta fechada) e então responde com RST em vez de ACK. A conexão nunca ficaESTABLISHED, então geralmente não aparece nos logs de aplicação (Apache/Nginx).hping3 -S -p 80 --flood <alvo>: Ferramenta para testar resistência a SYN flood em laboratório.
Em ferramentas como o Nmap, o comando -sS (Stealth Scan) utiliza apenas os dois primeiros passos do handshake. O Nmap envia o SYN, espera o SYN-ACK (que indica que a porta está aberta) e então responde com um RST (Reset) em vez de um ACK, evitando completar a conexão e aparecer nos logs da aplicação. Por outro lado, o -sT (Connect Scan) completa o handshake de três vias e deixa rastro em todos os logs.