03 - Flags TCP (SYN, ACK, FIN, RST, PSH, URG)
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=1consome 1 número de sequência (mesmo sem carregar dados). Por isso, o primeiro byte de dados útil após o handshake tem númeroISN + 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=1e 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 -sSenviam 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).