01 - SYN
video: https://youtu.be/... no frontmatter da nota.SYN (Synchronize)
SYN é uma das seis flags de controle do protocolo TCP (localizada no bit 1 do campo de flags). A sigla significa Synchronize (Sincronizar). Esta flag é usada exclusivamente durante o estabelecimento da conexão (Three-Way Handshake) para iniciar a comunicação e sincronizar os números de sequência entre o cliente e o servidor.
O uso da flag SYN é o que diferencia o TCP (orientado a conexão) de protocolos sem conexão como o UDP. Ela sinaliza a intenção de abrir um canal de comunicação dedicado.
1. Posição no Cabeçalho TCP
O campo de flags do TCP tem 9 bits (versão moderna), com as seguintes posições:
| Bit | Flag | Significado |
|---|---|---|
| 0 | CWR | Congestion Window Reduced |
| 1 | ECE | ECN-Echo |
| 2 | URG | Urgent pointer válido |
| 3 | ACK | Acknowledgment field válido |
| 4 | PSH | Push function |
| 5 | RST | Reset da conexão |
| 6 | SYN | Sincronizar números de sequência |
| 7 | FIN | Finalizar envio de dados |
| 8 | NS | ECN Nonce Sum |
A flag SYN ocupa o bit 6 (contagem a partir do bit 0 da palavra de 16 bits que inclui Data Offset, Reserved e Flags). Seu valor numérico isolado é 0x02 em hexadecimal ou 0b00000010 na representação binária do campo de flags.
2. Função: Sincronização de Números de Sequência
O propósito técnico da flag SYN é anunciar e negociar o Número de Sequência Inicial (ISN - Initial Sequence Number).
Como o TCP numera cada byte de dados que flui através da conexão, é crucial que o remetente e o receptor saibam exatamente onde a contagem começa.
- O lado que envia o SYN (ativa a flag) escolhe um número aleatório
X. - Esse número
Xserá o número de sequência do primeiro byte de dados que será enviado após o handshake. - Como o próprio pacote SYN ocupa um número de sequência lógico (para fins de controle), o primeiro byte de dados efetivo terá o número
X + 1.
Por que o ISN é Aleatório?
Se o ISN fosse sempre 0 (ou previsível), um atacante poderia forjar pacotes que parecessem pertencer a uma conexão legítima — ataque conhecido como TCP Sequence Prediction Attack (popularizado por Kevin Mitnick em 1994). Os sistemas modernos usam algoritmos pseudoaleatórios criptograficamente seguros (como o algoritmo de Knuth ou baseados em hash SHA) para gerar ISNs que não podem ser adivinhados.
3. Comportamento no Estabelecimento de Conexão
A flag SYN é usada nas duas primeiras mensagens do Three-Way Handshake:
A. No Pacote de Abertura (Cliente)
Quando um cliente deseja iniciar uma conexão, ele envia um segmento TCP onde:
- Flag SYN = 1
- Flag ACK = 0
- Sequence Number = ISN do Cliente (aleatório)
Este pacote diz: "Olá. Quero conectar. Vou começar a contar meus dados a partir deste número aleatório X".
B. No Pacote de Aceitação (Servidor)
Quando o servidor aceita a conexão, ele deve responder confirmando o recebimento do SYN do cliente e propondo seu próprio número de sequência. Ele envia um segmento onde:
- Flag SYN = 1
- Flag ACK = 1
- Sequence Number = ISN do Servidor (aleatório)
- Acknowledgment Number = ISN do Cliente + 1
Este pacote diz: "Recebi seu pedido (ACK X+1). Aceito a conexão. Por sua vez, vou começar a contar meus dados a partir do meu número aleatório Y".
4. Consumo de Número de Sequência
Um detalhe técnico importante é que a ativação da flag SYN consome um número de sequência.
- O pacote SYN não transporta dados de aplicação, mas ele é contabilizado no fluxo.
- Se o ISN do cliente é
1000, o cliente enviaSYN (Seq=1000). - O servidor confirma com
ACK=1001. - O primeiro byte de dados enviado pelo cliente terá obrigatoriamente o número de sequência
1001. - Isso significa que, para cada conexão TCP, uma unidade de espaço de numeração é "gasta" para o SYN (e outra para o FIN, no encerramento).
Tabela de Consumo de Números de Sequência
| Flag Ativada | Consome Número? | Incremento |
|---|---|---|
| SYN | Sim | +1 |
| FIN | Sim | +1 |
| Dados (payload) | Sim | +N (bytes enviados) |
| ACK puro | Não | 0 |
| RST | Não | 0 |
| PSH (sozinho) | Não (apenas marca dados) | 0 |
5. O Flag SYN em Ataques (SYN Flood)
Devido à maneira como o protocolo funciona, o flag SYN é o vetor de um famoso ataque de negação de serviço chamado SYN Flood.
- O Processo Normal: Quando um servidor recebe um SYN, ele aloca memória (buffer) e recursos de CPU para criar uma estrutura de controle (TCB - Transmission Control Block) para aquela nova conexão, entrando no estado SYN-RECEIVED. Ele espera o terceiro passo (ACK) para completar a conexão.
- O Ataque: Um atacante envia milhões de pacotes SYN com endereços IP de origem falsificados (spoofed).
- O Resultado: O servidor responde com SYN-ACK, mas a resposta vai para os IPs falsos, que nunca respondem com o ACK final. O servidor fica com milhares de conexões "meio-abertas", consumindo toda a sua memória e ficando incapaz de aceitar conexões legítimas.
Defesas contra SYN Flood
| Técnica | Descrição |
|---|---|
| SYN Cookies | Servidor não aloca TCB até receber ACK válido; ISN é criptografado |
| SYN Proxy | Firewall intermediário completa o handshake antes de repassar |
| Redução de Backlog | Aumenta o número de conexões half-open suportadas |
| Rate Limiting | Limita SYNs por segundo por IP de origem |
O mecanismo de SYN Cookies (RFC 4987) foi proposto por Daniel J. Bernstein em 1996 e é hoje padrão em kernels Linux modernos (/proc/sys/net/ipv4/tcp_syncookies).
6. Opções TCP Negociadas no SYN
O primeiro segmento SYN (e sua resposta SYN-ACK) carrega parâmetros críticos que definem o comportamento da conexão por toda sua duração:
- MSS (Maximum Segment Size): Tamanho máximo do payload TCP por segmento (típico: 1460 em Ethernet).
- Window Scale: Permite janelas maiores que 65535 bytes (até 1 GB).
- SACK Permitted: Selective Acknowledgment, evita retransmissões desnecessárias.
- Timestamps: Para cálculo preciso de RTT e PAWS (Protection Against Wrapped Sequence Numbers).
Se o cliente não oferecer essas opções no SYN, o servidor assume os valores padrão conservadores — sem janela escalada, sem SACK, MSS 536 — o que degrada drasticamente o desempenho em redes modernas.
7. Captura Prática (Wireshark)
Um pacote SYN típico aparece no Wireshark da seguinte forma:
Transmission Control Protocol, Src Port: 54321, Dst Port: 443, Seq: 0, Len: 0
Source Port: 54321
Destination Port: 443
[Stream index: 0]
Sequence number (relative): 0
Sequence number (raw): 2821093324
Acknowledgment number: 0
Header Length: 32 bytes (12 bytes options)
Flags: 0x002 (SYN)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...0 .... = Acknowledgment: Not set
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..1. = Syn: Set
.... .... ...0 = Fin: Not set
Window: 64240
Checksum: 0x8a3c [unverified]
Urgent Pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation, Window scale, SACK permitted
8. Resumo
A flag SYN é o "botão de início" do TCP.
- Sinaliza: "Quero falar com você."
- Negocia: "Vamos começar a contar os números daqui."
- Custo: Requer uma resposta (SYN-ACK) e uma confirmação (ACK) para estabelecer o estado.
- Identidade: A combinação
{IP Origem, Porta Origem, IP Destino, Porta Destino, Número de Sequência SYN}é a assinatura única de uma conexão TCP. - Segurança: Sua exploração (SYN Flood) motivou o desenvolvimento de técnicas como SYN Cookies, fundamentais para a resiliência da internet moderna.
Sem o SYN, o TCP não existiria como o conhecemos — não haveria conexão lógica, nem garantia de entrega, nem controle de fluxo. É o ponto de partida que torna possível toda a comunicação confiável fim-a-fim da web, e-mail e transferência de arquivos.