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

03 - Flags TCP (SYN, ACK, FIN, RST, PSH, URG)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Flags TCP (SYN, ACK, FIN, RST, PSH, URG)

O campo Flags (também chamado de Control Bits ou Control Flags) é um conjunto de 9 bits localizado no cabeçalho do segmento TCP, distribuídos entre os bytes 12 e 13. Sua função é sinalizar estados, controles e opções especiais durante toda a vida útil de uma conexão TCP — desde o estabelecimento (three-way handshake) até o encerramento ordenado (graceful teardown) ou abrupto (reset).

Historicamente, o TCP definido na RFC 793 (1981) tinha apenas 6 flags (URG, ACK, PSH, RST, SYN, FIN) em 6 bits. A RFC 3168 (2001) adicionou 2 bits para Explicit Congestion Notification (ECE, CWR), totalizando 8. A RFC 3540 (2003) adicionou o 9º bit NS (Nonce Sum), usado em conjunto com ECN para proteção contra ocultação de congestionamento.

1. Localização e Estrutura no Cabeçalho TCP

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bit Nome Função
106 URG Urgent Pointer válido
105 ACK Acknowledgment Number válido
104 PSH Push function (buffer flush)
103 RST Reset da conexão
102 SYN Sincroniza números de sequência
101 FIN Encerramento ordenado (Finish)
100 CWR Congestion Window Reduced
99 ECE ECN-Echo
98 NS Nonce Sum

2. Flag SYN (Synchronize Sequence Numbers)

A flag SYN (Sincronizar) é usada exclusivamente na fase de estabelecimento da conexão. Ela sinaliza ao par receptor que o número de sequência contido no campo Sequence Number deve ser tratado como o ISN (Initial Sequence Number) — o ponto de partida para a numeração de bytes.

  • Quando é setada: Apenas nos primeiros pacotes da conexão (no three-way handshake).
  • Semântica especial: Um pacote com SYN=1 consome 1 número de sequência (mesmo sem carregar dados). Por isso, o primeiro byte de dados útil após o handshake tem número ISN + 1.
  • Combinações legítimas: SYN isolado (início do cliente), SYN+ACK (resposta do servidor). SYN+FIN simultâneo é incomum e considerado malicioso por alguns firewalls (port scanning).

3. Flag ACK (Acknowledgment)

A flag ACK indica que o campo Acknowledgment Number contém um número válido. É o mecanismo central de confirmação do TCP.

  • Comportamento: Setada em todos os pacotes após o recebimento do primeiro SYN (ou seja, do SYN+ACK em diante, durante toda a conexão).
  • Significado do campo ACK Number: "Já recebi todos os bytes até o byte N-1, por favor envie a partir do byte N".
  • ACK Cumulativo: O TCP não confirma pacotes individuais, mas sim fluxos contínuos de bytes. Isso é mais eficiente mas torna a detecção de perdas menos granular (motivo da existência de opções como SACK — Selective ACK, RFC 2018).
  • Pure ACK: Pacote com ACK=1 e sem payload (tamanho 0). Geralmente não conta para controle de congestionamento.

4. Flag FIN (Finish — Encerramento Ordenado)

A flag FIN sinaliza que o remetente não tem mais dados para enviar. Não significa necessariamente "fechar conexão agora" — é uma indicação elegante de fim de transmissão.

  • Encerramento em 4 passos (Four-Way Handshake):
    1. A → B: FIN, ACK (A indica fim)
    2. B → A: ACK (B confirma recebimento do FIN)
    3. B → A: FIN, ACK (B também não tem mais dados)
    4. A → B: ACK (A confirma recebimento do FIN)
  • Half-Close: Entre passos 1 e 3, B ainda pode enviar dados para A. Esse estado é chamado de "half-close" e é uma característica única do TCP (raramente usada na prática).
  • TIME_WAIT: Após enviar o último ACK, A entra no estado TIME_WAIT por 2*MSL (Maximum Segment Lifetime, tipicamente 60-120 segundos) para garantir que o ACK chegou e absorver segmentos duplicados atrasados.

5. Flag RST (Reset — Encerramento Abrupto)

A flag RST força o fechamento imediato da conexão, sem handshake de encerramento. É o "botão de pânico" do TCP.

  • Usos legítimos:
  • Rejeitar conexão em porta fechada (porta não escutando).
  • Abortar conexão após erro fatal.
  • Limpar conexão em estado inválido (half-open).
  • Usos em ataques:
  • Port scanning (RST scan): Ferramentas como nmap -sS enviam SYN e observam a resposta. Se receber SYN+ACK = porta aberta; se receber RST = porta fechada.
  • TCP Reset Attack: Atacante injeta pacote RST forjado com número de sequência correto, abortando conexão. Mitigado por ISN aleatório e TCP MD5 signatures (RFC 2385).
  • Comportamento SO: Linux envia RST para portas fechadas. Windows idem. RST não recebe ACK de confirmação (conexão simplesmente some).

6. Flag PSH (Push)

