Flags TCP
As Flags TCP (conhecidas como Control Bits) são um conjunto de 6 bits localizados no cabeçalho TCP (especificamente nos 6 bits seguintes ao campo de Data Offset). Cada flag é um único bit que pode estar ligado (1) ou desligado (0).
Essas flags funcionam como o “painel de controle” da conexão. Elas indicam o propósito do segmento (se é um dado, uma solicitação de conexão ou um encerramento) e gerenciam o estado da sessão. A combinação dessas flags permite que o TCP realize o handshake, transfira dados, gerencie urgências e encerre a conexão graciosamente.
1. As 6 Flags Principais
Embora existam outros bits reservados, as 6 flags oficiais definidas na RFC 793 são: URG, ACK, PSH, RST, SYN e FIN.
A. URG (Urgent - Bit 5)
- Função: Indica que os dados contidos no segmento são urgentes e devem ser processados com prioridade pela aplicação receptora.
- Mecanismo: Quando URG = 1, o campo Urgent Pointer (16 bits) no cabeçalho aponta para o byte de dados urgente dentro do segmento.
- Uso Atual: Historicamente usado para comandos de interrupção (ex:
CTRL+Cem um terminal remoto). Hoje em dia é raramente usado e muitas aplicações modernas o ignoram, preferindo fluxos de dados separados para sinais de controle.
B. ACK (Acknowledgment - Bit 4)
- Função: Indica que o campo ACK Number é válido.
- Mecanismo:
- Se
ACK = 0: O campo ACK Number deve ser ignorado (usado apenas durante a primeira fase do handshake). - Se
ACK = 1: O segmento carrega uma confirmação de recebimento (cumulativa) dos dados enviados pelo outro lado.
- Se
- Uso: Esta flag está ligada em praticamente todos os segmentos após a conexão estabelecida, exceto no segmento inicial de SYN puro.
C. PSH (Push - Bit 3)
- Função: Solicita que o receptor entregue os dados imediatamente à aplicação, em vez de guardá-los no buffer de recepção para otimização.
- Contexto: Normalmente, o TCP espera acumular uma quantidade razoável de dados antes de passá-los para a aplicação (para melhorar a eficiência).
- Uso: Usado em aplicações interativas (como Telnet ou SSH) onde cada pressionamento de tecla precisa ser processado e ecoado de volta instantaneamente, sem atraso de bufferização.
D. RST (Reset - Bit 2)
- Função: Reseta (aborta) a conexão imediatamente. É uma “parada brusca”.
- Causas Comuns:
- O segmento chegou para um socket que não existe (conexão fechada).
- Tentativa de conexão recusada pelo servidor (ao invés de um handshake normal, o servidor envia RST).
- Timeout ou erro irrecuperável na conexão.
- Comportamento: Ao receber um RST, a conexão é encerrada instantaneamente, descartando buffers e notificando a aplicação do erro (“Connection Reset by Peer”). Não há espera de FIN.
E. SYN (Synchronize - Bit 1)
- Função: Usado para sincronizar e estabelecer uma conexão (Sincronizar números de sequência).
- Uso no Handshake:
SYN=1, ACK=0: Cliente envia para iniciar a conexão (SYN).SYN=1, ACK=1: Servidor responde confirmando o recebimento do SYN e propondo seu próprio número de sequência (SYN-ACK).
- Consumo de Número de Sequência: O consumo de um número de sequência inicial (ISN) é tratado como se fosse 1 byte. Por isso, se o ISN é 1000, o primeiro dado enviado após o handshake terá o número de sequência 1001.
F. FIN (Finish - Bit 0)
- Função: Indica que o emissor terminou de enviar dados e deseja encerrar a conexão.
- Comportamento: É uma solicitação educada de encerramento (“graceful close”). O lado que envia o FIN não enviará mais dados. O receptor deve confirmar com ACK e, se também tiver terminado, enviar seu próprio FIN (Four-Way Handshake).
- Diferença para RST: O FIN encerra a conexão de forma organizada, garantindo que todos os dados enviados anteriormente tenham sido entregues. O RST é uma anulação imediata e perde dados pendentes.
2. Interações das Flags em Cenários Comuns
As raramente trabalham sozinhas; é a combinação que define o evento:
A. Handshake de Três Vias (Estabelecimento):
1. Cliente: SYN=1, ACK=0, Seq=X (Quero conectar).
2. Servidor: SYN=1, ACK=1, Seq=Y, Ack=X+1 (Recebi, aceito, vamos conectar).
3. Cliente: SYN=0, ACK=1, Seq=X+1, Ack=Y+1 (Confirmado, conectado).
B. Encerramento Normal (Four-Way Handshake):
1. Cliente: FIN=1, ACK=1 (Terminei meu envio).
2. Servidor: ACK=1 (Entendido, mas ainda tenho dados para te mandar).
3. Servidor: FIN=1, ACK=1 (Agora eu também terminei).
4. Cliente: ACK=1 (Confirmado, bye).
C. Transferência de Dados:
* Padrão: ACK=1, PSH=0 (Dados normais com confirmação).
* Interativo: ACK=1, PSH=1 (Dados urgentes/interativos para entregar logo).
D. Erro / Reset:
* Aborto: RST=1 (A conexão morreu agora).
3. Eile (ECE) e CWR (Controle de Congestionamento)
Embora as 6 originais sejam as mais famosas, o TCP moderno usa duas flags adicionais para o ECN (Explicit Congestion Notification), definidas na RFC 3168:
- ECE (ECN-Echo): Sinaliza ao receptor que houve congestionamento na rede.
- CWR (Congestion Window Reduced): Sinaliza ao remetente que ele reduziu sua janela de envio em resposta ao congestionamento.
Essas permitem que a rede notifique proativamente sobre congestionamento antes de começar a descartar pacotes, tornando a internet mais eficiente.
Resumo Visual
| Flag | Nome | Significado | Ação Principal |
|---|---|---|---|
| URG | Urgent | Dados Urgentes | Ponta o Urgent Pointer. |
| ACK | Acknowledgment | Confirmação | Valida o campo ACK Number. |
| PSH | Push | Empurrar | Força a entrega imediata ao app. |
| RST | Reset | Reiniciar | Aborta a conexão bruscamente. |
| SYN | Synchronize | Sincronizar | Inicia/Negocia a conexão. |
| FIN | Finish | Finalizar | Solicita encerramento ordenado. |