06 - TCP vs UDP - Comparação
video: https://youtu.be/... no frontmatter da nota.TCP vs UDP - Comparação
A Camada de Transporte oferece dois protocolos principais para entrega de dados entre processos: o TCP (Transmission Control Protocol), definido na RFC 793, e o UDP (User Datagram Protocol), definido na RFC 768. Ambos operam sobre o IP e usam portas para multiplexação, mas têm filosofias radicalmente diferentes — e isso determina quando usar cada um.
1. Visão Geral
| Característica | TCP | UDP |
|---|---|---|
| Conexão | Orientado à conexão (handshake) | Sem conexão |
| Confiabilidade | Garantida (ACKs, retransmissão) | Não confiável (best-effort) |
| Ordenação | Entrega em ordem | Ordem de chegada |
| Fluxo de dados | Stream contínuo de bytes | Mensagens (datagramas) |
| Controle de fluxo | Sim (Sliding Window) | Não |
| Controle de congestionamento | Sim (cwnd, Slow Start, AIMD) | Não |
| Controle de erro | Checksum + retransmissão | Apenas checksum |
| Cabeçalho mínimo | 20 bytes | 8 bytes |
| Multicast / Broadcast | Não suporta | Suporta |
| RFC de referência | 793 (complementar: 7323, 2018, 5681, 6298) | 768 |
| Exemplos de uso | HTTP/HTTPS, SMTP, FTP, SSH, SMTP/IMAP | DNS, DHCP, NTP, SNMP, VoIP (RTP), QUIC |
2. Características Detalhadas
TCP (Transmission Control Protocol)
- Orientado à Conexão: Antes de enviar dados, estabelece uma conexão lógica via Three-Way Handshake (SYN, SYN-ACK, ACK). Sincroniza números de sequência (ISN) e aloca buffers nos dois lados.
- Confiável: Garante entrega usando ACKs cumulativos, retransmissão por timeout (RTO) e retransmissão rápida (3 dup-ACKs). Implementa SACK (RFC 2018) para recuperação seletiva.
- Ordem: Cada byte é numerado; o receptor reordena os segmentos antes de entregar à aplicação. A aplicação sempre vê o fluxo na ordem original.
- Stream de bytes: Os dados são tratados como um fluxo contínuo, sem preservação de fronteiras de
send(). A aplicação precisa implementar framing próprio (delimitador, prefixo de comprimento). - Controle de Fluxo (Flow Control): Janela deslizante com
rwndanunciado pelo receptor — o remetente nunca envia mais do que o receptor tem espaço de buffer. - Controle de Congestionamento (Congestion Control): Algoritmos Slow Start, Congestion Avoidance (AIMD), Fast Retransmit, Fast Recovery. Variantes modernas: Reno, NewReno, Cubic (default Linux), BBR (Google).
- Custo: Cabeçalho grande (mínimo 20 bytes, tipicamente 32-40 com opções), overhead de processamento, latência de handshake (1-2 RTT antes do primeiro dado), estado por conexão na memória do kernel.
UDP (User Datagram Protocol)
- Sem Conexão: Não há handshake. O
sendto()vai direto ao destino; o receptor pode nem estar ouvindo. - Não Confiável: Sem ACKs, sem retransmissão. Pacotes perdidos são silenciosamente descartados. Cabe à aplicação (se quiser) implementar recuperação.
- Sem Ordenação: Cada datagrama é roteado independentemente e pode chegar em qualquer ordem. Aplicação precisa reordenar se necessário.
- Preserva Fronteiras: Cada
sendto()vira um datagrama; cadarecvfrom()lê um datagrama completo. As fronteiras da mensagem são preservadas. - Sem Controle de Fluxo/Congestionamento: O UDP envia o mais rápido que a aplicação pedir. Pode saturar a rede e o receptor — aplicação deve regular.
- Apenas Checksum: Detecção de corrupção; em IPv4, checksum é opcional (mas recomendado). Em IPv6, é obrigatório.
- Custo: Cabeçalho mínimo de 8 bytes (Source Port, Dest Port, Length, Checksum). Não há estado de conexão; é possível abrir milhões de sockets UDP com baixo consumo.
3. Cabeçalho Comparado
Cabeçalho UDP (8 bytes fixos)
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source Port | Dest. Port | 4 bytes
+--------+--------+--------+--------+
| Length | Checksum | 4 bytes
+--------+--------+--------+--------+
| payload (até 65535 - 8 - 20 = 65507 bytes IPv4) |
+---------------------------------------------------+
Cabeçalho TCP (20 bytes mínimos + opções)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window | 4 bytes
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer | 4 bytes
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (variable, 0-40 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O TCP carrega 5x mais overhead por pacote — em transferências de pequenos datagramas (DNS, IoT), a economia de 12 bytes por pacote do UDP é significativa.
4. Aplicações Típicas
Quando usar TCP
- Transferência de arquivos (FTP, HTTP, SFTP): cada byte deve chegar íntegro e em ordem.
- E-mail (SMTP, IMAP, POP3): a mensagem completa é necessária.
- Acesso remoto (SSH, Telnet, RDP): interação interativa, baixa perda.
- Web (HTTP/1.1, HTTP/2): a integridade da página depende de todos os recursos.
- Bancos de dados remotos (MySQL, PostgreSQL): transações devem ser confiáveis.
Quando usar UDP
- Consultas curtas (DNS, NTP, mDNS): request/response pequeno, retransmissão fácil.
- Tempo real (VoIP/RTP, vídeo streaming, jogos online): perda de um quadro é preferível a retransmissão atrasada.
- Descoberta e anúncio (DHCP, ARP via socket, mDNS, SNMP trap): multicast/broadcast necessário.
- Túneis (WireGuard, OpenVPN UDP mode, IPSec/ESP): baixa latência sobre VPN.
- Aplicações customizadas (QUIC, KCP): implementam sua própria confiabilidade sobre UDP para evitar problemas do TCP como head-of-line blocking.
5. Tabela Decisória Prática
| Requisito da Aplicação | Escolha | Justificativa |
|---|---|---|
| Cada byte deve chegar | TCP | Garantia de entrega |
| Latência baixa é crítica | UDP | Sem handshake, sem retransmissão |
| Ordem importa | TCP | Numeração de sequência |
| Multicast | UDP | TCP é ponto-a-ponto |
| Transferência grande única | TCP | Streaming de bytes, janela deslizante |
| Pequena consulta periódica | UDP | DNS, SNMP |
| Interativo em tempo real | UDP | VoIP, jogos |
| Transporte em túnel | UDP | Menor overhead, melhor sob perda |
| Conexões persistentes com fluxo contínuo | TCP | Sessão mantida |
6. Tendências Modernas
- QUIC (Quick UDP Internet Connections, RFC 9000): Criado pelo Google, roda sobre UDP e substitui o TCP para HTTP/3. Implementa confiabilidade, controle de fluxo e congestionamento na camada de aplicação. Resolve dois problemas do TCP: handshake lento (combina TLS 1.3 + handshake em 1 RTT ou 0 RTT para conexões repetidas) e head-of-line blocking (cada stream QUIC é independente).
- TCP BBR (Bottleneck Bandwidth and Round-trip propagation time): Algoritmo de congestionamento do Google (disponível no Linux 4.9+) que substitui o modelo baseado em perdas por modelo baseado em medição de banda e RTT, melhorando throughput em redes sem perdas (ex: redes celulares 4G/5G).
- TCP Fast Open (RFC 7413): Permite enviar dados no SYN, economizando 1 RTT.
- MPTCP (RFC 6824): TCP multipath, permite uma conexão TCP usar múltiplos caminhos (Wi-Fi + 4G simultaneamente).
7. Conclusão
TCP e UDP não competem — complementam-se. O TCP é a ferramenta quando a confiabilidade e a ordem são inalienáveis; o UDP é a ferramenta quando a velocidade, a flexibilidade e a multicasting importam mais. Conhecer os prós e contras de cada um é essencial para projetar aplicações de rede eficientes e para diagnosticar problemas de performance em produção.
Em Linux, a lista de sockets pode mostrar a diferença: ss -t mostra conexões TCP estabelecidas (com estado, janela, etc.); ss -u mostra apenas sockets UDP locais aguardando (sem estado). Para ver estatísticas: ss -ti (TCP interno), ss -ui (UDP interno). Em capturas com tcpdump, o filtro tcp or udp captura ambos; udp e tcp isolam cada protocolo.