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

01 - Apenas Detecção de Erros

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Apenas Detecção de Erros (Error Detection Only)

1. Definição

A característica do UDP de realizar apenas a detecção de erros (e não a correção automática) reflete sua filosofia de design de ser leve e rápido. O UDP é responsável por identificar se um datagrama chegou corrompido, mas não se responsabiliza por consertar o problema através da retransmissão.

Essa abordagem é um ponto médio crucial entre a total falta de verificação (que permitiria dados corrompidos nas aplicações) e a confiabilidade pesada do TCP (que detecta o erro, pede retransmissão e reordena os dados).

2. O Mecanismo: O Checksum do UDP

O UDP possui um campo de Checksum de 16 bits em seu cabeçalho. Esse é o mecanismo primário (e único) de detecção de erros.

2.1 Algoritmo Utilizado

O checksum do UDP não é um CRC sofisticado, mas sim uma soma de complemento de um (ones' complement sum) de 16 bits. Esse algoritmo foi escolhido em 1980 porque:

  • Pode ser calculado em software de forma muito eficiente em CPUs de 16/32 bits da época.
  • Permite que bytes sejam somados em qualquer ordem, facilitando o checksum incremental em roteadores.
  • Tem fraca detecção de erros comparado a CRC-32, mas é suficiente para a maioria das corrupções aleatórias.

2.2 Cálculo Passo a Passo

1. Montar o "pseudo-cabeçalho" (12 bytes):
   +--------+--------+--------+--------+
   |           Source Address           |
   +--------+--------+--------+--------+
   |        Destination Address         |
   +--------+--------+--------+--------+
   |  zero  |Protocol |   UDP Length   |
   +--------+--------+--------+--------+

2. Concatenar: pseudo-cabeçalho + cabeçalho UDP + payload
   (com padding de zeros se o tamanho for ímpar)

3. Somar todas as palavras de 16 bits em complemento de um
4. Adicionar os carrys de volta à soma
5. Negar o resultado (complemento de um)
6. Inserir o valor de 16 bits no campo Checksum

Se o cálculo resultar em 0x0000, ele é transmitido como 0xFFFF (porque 0x0000 significa "checksum desabilitado" em IPv4).

2.3 Verificação no Receptor

O receptor realiza o mesmo cálculo matemático sobre o pacote recebido. Se o resultado for 0xFFFF (todos os bits em 1), o pacote está íntegro. Qualquer outro valor indica corrupção.

3. Ação Tomada: Descarte Silencioso

A grande diferença entre "apenas detecção" e "correção de erros" (como no TCP) está na ação subsequente à descoberta de um erro.

  • Descarte Imediato: Se o receptor detecta um erro de checksum, ele descarta o datagrama inteiro imediatamente. Os dados não são passados para a aplicação.
  • Sem Retransmissão: O protocolo UDP não envia nenhuma notificação de volta ao emissor dizendo "Cheguei corrompido, manda de novo". O emissor nunca ficará sabendo que o pacote foi perdido por corrupção.
  • Silêncio Absoluto: Para a aplicação no destino, é como se o pacote nunca tivesse existido. Para o emissor, o pacote foi enviado com sucesso (do ponto de vista da camada de transporte). A "falha" é invisível para o UDP.

Diagrama de Decisão

Datagrama chega ao host receptor
            |
            v
   Calcular checksum local
            |
            v
   Checksum local == recebido?
       /              \
      Sim              Não
       |                |
       v                v
  Entregar à       Descartar
  aplicação        silenciosamente
                   (sem ICMP, sem ACK)

4. Opcionalidade no IPv4 vs. Obrigatoriedade no IPv6

Uma nuance histórica e técnica importante sobre o checksum do UDP:

4.1 IPv4 - Opcional

No datagrama IPv4 original (RFC 768), o uso do checksum UDP era opcional. Se o campo Checksum fosse preenchido com todos zeros (0x0000), isso significava que o checksum estava desabilitado. Isso significava que datagramas corrompidos poderiam ser entregues para a aplicação. Em prática, quase todos os sistemas operacionais modernos habilitam o checksum por padrão para segurança.

4.2 IPv6 - Obrigatório

Para eliminar ambiguidades e aumentar a confiabilidade, a especificação do IPv6 (RFC 2460/8200) tornou o checksum UDP obrigatório. Como o IPv6 removeu o checksum do cabeçalho IP (para acelerar o roteamento), o checksum do UDP se tornou a única linha de defesa contra corrupção de dados na Camada de Transporte. Em IPv6, o valor 0x0000 é inválido (se o cálculo resultar em 0, transmite-se 0xFFFF).

5. O Pseudo-Cabeçalho e a Proteção contra Roteamento Errado

O checksum do UDP é especial porque ele inclui um pseudo-cabeçalho derivado do cabeçalho IP. Isso é uma proteção adicional que não existe em outros protocolos simples.

5.1 Por que isso importa?

Garante que o datagrama UDP foi entregue ao host correto. Se um roteador cometer um erro de roteamento e entregar o pacote para o computador errado (mas na porta correta), o cálculo do checksum falhará (pois os endereços IP no pseudo-cabeçalho não corresponderão aos esperados pelo UDP daquele host) e o pacote será descartado.

5.2 Em IPv6

O pseudo-cabeçalho IPv6 inclui os 128 bits de origem e destino (16 bytes cada), o comprimento do payload e o campo "Next Header" (17 para UDP). Isso oferece uma verificação ainda mais robusta que em IPv4.

6. Diferença Crítica em Relação ao TCP

Comparar o UDP com o TCP esclarece o conceito de "apenas detecção":

Característica UDP (Apenas Detecção) TCP (Detecção e Correção)
Descoberta de Erro Receptor calcula Checksum Receptor calcula Checksum
Ação ao detectar Descarta o pacote Descarta o pacote
Feedback ao Emissor Nenhum Receptor não acusa → emissor detecta via timeout ou 3 ACKs duplicados
Recuperação Nenhuma (o dado é perdido) Requisita retransmissão do segmento
Custo computacional Baixo Alto (buffers, timers, janelas)
Latência Mínima Pode aumentar com retransmissões
Impacto na Aplicação Aplicação nunca vê o dado corrompido, mas também não sabe que ele se perdeu Aplicação não vê o dado corrompido e, eventualmente, recebe o dado íntegro

7. Limitações do Checksum UDP

Embora eficaz para detecção de corrupção aleatória, o checksum do UDP tem limitações importantes:

  • Apenas 16 bits: Há probabilidade de 1 em 65536 de uma corrupção não ser detectada. Em links de alta taxa (10 Gbps), isso ocorre estatisticamente.
  • Não detecta erros sistemáticos: Troca de bytes inteiros pode passar despercebida em casos raros.
  • Vulnerável a bursts curtos: O complemento-de-um detecta erros de bursts de até 16 bits adjacente, mas falha em padrões específicos.

Para compensar, modern Ethernet usa FCS CRC-32 no enlace (camada 2), que captura a maioria das corrupções antes mesmo do IP. Em data centers, há também o uso de PFC (Priority Flow Control) e ECN para sinalizar congestionamento antes que cause corrupção por overflow.

8. Justificativa de Performance

A razão para o UDP parar na detecção é o custo da correção.

  • Correção é Cara: Corrigir erros envolve manter cópias dos dados enviados (buffers), gerenciar timers, processar ACKs e retransmitir. Isso consome CPU e memória (RAM).
  • Aplicações Específicas: Muitas aplicações que usam UDP (como VoIP ou streaming de vídeo) preferem perder o pacote corrompido (ou atrasado) a esperar por uma retransmissão. Retransmitir um quadro de vídeo que já passou na tela é inútil. Portanto, a "detecção apenas" serve como um filtro de lixo: remove o dado ruim para não poluir a aplicação, mas não gasta esforço recuperando-o.

9. Offloading de Checksum para Hardware

Para reduzir a carga da CPU em altas taxas, NICs modernas suportam TX/RX checksum offloading:

# Verificar offloading no Linux
$ ethtool -k eth0 | grep offload
tx-checksum-ip-generic: on
rx-checksumming: on
tx-checksum-udp: on

# Habilitar/desabilitar
$ sudo ethtool -K eth0 tx off rx off

A NIC calcula o checksum UDP/IP no momento da transmissão (após o kernel enviar o pacote sem checksum), e verifica-o na recepção antes de entregar ao kernel. Isso reduz drasticamente o overhead em servidores de alto tráfego DNS, NTP e streaming.

10. Resumo Técnico

Atributo Valor
Campo no cabeçalho 16 bits
Algoritmo Ones' complement sum
Obrigatório em IPv4? Não (0 = desabilitado)
Obrigatório em IPv6? Sim (sempre calculado)
Inclui pseudo-cabeçalho? Sim (origem + destino + proto + len)
Ação em caso de erro Descarte silencioso
Offloading suportado? Sim (NICs modernas)
RFC de referência RFC 768 (1980), RFC 2460/8200 (IPv6)

11. Conclusão

A política de "apenas detecção de erros" do UDP é um exemplo clássico de alinhamento entre o design do protocolo e o tipo de tráfego que ele serve. Para aplicações em tempo real, onde a frescor dos dados supera a integridade perfeita, descartar pacotes corrompidos silenciosamente é a estratégia ótima. Combinado com o checksum pseudo-cabeçalho (que protege contra erros de roteamento) e o offloading de hardware, o UDP oferece um equilíbrio elegante entre segurança mínima e máxima performance.