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

09 - Protocolo TCP

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

Protocolo TCP

O TCP (Transmission Control Protocol) é o protocolo de transporte mais utilizado na internet, definido na RFC 793 (1981). Ele é a implementação padrão do modelo de Circuito Virtual na suíte TCP/IP. Diferente do UDP (que é rápido e não confiável), o TCP foi projetado para fornecer um serviço de comunicação confiável, orientado à conexão e full-duplex.

O TCP é a espinha dorsal da World Wide Web, do E-mail, da transferência de arquivos e de virtualmente toda aplicação onde a perda ou corrupção de dados é inaceitável. Ele transforma a rede IP "best-effort" (melhor esforço) e caótica em um canal de comunicação robusto e ordenado para as aplicações de software.

1. História e Padronização

  • 1974: Vint Cerf e Bob Kahn publicam "A Protocol for Packet Network Intercommunication" — nasce o conceito de TCP.
  • 1977: Versão 1 e 2 (RFCs 675, 721) unificam funções de transporte e rede.
  • 1978: Separação TCP/IP — IP fica com a entrega de pacotes, TCP com a confiabilidade fim-a-fim.
  • 1981: RFC 793 formaliza o TCP como o conhecemos hoje. Embora tenham surgido dezenas de extensões (RFC 1122, 1323, 2018, 2581, 5681, 7323, 7413, 8985), o protocolo-base de 1981 permanece compatível.
  • Anos 2000-2020: Evolução dos algoritmos de congestionamento (Tahoe, Reno, NewReno, Vegas, Westwood, Cubic, BBR) e otimizações para redes rápidas (Window Scaling, SACK, MPTCP).

2. Características Fundamentais

O TCP é definido por quatro características principais que o diferenciam de todos os outros protocolos:

  • Orientado à Conexão (Connection-Oriented): Antes de transferir dados, o TCP estabelece uma conexão lógica entre o cliente e o servidor através de um processo de Handshake de Três Vias (Three-Way Handshake). Isso sincroniza os dois lados e aloca os recursos necessários (TCB - Transport Control Block, buffers de envio e recepção).
  • Confiável (Reliable): O TCP garante que os dados enviados cheguem sem erros e sem perdas. Ele usa números de sequência e confirmações (ACKs). Se um segmento se perde, o TCP o retransmite automaticamente. Há três modos de detecção de perda: timeout (RTO), Fast Retransmit (3 dup-ACKs) e RACK (RFC 8985).
  • Full-Duplex (Duplicidade Completa): Uma vez estabelecida a conexão, os dados podem fluir em ambas as direções simultaneamente e de forma independente. O cliente pode enviar dados enquanto recebe dados do servidor. Cada lado mantém seu próprio número de sequência e ACK.
  • Orientado ao Fluxo de Bytes (Byte Stream): O TCP trata os dados como um fluxo contínuo de bytes, não como blocos distintos. Ele gerencia a fragmentação e a remontagem dos dados transparentemente para a aplicação. As fronteiras entre send()s consecutivos são perdidas — a aplicação precisa implementar framing próprio.
  • Ponto-a-Ponto: Não suporta multicast nem broadcast. Cada conexão envolve exatamente dois endpoints (par IP:porta).

3. Serviços e Mecanismos

Para cumprir suas promessas de confiabilidade, o TCP implementa um conjunto complexo de mecanismos de controle:

  • Numeração de Sequência (Sequence Numbering): Cada byte enviado é numerado (32 bits). Isso permite ao receptor identificar lacunas (pacotes perdidos) e remontar pacotes que chegaram fora de ordem. Com 32 bits a 10 Gbps, o número "dá a volta" em ~34 minutos — RFC 1323 PAWS evita ambiguidade.
  • Controle de Erro (Error Control): Utiliza checksums para detectar corrupção e ACKs (Acknowledgments) para confirmar o recebimento. Implementa Retransmissão por Timeout (se o ACK não chegar, reenvia) e Retransmissão Rápida (se receber 3 ACKs duplicados, reenvia imediatamente). SACK (RFC 2018) permite ACKs seletivos por faixa.
  • Controle de Fluxo (Flow Control): Usa o conceito de Janela Deslizante (Sliding Window). O receptor anuncia ao remetente quanta memória (buffer) ele tem disponível (rwnd - Receiver Window). O remetente nunca envia dados mais rápido do que o receptor pode processar, evitando sobrecarga.
  • Controle de Congestionamento (Congestion Control): O TCP monitora a saúde da rede. Se detectar congestionamento (perdas de pacotes), reduz agressivamente sua taxa de envio (cwnd - Congestion Window). Algoritmos como Slow Start, Congestion Avoidance e Fast Recovery gerenciam isso dinamicamente para evitar o colapso da internet.
  • Multiplexação: Portas de 16 bits (0-65535) permitem múltiplas conexões simultâneas no mesmo host, separadas pelo par IP:porta de origem e destino.

4. Estrutura do Segmento TCP

A unidade de dados do TCP é chamada de Segmento. O cabeçalho do TCP é maior e mais complexo que o do UDP (mínimo de 20 bytes), contendo os campos necessários para a gestão da conexão:

