Resumo

  • O XDR substituiu layouts nativos por uma representação externa única, big-endian e organizada em múltiplos de quatro bytes.
  • Valores variáveis traziam contagem e conteúdo; zeros completavam a fronteira sem aumentar o valor.
  • Ordem declarada e discriminantes orientavam a leitura, enquanto enquadramento, identidade, segurança e decisão continuavam sob outras autoridades.

O preenchimento não podia trazer lembranças da memória

O exemplo da RFC 4506 codifica um nome com nove bytes. Depois do comprimento e do nome, surgem três zeros; o campo seguinte começa apenas então. Os três bytes cruzam a interface, mas o nome permanece com comprimento nove.

Não é permitido preencher esse espaço com qualquer coisa. Se cada codificador copiasse o resíduo disponível em sua memória, valores iguais ganhariam sequências diferentes. Comparação binária e checksum passariam a depender da máquina de origem. A exigência de zeros transforma até o espaço sem conteúdo em uma propriedade determinística.

Esse detalhe explica a estratégia: a padronização não invadiu o interior dos computadores. Ela definiu o que todos precisavam publicar ao sair dele.

Uma forma externa absorveu a diversidade interna

A RFC 1014, de 1987, apresentou o XDR como linguagem de descrição e codificação entre arquiteturas heterogêneas. Sun RPC e NFS já apareciam como usuários. A sintaxe parecida com C servia para descrever formatos; não executava código nem prometia que a memória de uma estrutura C viajaria intacta.

Inteiros com sinal ocupam 32 bits em complemento de dois, com o byte mais significativo primeiro. Arrays seguem a ordem dos elementos e estruturas seguem a ordem da declaração. Cada lado conserva sua forma nativa, mas o emissor converte para o exterior e o receptor converte de volta.

O objeto não traz um seletor de endianness. O XDR escolheu uma ordem porque aceitar duas exigiria outro protocolo para anunciar qual delas valia. Algumas máquinas pagam mais pela conversão; em troca, dados guardados continuam interpretáveis mesmo quando a negociação original não existe.

Quatro bytes foram uma escolha de engenharia. Unidades menores economizariam enchimento e serviriam pior a certos alinhamentos; unidades maiores atenderiam mais arquiteturas, mas inflariam todos os objetos. O padrão publicou um compromisso verificável.

A contagem delimitava o valor

Um opaque variável começa por uma contagem sem sinal de 32 bits, segue com exatamente aquela quantidade de bytes e termina com até três zeros para alinhamento. Strings usam a mesma forma contada. Arrays variáveis anunciam quantos elementos virão.

O decoder pode comparar a contagem com o máximo declarado, confirmar que o registro ainda contém o valor e calcular a posição do próximo campo. Ultrapassar um limite do protocolo é erro. O grande máximo implícito da linguagem, quando o autor não declara uma cota, não obriga a máquina a oferecer memória ilimitada; capacidade e custo permanecem decisões locais.

Também é preciso respeitar a diferença entre string contada e string nativa. Um NUL pode aparecer dentro do valor XDR. Bibliotecas que o tratam como terminador podem reservar uma medida e comparar ou liberar outra. Uma representação canônica só é segura quando a passagem para o tipo local conserva as mesmas fronteiras.

O discriminante autorizava uma única leitura estrutural

O XDR adota tipagem implícita: nomes e rótulos universais não acompanham cada campo. Os dois lados conhecem a declaração. Por isso, mudar a ordem de uma estrutura altera o significado dos bytes seguintes, mesmo que cada trecho isolado ainda pareça válido.

Na união discriminada, um inteiro, enum ou booleano vem primeiro e seleciona um braço previamente definido. Sem braço default, um discriminante não listado não possui codificação válida. Dados opcionais usam o mesmo princípio: verdadeiro traz o elemento; falso escolhe void, que ocupa zero bytes. A ausência tem um sinal próprio.

O alcance desse sinal é limitado. Ele escolhe o tipo seguinte; não autentica a origem, não autoriza uma chamada e não garante verdade ou segurança do conteúdo.

O XDR não marcava sozinho o fim da mensagem

A RFC 1832 colocou em 1995 a forma implantada no Standards Track. Em 2006, a RFC 4506 tornou-se STD 67 e declarou não fazer mudança técnica no formato. Acrescentou uma leitura operacional: comprimentos devem ser limitados, buffers protegidos, NULs tratados com cuidado e estruturas recursivas contidas.

A RFC 5531 mostra onde a responsabilidade muda. Mensagens ONC RPC são descritas em XDR, mas RPC sobre TCP usa uma camada própria de record marking. O cabeçalho dos fragmentos é expressamente declarado fora da forma XDR. Decodificar um valor não revela, por si só, o fim de uma mensagem arbitrária no fluxo, sua chamada correspondente ou a conclusão de uma operação.

O XDR tampouco oferece criptografia, autenticação, autorização, integridade ou proteção contra replay. Ele torna a sintaxe observável; os demais poderes continuam com o transporte, o protocolo e a aplicação.

Fontes e limites

O conjunto fechado reúne RFC 1014, RFC 1832, RFC 4506 e RFC 5531. Elas sustentam o formato, sua continuidade e a fronteira com RPC. Não medem adoção atual, não certificam produtos e não transformam bytes bem formados em identidade, permissão ou execução comprovada.