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+C em 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.
  • 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.