Campo Tamanho Função
Source Port 16 bits Porta do processo remetente
Destination Port 16 bits Porta do processo receptor
Sequence Number 32 bits Número do primeiro byte de dados neste segmento
ACK Number 32 bits Próximo byte esperado (válido se ACK=1)
Data Offset 4 bits Tamanho do cabeçalho em palavras de 32 bits
Reserved 4 bits Reservado (zero)
Flags (CWR, ECE, URG, ACK, PSH, RST, SYN, FIN) 8 bits Bits de controle
Window Size 16 bits Espaço livre no buffer de recepção (rwnd)
Checksum 16 bits Verificação de integridade (pseudo-cabeçalho + payload)
Urgent Pointer 16 bits Posição do dado urgente (válido se URG=1)
Options (variable) 0-40 bytes MSS, Window Scale, SACK, Timestamps, etc.

Flags TCP

  • SYN: Sincroniza números de sequência (handshake).
  • ACK: Confirma recebimento de dados.
  • FIN: Encerra a conexão (não há mais dados a enviar).
  • RST: Reset abrupto da conexão (erro ou recusa).
  • PSH: Push — entrega imediata à aplicação, sem bufferizar.
  • URG: Dado urgente (ponteiro urgente indica offset).
  • ECE / CWR: ECN (Explicit Congestion Notification) — sinalização de congestionamento sem perda.

5. O Ciclo de Vida da Conexão

O TCP gerencia explicitamente o início e o fim da comunicação:

  1. Estabelecimento (Handshake de Três Vias):
    • Cliente envia SYN: "Quero conectar".
    • Servidor responde SYN-ACK: "Recebi, aceitei e também quero conectar".
    • Cliente envia ACK: "Confirmado".
  2. Transferência de Dados: Troca de segmentos contendo dados e ACKs. As janelas deslizantes se ajustam dinamicamente. O controle de congestionamento regula o ritmo.
  3. Encerramento (Four-Way Handshake):
    • Lado A envia FIN: "Terminei de enviar".
    • Lado B envia ACK: "Entendi".
    • Lado B envia FIN: "Também terminei".
    • Lado A envia ACK: "Confirmado", e espera 2·MSL (Maximum Segment Lifetime, ~2 min) em TIME-WAIT antes de fechar o TCB.

Estados TCP

CLOSED → LISTEN (servidor) → SYN-RECEIVED → ESTABLISHED (servidor)
CLOSED → SYN-SENT → ESTABLISHED (cliente) → FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED (initiator)
ESTABLISHED → CLOSE-WAIT → LAST-ACK → CLOSED (receptor do FIN)

6. Cálculo de Throughput Máximo

A taxa máxima teórica de uma conexão TCP é limitada pelo BDP (Bandwidth-Delay Product) e pela janela de recepção:

Throughput_máximo = rwnd / RTT

Exemplo: enlace de 1 Gbps, RTT 100 ms:
- BDP = 1 Gbps × 0,1 s = 12,5 MB.
- Sem Window Scaling (rwnd máx 64 KiB), throughput máx = 64 KiB / 0,1 s = 640 Kbps (catastrófico).
- Com Window Scaling (shift 7, rwnd 8 MiB), throughput máx = 8 MiB / 0,1 s = 320 Mbps (razoável).

Por isso, em enlaces de longa distância, é essencial habilitar Window Scaling e buffers TCP grandes (Linux: tcp_rmem, tcp_wmem).

7. Algoritmos de Congestionamento

O TCP moderno oferece múltiplos algoritmos, escolhidos via sysctl net.ipv4.tcp_congestion_control:

Algoritmo Ano Característica Default em
Tahoe 1988 Slow Start + AIMD + Fast Retransmit (sem recovery) —
Reno 1990 Tahoe + Fast Recovery —
NewReno 1999 Reno com múltiplas perdas por janela FreeBSD
Vegas 1995 Baseado em atraso, não perda —
Cubic 2008 Função cúbica para crescimento da cwnd Linux (até 5.x)
BBR 2016 Mede banda/RTT em vez de perda Google, Linux 4.9+ opcional
Lollipop, DCTCP, BIC, Westwood, Hybla vários Variantes específicas —
# Ver algoritmo atual e disponíveis:
sysctl net.ipv4.tcp_congestion_control
sysctl net.ipv4.tcp_available_congestion_control

# Habilitar BBR (Linux 4.9+):
sysctl -w net.ipv4.tcp_congestion_control=bbr
sysctl -w net.core.default_qdisc=fq

8. O Papel do TCP na Internet Moderna

O TCP é responsável pela estabilidade da internet. Sua capacidade de se adaptar à congestão (reduzindo a velocidade quando a rede está cheia) é o que impede que a internet global entre em colapso devido ao excesso de tráfego. Ao contrário do UDP, que pode ser "egoísta" e inundar a rede, o TCP é um "cidadão cooperativo" que se ajusta às condições do tráfego.

É o protocolo padrão para HTTP (Web), HTTPS (Web Segura), SMTP (E-mail), FTP (Transferência de Arquivos), SSH (Acesso Remoto) e TLS/SSL (Criptografia), formando a base da comunicação segura e íntegra na era da informação.

Com o surgimento do QUIC (RFC 9000, 2021), o TCP começa a perder espaço para o HTTP/3 — mas o modelo conceitual do TCP (handshake, janela, controle de congestionamento) permanece como base teórica de qualquer protocolo de transporte confiável.


Tip

Para uma análise de conexões TCP no Linux: ss -tan state established lista as ativas; ss -ti mostra detalhes internos (cwnd, rtt, rwnd, ssthresh). Para estatísticas globais: nstat -az Tcp* ou cat /proc/net/tcp.