04 - Checksum
video: https://youtu.be/... no frontmatter da nota.Campo Checksum (Soma de Verificação) do Cabeçalho UDP
1. Definição e Finalidade
O campo Checksum (Soma de Verificação) é um campo de 16 bits localizado ao final do cabeçalho UDP (bytes 7 e 8). Sua função é proporcionar verificação de integridade dos dados, permitindo que o receptor detecte se o datagrama sofreu alterações (erros de bits) durante o trânsito pela rede.
Embora o UDP seja um protocolo "melhor esforço" e não confiável, ele oferece este mecanismo básico de segurança para garantir que, se um dado for entregue à aplicação, ele não esteja corrompido. Se o checksum falhar, o pacote é silenciosamente descartado, sem qualquer notificação ao emissor.
Características Formais
- Tamanho: 16 bits (2 bytes)
- Posição: Bytes 7-8 do cabeçalho UDP
- Endianness: Big-endian (network byte order)
- Cobertura: Cabeçalho UDP + Payload + Pseudo-cabeçalho IP
- RFC de referência: RFC 768 (1980), RFC 2460 (IPv6)
2. O Algoritmo: Soma em Complemento de Um
O checksum do UDP utiliza o mesmo algoritmo matemático de soma em complemento de um usado no cabeçalho IP, mas com uma abrangência maior.
Processo de Cálculo (Emissor)
- O datagrama UDP é considerado como uma sequência de inteiros de 16 bits.
- Se o número de bytes for ímpar, um byte de preenchimento (padding) com valor zero é adicionado apenas para fins de cálculo (não é transmitido).
- Todos os inteiros de 16 bits são somados, incluindo o pseudo-cabeçalho.
- Se ocorrer um "carry" (estouro do bit 16), ele é adicionado de volta ao resultado (carry-around).
- O complemento de um do resultado (inverter todos os bits: 0 vira 1, 1 vira 0) é colocado no campo
Checksum.
Processo de Verificação (Receptor)
- O receptor soma todos os inteiros de 16 bits do datagrama recebido, incluindo o campo Checksum recebido.
- Se não houver erros, o resultado será todos os bits ligados (
0xFFFFem hexadecimal). - Se o resultado for diferente de
0xFFFF, o pacote está corrompido e é descartado silenciosamente.
Exemplo Numérico Simplificado
Se dois valores de 16 bits forem somados:
0x1234 + 0x5678 = 0x68AC (sem carry)
0xFFFF + 0x0001 = 0x10000 → carry-around → 0x0001
Complemento de um de 0x68AC = 0x9753 (checksum transmitido)
3. O Pseudo-Cabeçalho (Pseudo-Header)
A característica mais distinta e importante do Checksum do UDP é a inclusão de um Pseudo-Cabeçalho no cálculo. O UDP é encapsulado no IP, mas para calcular o checksum, ele "pede emprestado" informações do cabeçalho IP. Este pseudo-cabeçalho não é transmitido fisicamente na rede; ele é construído apenas momentaneamente na memória para o cálculo.
Estrutura do Pseudo-Cabeçalho (IPv4)
| Campo | Tamanho | Conteúdo |
|---|---|---|
| Endereço IP de Origem | 32 bits | Src IP do cabeçalho IP |
| Endereço IP de Destino | 32 bits | Dst IP do cabeçalho IP |
| Zeros | 8 bits | Preenchimento com zeros |
| Protocolo | 8 bits | Valor 17 (UDP) |
| Comprimento UDP | 16 bits | Valor do campo Length do UDP |
Por que o Pseudo-Cabeçalho é Importante?
Ele garante que o datagrama UDP foi entregue ao host correto e ao protocolo correto. Se houver um erro de roteamento e o pacote IP for entregue ao computador errado (mesmo que a porta UDP coincida), os endereços IP no pseudo-cabeçalho não corresponderão aos endereços da interface de rede do receptor. O cálculo do checksum falhará e o pacote será descartado. Ele protege contra:
- Entrega a destinatários incorretos.
- Erros no campo Protocol do cabeçalho IP.
- Corruption do campo Length do UDP.
4. Opcionalidade no IPv4 vs. Obrigatoriedade no IPv6
O tratamento do Checksum varia entre as versões do protocolo IP:
IPv4 (Opcional)
No IPv4, o uso do checksum UDP é opcional. Se o campo for preenchido com todos os bits em zero (0x0000), isso significa que o checksum foi desabilitado pelo emissor. Nesse caso, o receptor não deve verificar o checksum.
- Nota: Embora opcional pela RFC, a RFC 1122 (1989) recomenda que implementações modernas sempre habilitem o checksum. A maioria dos sistemas operacionais atuais habilita por padrão para evitar entrega de dados corrompidos às aplicações.
IPv6 (Obrigatório)
No IPv6, o checksum UDP é obrigatório. O cabeçalho IPv6 removeu o próprio checksum para acelerar o processamento nos roteadores. Com isso, o checksum do UDP se tornou a única linha de defesa contra erros de transmissão na Camada de Transporte. Em IPv6, o valor 0x0000 é inválido e o pacote deve ser descartado se recebido.
Pseudo-Cabeçalho no IPv6
No IPv6, o pseudo-cabeçalho é maior pois os endereços têm 128 bits:
| Campo | Tamanho |
|---|---|
| Endereço Origem IPv6 | 128 bits |
| Endereço Destino IPv6 | 128 bits |
| Comprimento UDP | 32 bits |
| Zeros | 24 bits |
| Próximo Cabeçalho | 8 bits (17 = UDP) |
5. Comportamento em Caso de Erro
Se o receptor calcular o checksum e descobrir uma discrepância:
- Descarte: O datagrama UDP é silenciosamente descartado. Os dados não são passados para a aplicação.
- Sem Retransmissão: O protocolo UDP não possui mecanismo para pedir uma retransmissão. O emissor não é notificado do erro.
- Sem Estatística: Geralmente, não há nem mesmo um contador ICMP informando o descarte (ao contrário de outros protocolos).
- Implicação: A aplicação nunca verá dados corrompidos, mas pode perceber uma falha na comunicação (timeout) se esperava uma resposta e ela nunca chegou.
6. Cobertura de Proteção
O checksum cobre três blocos distintos de informação:
| Bloco | Conteúdo | Proteção |
|---|---|---|
| Cabeçalho UDP | Portas, Length | Evita entrega à porta errada |
| Payload | Dados da aplicação | Integridade dos dados |
| Pseudo-cabeçalho | Metadados do IP | Endereço e protocolo corretos |
Isso garante a integridade end-to-end dos dados desde que saíram da aplicação origem até chegarem à aplicação destino, protegendo contra bits invertidos causados por ruído elétrico, falhas de hardware ou bugs de firmware em roteadores.
7. Performance e Offloading
O cálculo do checksum pode ser caro em CPU para links de alta velocidade (10 Gbps+). Para mitigar isso, placas de rede modernas implementam Checksum Offloading:
- TX Checksum Offload: A placa de rede calcula o checksum no hardware ao transmitir.
- RX Checksum Offload: A placa de rede valida o checksum no hardware ao receber.
O sistema operacional marca o pacote com CHECKSUM_PARTIAL e a NIC completa o cálculo. Isso reduz drasticamente o uso de CPU em servidores de alto throughput.
8. Limitações do Algoritmo
Embora eficaz para detectar erros aleatórios, o checksum em complemento de um tem limitações:
- Não detecta reordenação de palavras de 16 bits (a soma permanece igual).
- Não detecta troca de duas palavras iguais em posições diferentes.
- Não é uma proteção criptográfica: não protege contra adulteração maliciosa (para isso, use IPsec ou DTLS).
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| Tamanho do campo | 16 bits |
| Algoritmo | Complemento de um |
| Opcional em IPv4 | Sim (valor 0 = desabilitado) |
| Obrigatório em IPv6 | Sim |
| Cobertura | Pseudo-cabeçalho + Cabeçalho UDP + Payload |
| Offloading | Suportado por placas modernas |
| Tratamento de erro | Descarte silencioso |
10. Conclusão
O campo Checksum é a única garantia de integridade do UDP. Apesar de opcional em IPv4, sua importância cresceu com o IPv6, onde se tornou obrigatório. O uso do pseudo-cabeçalho é uma sacada brilhante do design original que estende a proteção para além do datagrama UDP, garantindo que o pacote não apenas não esteja corrompido, mas também tenha sido entregue ao destino correto. Para engenheiros de rede, entender este campo é fundamental para diagnosticar perdas misteriosas de pacotes e otimizar performance em links de alta velocidade.