Transporte e endereçamento na Internet (UDP, TCP, IPv4/IPv6)

3.3 Transporte não orientado para conexão: UDP

O UDP (User Datagram Protocol) é o transporte mais simples da pilha: ele apenas faz multiplexação/demultiplexação entre processos e pode incluir verificação de erros básica. Não há construção de conexão nem confirmação de entrega. Em termos práticos, isso significa que:

  • O remetente entrega mensagens diretamente para a rede sem acordos prévios com o destinatário.
  • O destinatário utiliza os números de porta para entregar os dados ao processo correto.
  • Não há estado de conexão nos roteadores/intermediários; o UDP não negocia nem mantém estado entre as extremidades.

Por que usar UDP? Em aplicações sensíveis a atraso ou que podem tolerar alguma perda de dados, o UDP serve para ter menor sobrecarga, controle direto na camada de aplicação (quando necessário) e evitar o atraso de estabelecimento de conexão. Exemplos:

  • DNS usa UDP para consultas rápidas (a resposta pode não chegar, e a aplicação pode consultar outro servidor).
  • SNMP para gerenciamento de rede também usa UDP, especialmente quando a rede está congestionada.
  • Em multimídia em tempo real, algumas aplicações utilizam UDP com mecanismos de proteção na própria aplicação.

Estrutura do segmento UDP (RFC 768):

  • Campo de porta de origem (16 bits)
  • Campo de porta de destino (16 bits)
  • Campo de comprimento (16 bits) – inclui cabeçalho UDP
  • Campo de soma de verificação (16 bits) – verificação de erros
  • Dados da aplicação (payload)

Exemplo prático: o DNS envia consultas e respostas como mensagens UDP, sem negociação de conexão, para manter a latência baixa. Se a consulta não for respondida, a aplicação pode consultar outro servidor de nomes.

3.3.1 Estrutura do segmento UDP

O cabeçalho UDP tem 4 campos de 2 bytes cada, totalizando 8 bytes de overhead. O checksum utiliza também o campo de dados para detecção de erros, mas o UDP não reserva muitos recursos além disso. O campo comprimento garante que o datagrama UDP caiba no MTU do enlace.

3.5 Transporte orientado para conexão: TCP

O TCP (Transmission Control Protocol) fornece serviço confiável, orientado a conexão. Antes de trocar dados, dois hosts devem estabelecer uma conexão via o chamado handshake de três vias (3-way handshake):

  1. Cliente envia um segmento TCP com o flag SYN (request de abertura de conexão).
  2. Servidor responde com um segmento com SYN+ACK (confirmação).
  3. Cliente envia um ACK final para confirmar a abertura da conexão.

Após o estabelecimento, dados são enviados em segmentos TCP. Cada segmento carrega números de sequência e de reconhecimento. O número de sequência se aplica a cada byte da cadeia de dados, não ao conjunto de segmentos. O destinatário envia reconhecimento cumulativo para indicar até qual byte recebeu com sucesso.

Exemplo de Telnet (padrão RFC 854) para ilustrar: suponha seq. inicial 42 (cliente) e 79 (servidor). O cliente envia o caractere 'C' (byte 1) com seq 42; o servidor reconhece com ack 43 e envia 'C' de volta com seq 79; o cliente envia um ACK com ack 80 para confirmar os bytes recebidos. Esse é o conceito de reconhecimento piggyback quando um segmento carrega dados e reconhecimento ao mesmo tempo.

Formato do datagrama TCP

O segmento TCP possui:

  • Porta de origem e porta de destino
  • Números de sequência (32 bits) e reconhecimento (32 bits)
  • Janela de recepção (flow control)
  • Comprimento do cabeçalho (componente de opções)
  • Flags: ACK, SYN, FIN, RST, PSH, URG
  • Checksum
  • Opções (MSS, janelas escalonadas, temporizadores, etc.)

Números de sequência e reconhecimento:

  • O número de sequência é o número do primeiro byte do segmento na cadeia de dados.
  • O número de reconhecimento é o próximo byte esperado do fluxo oposto (reconhecimento cumulativo).
  • Pacotes fora de ordem podem ser mantidos até que os bytes faltantes cheguem, para maior eficiência.

Telnet: estudo de caso para números de sequência/reconhecimento

Exemplo com números aleatórios de sequência, como descrito no material: o cliente envia 'C' com seq 42, o servidor responde com ack 43 carregando também dados, e o cliente encerra com ack 80. Isso ilustra como a contagem de bytes e os ack trabalham juntos na conexão TCP.

Formato do datagrama (Resumo)

O segmento TCP é mais pesado que UDP (tipicamente 20 bytes a mais para cabeçalho); essencial para a confiabilidade, controle de fluxo e controle de congestão.

4.4.1 Formato do datagrama IPv4

