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

06 - TCP vs UDP - Comparação

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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 rwnd anunciado 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; cada recvfrom() 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.


Tip

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.