A flag PSH instrui o receptor a entregar imediatamente os dados recebidos à aplicação, sem aguardar o buffer de recepção encher.

  • Motivação: Por padrão, TCP é protocolo orientado a stream com Nagle's Algorithm (RFC 896) e buffering. Sem PSH, dados pequenos podem ficar em buffer aguardando mais dados.
  • Aplicações interativas: Telnet, SSH, HTTP usam PSH para minimizar latência percebida.
  • Comportamento real: Modernamente, o kernel decide quando setar PSH (geralmente em cada segmento preenchido). A diferença prática é mínima hoje em dia.

7. Flag URG (Urgent)

A flag URG indica que o campo Urgent Pointer é válido e aponta para dados prioritários (out-of-band) dentro do segmento.

  • Dados urgentes: São dados que devem ser processados pela aplicação antes dos dados regulares já em buffer. O Urgent Pointer indica o offset do último byte de dados urgentes.
  • Uso clássico: Telnet usava URG para enviar Ctrl+C (interrupção) mesmo quando o buffer de recepção estava cheio.
  • Status atual: Praticamente obsoleto. RFC 6093 (2011) desencoraja fortemente seu uso e recomenda camadas de aplicação implementarem seu próprio mecanismo out-of-band (ex: SSH usa canais separados).

8. Flags ECN: ECE e CWR (RFC 3168)

A Explicit Congestion Notification (ECN) permite que roteadores sinalizem congestionamento antes de precisarem descartar pacotes. Mais elegante que o método clássico (perda de pacotes como sinal de congestionamento).

  • ECE (ECN-Echo): Setada pelo receptor para informar ao transmissor que recebeu pacote com flag ECN-CE setada pelo roteador.
  • CWR (Congestion Window Reduced): Setada pelo transmissor para confirmar que recebeu ECE e já reduziu sua janela de congestionamento.
  • Requisito: Negociado no handshake SYN/SYN-ACK via flags ECE+CWR simultâneas.

9. Tabela de Combinações Comuns

Flags Significado Etapa da Conexão
SYN Início de conexão (cliente) 1º pacote do handshake
SYN, ACK Resposta ao SYN (servidor) 2º pacote do handshake
ACK Confirmação pura Durante toda a conexão
PSH, ACK Dados com push Aplicações interativas
FIN, ACK Encerramento ordenado Final da conexão
RST Encerramento abrupto Erro ou port scan
RST, ACK Reset com ACK Recusa de conexão
URG, ACK Dados urgentes Raro (legado)

10. Captura Prática com tcpdump

# Capturar apenas SYN (novas conexões)
tcpdump -n -i eth0 'tcp[tcpflags] & tcp-syn != 0'

# Capturar resets (anomalias)
tcpdump -n -i eth0 'tcp[tcpflags] & tcp-rst != 0'

# Capturar handshake completo
tcpdump -n -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

# Capturar encerramentos
tcpdump -n -i eth0 'tcp[tcpflags] & tcp-fin != 0'

Exemplo de Saída

10:00:01 IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [S], seq 12345, win 64240
10:00:01 IP 192.168.1.1.80 > 192.168.1.10.54321: Flags [S.], seq 98765, ack 12346, win 65535
10:00:01 IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [.], ack 98766, win 64240
10:00:01 IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [P.], seq 12346:12400, ack 98766
10:00:01 IP 192.168.1.1.80 > 192.168.1.10.54321: Flags [.], ack 12400, win 65535
10:00:02 IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [F.], seq 12400, ack 98766
10:00:02 IP 192.168.1.1.80 > 192.168.1.10.54321: Flags [.], ack 12401, win 65535
10:00:02 IP 192.168.1.1.80 > 192.168.1.10.54321: Flags [F.], seq 98766, ack 12401
10:00:02 IP 192.168.1.10.54321 > 192.168.1.1.80: Flags [.], ack 98767, win 65535

A notação S = SYN, . = ACK, P = PSH, F = FIN, R = RST, U = URG.

11. RFCs de Referência

RFC Ano Conteúdo
RFC 793 1981 TCP original (6 flags)
RFC 3168 2001 ECN (ECE + CWR)
RFC 3540 2003 Nonce Sum (NS)
RFC 6093 2011 Descontinuação do uso de URG
RFC 9293 2022 TCP revisão consolidada (substitui 793)

12. Conclusão

As flags TCP são o "alfabeto de controle" do protocolo, permitindo que duas pontas coordenem estados de conexão sem trocar mensagens fora de banda. Cada flag tem uma função específica e bem definida: SYN inicia, ACK confirma, FIN encerra elegantemente, RST aborta, PSH acelera entrega, URG (raramente usado hoje) sinaliza prioridade, ECE/CWR lidam com congestionamento. Para engenheiros de redes e administradores de sistemas, saber interpretar flags em capturas tcpdump/Wireshark é fundamental para diagnosticar desde falhas de aplicação (conexões recusadas, resets inesperados) até ataques (port scans, injeção de RST) e otimizar performance (tuning de Nagle, ECN, buffer sizes).