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

05 - Estabelecimento de Conexão

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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 CONNECT e o servidor responde OK. Porém, o servidor nunca teria a confirmação de que o cliente recebeu o OK. Se o pacote OK se 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 CLOSED para SYN-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 LISTEN para SYN-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:

  1. 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.
  2. 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-RECEIVED aguardando 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: Filtro tcp[tcpflags] == tcp-syn captura 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 fica ESTABLISHED, 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.

Tip

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.