Hoje vamos mergulhar nos protocolos da camada de transporte do modelo TCP/IP. Essa camada é fundamental porque oferece comunicação lógica entre processos de aplicação rodando em hosts distintos. Diferente da camada de rede, que fornece comunicação entre hosts (endereçamento IP), a camada de transporte trabalha com multiplexação e demultiplexação através do conceito de portas. Basicamente, ela pega os dados da camada de aplicação e os segmenta (ou não) para a camada de rede. Vamos focar nos dois principais protocolos dessa camada: TCP (Transmission Control Protocol) e UDP (User Datagram Protocol).
Visão Geral da Camada de Transporte
A camada de transporte atua como uma ponte entre a camada de aplicação e a camada de rede. Ela é responsável por multiplexar/demultiplexar os dados, utilizando portas (portas TCP/UDP) para identificar qual aplicação deve receber os dados. Um pacote chega com um número de porta de destino, e o sistema operacional encaminha para o processo correto.
As portas são numeradas de 0 a 65535. As portas bem conhecidas (0 a 1023) são reservadas para serviços padrão como HTTP (80), HTTPS (443), DNS (53) e SSH (22). Portas registradas (1024 a 49151) são usadas por aplicações específicas, e portas efêmeras/dinâmicas (49152 a 65535) são usadas temporariamente pelos clientes durante uma conexão.
Dois protocolos dominam esta camada: TCP e UDP, cada um com características e casos de uso específicos que vamos detalhar a seguir.
Protocolo UDP (User Datagram Protocol)
O UDP é um protocolo simples, sem conexão (connectionless) e não confiável. Não há handshake antes da transmissão. O processo de origem simplesmente encapsula os dados em um segmento UDP — cabeçalho de apenas 8 bytes contendo portas de origem e destino, comprimento e um checksum opcional — e entrega à camada de rede. Não há retransmissão, garantia de ordem, confirmação de recebimento (ACK) nem controle de fluxo ou congestionamento.
Isso traz vantagens em termos de latência e overhead, tornando o UDP ideal para aplicações em tempo real onde a perda eventual de um pacote é aceitável, mas o atraso não é. Exemplos clássicos incluem:
- Voice over IP (VoIP) e videochamadas
- Streaming de vídeo ao vivo
- Jogos online multiplayer
- Consultas DNS (Domain Name System)
- DHCP (Dynamic Host Configuration Protocol)
- SNMP (Simple Network Management Protocol)
A natureza stateless do UDP também o torna útil para aplicações que implementam seus próprios mecanismos de confiabilidade na camada de aplicação, como o protocolo QUIC (usado no HTTP/3).
Protocolo TCP (Transmission Control Protocol)
O TCP é o oposto do UDP: é orientado à conexão, confiável e possui controle de fluxo e congestionamento. Ele garante que os dados sejam entregues ao destino na ordem correta, sem perdas e sem duplicação.
Three-way Handshake
Antes de transmitir dados, o TCP estabelece uma conexão lógica através do three-way handshake. O processo funciona assim:
- SYN: O cliente envia um segmento com o flag SYN ativo, informando seu número de sequência inicial.
- SYN-ACK: O servidor responde com SYN-ACK, confirmando o recebimento e enviando seu próprio número de sequência.
- ACK: O cliente confirma o recebimento do SYN-ACK e a conexão está estabelecida.
Esse processo consome 1 RTT (Round Trip Time) antes de qualquer dado ser enviado, mas garante que ambos os lados estejam prontos para a comunicação.
Confiabilidade e Controle
O TCP utiliza números de sequência e acknowledgment (ACK) para garantir a entrega. Cada segmento enviado deve ser confirmado pelo receptor. Se o remetente não receber um ACK dentro de um tempo determinado (timeout), ele retransmite o segmento.
O controle de fluxo utiliza uma janela deslizante (sliding window) que permite ao transmissor enviar múltiplos segmentos antes de receber um ACK, otimizando o uso da rede. O receptor anuncia o tamanho da sua janela (receiver window, rwnd) para que o remetente não o sobrecarregue.
Já o controle de congestionamento utiliza o conceito de janela de congestionamento (congestion window, cwnd), com algoritmos como AIMD (Additive Increase Multiplicative Decrease), Slow Start (crescimento exponencial) e Congestion Avoidance (crescimento linear). A perda de pacotes (detectada por timeout ou ACKs duplicados) faz com que o TCP reduza drasticamente a taxa de transmissão para não colapsar a rede.
Diferenças Principais entre TCP e UDP
| Característica | TCP | UDP |
|---|---|---|
| Conexão | Orientado à conexão | Sem conexão |
| Confiabilidade | Garantida (ACK + retransmissão) | Não garantida (melhor esforço) |
| Ordenação | Garante ordem | Não garante ordem |
| Controle de Fluxo | Sim (janela deslizante) | Não |
| Controle de Congestionamento | Sim (Slow Start, AIMD) | Não |
| Velocidade | Mais lento (overhead de controle) | Mais rápido |
| Tamanho do Cabeçalho | 20 bytes (mínimo, sem opções) | 8 bytes |
| Casos de Uso Típicos | HTTP, FTP, SMTP, SSH, Banco de Dados | DNS, DHCP, SNMP, TFTP, VoIP, Streaming |
Aplicações Práticas e Casos Híbridos
A escolha entre TCP e UDP depende estritamente dos requisitos da aplicação. Aplicações que precisam de transferência confiável de arquivos, como navegação web (HTTP/HTTPS), e-mail (SMTP/IMAP) e acesso remoto (SSH), utilizam TCP. A confiabilidade é crucial aqui, e o overhead do TCP é um custo aceitável.
Por outro lado, aplicações em tempo real frequentemente escolhem UDP. Em uma videochamada, perder um frame é preferível a atrasar a transmissão inteira para retransmiti-lo. O UDP proporciona a baixa latência necessária para uma experiência fluida.
Um caso híbrido interessante é o QUIC (Quick UDP Internet Connections), usado no HTTP/3. Ele roda sobre UDP, mas implementa confiabilidade, controle de congestionamento e criptografia na camada de aplicação. Isso evita o atraso do handshake TCP somado ao handshake TLS (que juntos podem levar 2-3 RTTs), reduzindo para 1 RTT (ou até 0 RTT em conexões prévias). O QUIC combina a baixa latência do UDP com a confiabilidade e segurança que esperamos do TCP+TLS.
Perguntas Frequentes
P: Qual a principal diferença entre TCP e UDP?
R: TCP é orientado à conexão e confiável, garantindo entrega e ordem dos dados através de confirmações (ACKs) e retransmissões. UDP é sem conexão e não confiável, focado em velocidade e baixa latência sem garantia de entrega.
P: Por que o TCP é usado para navegação web?
R: A navegação web (HTTP/HTTPS) exige que os dados (HTML, CSS, JS) cheguem completos e na ordem correta para renderizar a página corretamente. Qualquer perda de pacote poderia corromper a página, então a confiabilidade do TCP é essencial.
P: O que é um socket?
R: Um socket é a combinação de um endereço IP e um número de porta. Por exemplo, 192.168.1.10:443. Ele identifica unicamente um ponto final de uma conexão de rede, permitindo que múltiplas aplicações rodem simultaneamente no mesmo host sem conflito.
P: O que é o Three-way Handshake?
R: É o processo de estabelecimento de conexão do TCP, composto por três etapas: SYN, SYN-ACK e ACK. Ele sincroniza os números de sequência entre cliente e servidor e prepara ambos para a troca de dados.
P: Por que o QUIC usa UDP se precisa de confiabilidade?
R: O QUIC implementa confiabilidade e segurança na própria camada de aplicação, rodando sobre UDP para evitar o atraso de estabelecimento de conexão do TCP (handshake TCP + TLS). Isso reduz a latência inicial, mantendo uma experiência segura e confiável.