Résumé

  • Le RFC 1014, publié par Sun Microsystems en juin 1987, impose aux éléments encodés une taille multiple de quatre octets. Une chaîne variable porte d'abord sa longueur sur quatre octets, puis ses caractères et enfin des zéros de remplissage.
  • Dans son exemple de fichier, sillyprog compte neuf octets de caractères et trois octets de remplissage. La valeur du type de fichier commence à l'offset 16. Le compte donne la longueur du nom ; le remplissage fixe le départ du voisin.

Le programme a un nom de plaisanterie et un emploi du temps très sérieux. Dans l'exemple construit par Sun Microsystems, sillyprog est un petit programme Lisp appartenant à john. Pour envoyer son nom, XDR écrit d'abord le nombre 9 sur quatre octets, puis les neuf lettres, puis trois zéros. L'enregistrement suivant, le type du fichier, prend place à l'offset 16. Le lecteur avance par cases de quatre. Les chaises vides sont prévues au plan de salle.

La difficulté de 1987 tenait à la variété des machines. Le RFC cite des stations Sun, des VAX, des IBM PC et des Cray qui pouvaient échanger des données malgré leurs architectures distinctes. XDR, External Data Representation, offrait un langage pour décrire les valeurs et une manière commune de les encoder. Sun RPC et NFS s'en servaient. Le document partait d'un octet de huit bits que les matériels devaient transporter sans en changer le sens, puis organisait les valeurs selon une cadence de quatre octets.

Un entier de 32 bits remplit une case entière. Une suite de neuf caractères en déborde deux et entame une troisième. Le format ajoute alors trois zéros pour achever le troisième groupe de quatre. Ce geste n'allonge pas le nom du fichier : la longueur inscrite au début reste 9. Il aligne simplement la première valeur qui suit. Le prix est payé en octets supplémentaires ; la récompense est un point de départ calculable par n'importe quel décodeur qui suit la même règle.

Le tableau en hexadécimal du RFC permet de faire le trajet. Les offsets 0 à 3 portent la longueur 9. Les lettres commencent à 4 et finissent à 12. Les positions 13, 14 et 15 sont remplies de zéros. À 16 apparaît EXEC, le type de fichier codé par la valeur 2. Lire les zéros comme des caractères fabriquerait un autre nom. Les ignorer lors du déplacement ferait commencer EXEC trois octets trop tôt. Tout l'intérêt de la convention se voit à cet endroit précis.

Le reste du fichier reprend le même rythme sans reprendre les mêmes longueurs. EXEC sélectionne dans une union discriminée un champ d'interpréteur. Celui-ci contient lisp, annoncé par une longueur 4 et suivi de quatre caractères. Le propriétaire john tient lui aussi en quatre octets. Les données du programme, (quit), occupent six octets : une longueur 6 les précède, deux zéros les suivent. Le parcours complet tient donc par une série de petits rendez-vous entre longueur, contenu et alignement.

XDR distingue aussi les chaînes de caractères des données opaques. La chaîne de ce RFC contient des octets ASCII. Une valeur opaque peut contenir une suite d'octets que le format ne cherche pas à interpréter. Les deux formes variables peuvent déclarer une longueur maximale ; dépasser cette borne constitue une erreur d'encodage. La longueur écrite en tête sert ainsi à trouver la fin du contenu et à contrôler sa taille. Le remplissage sert à trouver le début de la valeur suivante. Réunir ces fonctions sous le seul mot « longueur » ferait perdre la moitié de la mécanique.

La description des données compte autant que les zéros. Une structure locale en mémoire n'est pas un contrat entre deux ordinateurs. Ses pointeurs, ses choix de compilateur et ses habitudes d'alignement appartiennent à la machine qui l'héberge. Le langage XDR nomme les types et leur ordre ; son encodage fixe les octets du flux. Dans l'exemple, la valeur EXEC dit quel bras de l'union vient après elle. Le lecteur n'a donc pas à deviner la forme du champ suivant en regardant les habitudes de la machine émettrice.

Trois octets pour rien ? Dans un seul nom, la dépense saute aux yeux. Dans un échange entre machines différentes, elle achète une position stable pour la suite du message. Le nom tient en neuf caractères, son espace dans le flux en douze octets, et le type de fichier commence au seizième octet après la longueur initiale. On peut contrôler chaque étape au crayon. Voilà une norme de transport dont le travail se lit dans un détail presque comique : même les cases vides ont une destination.