09 - Protocolo TCP
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:
- 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".
- Transferência de Dados: Troca de segmentos contendo dados e ACKs. As janelas deslizantes se ajustam dinamicamente. O controle de congestionamento regula o ritmo.
- 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-WAITantes 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.
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.