O datagrama IPv4 contém:

  • Versão (4 bits)
  • Comprimento do cabeçalho (IHL, 4 bits) – tamanho do cabeçalho em palavras de 32 bits
  • Tipo de serviço (ToS)
  • Tamanho total (header + dados, 16 bits)
  • Identificação, Flags, Deslocamento de fragmentação
  • Tempo de vida (TTL)
  • Protocolo (valor que indica TCP/UDP/ICMP etc.)
  • Soma de verificação do cabeçalho
  • Endereços IP de origem e destino
  • Opções (opcional)
  • Dados (payload – pode ser um segmento TCP/UDP ou outra carga)

Fragmentação: quando MTU de um enlace é menor que o datagrama, o IP pode fragmentar o datagrama em fragmentos. A reconstrução fica para o hospedeiro destino. Cada fragmento carrega um identificador, deslocamento e um bit de flag de "mais fragmentos" (MF). Exemplo típico: datagrama de 4.000 bytes de payload pode ser fragmentado em 3 fragmentos com deslocamentos 0, 185 e 370 (em unidades de 8 bytes).

Observação: o datagrama IP típico chega sem opções, com cabeçalho de 20 bytes, mas o tamanho pode variar.

4.4.2 Endereçamento IPv4

Endereçamento IP usa 32 bits divididos em rede e host. CIDR (Classless Inter-Domain Routing) generaliza a ideia de sub-rede com o formato a.b.c.d/x, onde x é o comprimento do prefixo da rede.

Sub-redes agrupam interfaces com prefixos comuns (ex.: 223.1.1.0/24). CIDR reduz o tamanho das tabelas de roteamento na Internet, permitindo anunciar prefixos agregados. Endereços IP são atribuídos por organizações via ARIN/RIPE/APNIC/ etc.

Exemplos de representação de sub-redes e endereços privados (NAT) e a ideia de NAT (tradução de endereços) para permitir múltiplas máquinas comuns compartilharem uma única saída para a Internet.

DHCP: atribuição dinâmica de endereços e informações de rede para hosts; NAT oferece uma solução prática para escassez de endereços públicas.

Observação sobre NAT: facilita conectividade de redes domésticas, mas pode interferir com algumas aplicações P2P/VoIP e viola conceitos de fim-a-fim.

4.4.4 IPv6

IPv6 amplia o espaço de endereços para 128 bits (unicast, multicast, anycast). Cabeçalho fixo de 40 bytes, sem somas de verificação de cabeçalho, e sem fragmentação em roteadores (fragmentação fica para os hosts finais).

Principais mudanças: endereços 128 bits, class de tráfego, fluxo, próximas camadas, e suporte a novos recursos como multicast amplo. Transição: operações com pilha dupla (dual-stack) ou encapsulamento/túneis para permitir interoperabilidade IPv4/IPv6.

Questões sobre o assunto

Questão 1 (média): Quais das opções abaixo descrevem corretamente o UDP?
1,50 pontos MÉDIA

Resposta correta: C) Não estabelece conexão e não mantém estado, oferecendo multiplexação/demultiplexação simples.

Observação: UDP opera com mínimo overhead, não há handshake nem confidência de entrega; aplicações podem implementar confiabilidade na camada de aplicação se desejarem.

Questão 2 (difícil): No TCP, o que representa o número de sequência?
2,50 pontos DIFÍCIL

Resposta correta: A) O número de sequência é o inteiro do primeiro byte do segmento de dados.

Observação: no TCP, os números de sequência são aplicados sobre a cadeia de bytes do fluxo, não ao conjunto de segmentos.

Questão 3 (difícil): Em IPv6, por que a fragmentação não é realizada nos roteadores?
2,50 pontos DIFÍCIL

Resposta correta: C) Fragmentação e remontagem são feitas apenas nos hospedeiros finais.

Observação: IPv6 elimina a fragmentação em roteadores para acelerar o encaminhamento; se o datagrama for muito grande, o remetente/host final reenvia com MTU adequado.

Questão 4 (extremamente difícil): Considere um datagrama IPv4 com payload de 4000 bytes e identificador 777, enviado sobre um enlace com MTU de 1500 bytes (incluindo cabeçalhos). Quais seriam os tamanhos de payload dos fragmentos e os deslocamentos em unidades de 8 bytes para os fragmentos resultantes?
3,50 pontos EXTREMA

Resposta correta: B) Fragmentos: payload 1480, 1480, 1040; deslocamentos 0, 185, 370.

Justificativa: cada fragmento, exceto o último, deve ter payload múltiplo de 8 bytes. Aqui, 4000 = 1480 + 1480 + 1040; deslocamentos são calculados em unidades de 8 bytes: 0, 1480/8 = 185, 2960/8 = 370.

Pontuação Total
0.00