Groupe de travail Réseau	R. Elz, University of Melbourne	
Request for Comments : 1982	R. Bush, RGnet, Inc.	
RFC mises à jour : 1034, 1035	août 1996	
Catégorie : En cours de normalisation	Traduction Claude Brière de L'Isle	

Arithmétique des numéros de série

Statut du présent mémoire
Le présent document spécifie un protocole de l'Internet en cours de normalisation pour la communauté de l'Internet, et appelle à des discussions et suggestions pour son amélioration. Prière de se référer à l'édition actuelle des "Normes officielles de protocole de l'Internet" (STD 1) pour vérifier l'état de normalisation et le statut de ce protocole. La distribution du présent mémoire n'est soumise à aucune restriction.

Résumé
Le présent mémoire définit l'arithmétique des numéros de série, telle qu'utilisée dans le système des noms de domaines. Le DNS s'est longtemps appuyé sur une arithmétique de numéros de série, un concept qui n'a jamais été réellement défini, et certainement pas dans un document de l'IETF, bien qu'il soit largement compris. Le présent mémoire fournit la définition manquante. Il est destiné à mettre à jour les RFC 1034 et 1035.

1	Introduction
Le champ numéro de série de l'enregistrement de ressource SOA est défini dans la RFC1035 comme :

SERIAL : Le numéro de version de 32 bits non signé de la copie d'origine de la zone. Les transferts de zone préservent cette valeur. Cette valeur revient à zéro et devrait être comparée en utilisant l'arithmétique d'espace de séquence.

La RFC1034 utilise la même terminologie lorsque elle définit les procédures de cohérence de zone de serveur secondaire.

Malheureusement, le terme "arithmétique d'espace de séquence" n'est défini ni dans la RFC 1034 ni dans la RFC 1035, et leurs références ne fournissent pas plus d'informations à ce sujet.

Cette phrase semble avoir été destinée à spécifier l'arithmétique telle qu'utilisée dans les numéros de séquence de TCP [RFC793], qui est définie dans [IEN-74].

Malheureusement, l'arithmétique définie dans [IEN-74] n'est pas adéquate pour les besoins du DNS, car aucun opérateur général de comparaison n'est défini.

Pour éviter d'autres problèmes avec ce simple champ, le présent document définit le champ et les opérations qui y sont disponibles. Cette définition est simplement destinée à préciser les intentions de la RFC1034 et de la RFC1035, et on pense qu'elle est en accord général avec les mises en œuvre actuelles. Cependant, des mises en œuvre plus anciennes, dépassées, sont connues pour avoir traité le numéro de série comme un simple entier non signé, sans essayer de mettre en œuvre aucune sorte "d'arithmétique d'espace de séquence", cependant cela peut avoir été interprété, et de plus, en ignorant l'exigence du retour à zéro de la valeur. Rien de plus ne peut être fait de ces mises en œuvre, à part les éliminer.

2.	Arithmétique d'espace de séquence
Les numéros de série sont formés d'entiers non négatifs tirés d'un sous-ensemble fini de la gamme de toutes les valeurs d'entiers. Le plus petit entier dans tout sous-ensemble utilisé à cette fin est zéro, le maximum est toujours inférieur de un à une puissance de deux.

Cependant lorsque on considère des numéros de série, aucune valeur n'a de signification particulière, il n'y a pas de numéro de série minimum ou maximum, chaque valeur a un successeur et un prédécesseur.

Pour définir un numéro de série à utiliser de cette façon, la taille de l'espace de numéro de série doit être donnée. Cette valeur, appelée "SERIAL_BITS", donne la puissance de deux qui résulte en un nombre supérieur de un au plus grand entier correspondant à une valeur de numéro de série. Cela spécifie aussi le nombre de bits nécessaires pour contenir toute valeur possible d'un numéro de série du type défini. Les opérations permises sur les numéros de série sont définies à la section suivante.

3.	Opérations sur les numéros de série
Seules deux opérations sont définies sur les numéros de série, l'addition d'un entier positif de gamme limitée, et la comparaison avec un autre numéro de série.

3.1	Addition
Les numéros de série peuvent être incrémentés par l'addition d'un entier positif n, où n est pris dans la gamme des entiers [0 .. (2^(SERIAL_BITS - 1) - 1)]. Pour un numéro de séquence s, le résultat d'une telle addition, s', est défini par

s' = (s + n) modulo (2 ^ SERIAL_BITS)

où les opérations addition et modulo agissent ici sur les valeurs qui sont des valeurs non négatives de taille non limitée au sens usuel de l'arithmétique des entiers.

L'addition d'une valeur en-dehors de la gamme [0 .. (2^(SERIAL_BITS - 1) - 1)] est indéfinie.

3.2	Comparaison
Deux numéros de série quelconques, s1 et s2, peuvent être comparés. La définition du résultat de cette comparaison est la suivante.

Pour les besoins de cette définition, considérons deux entiers, i1 et i2, de l'ensemble non limité des entiers non négatifs, tels que i1 et s1 aient la même valeur numérique, de même que i2 et s2. L'arithmétique et les comparaisons appliquées à i1 et i2 utilisent normalement l'arithmétique d'entiers non limités.

Donc, s1 est dit être égal à s2 si et seulement si i1 est égal à i2, dans tous les autres cas, s1 n'est pas égal à s2.

s1 est dit être inférieur à s2 si, et seulement si, s1 n'est pas égal à s2, et

(i1 < i2 et i2 - i1 < 2^(SERIAL_BITS - 1)) ou
(i1 > i2 et i1 - i2 > 2^(SERIAL_BITS - 1))

s1 est dit être supérieur à s2 si, et seulement si, s1 n'est pas égal à s2, et

(i1 < i2 et i2 - i1 > 2^(SERIAL_BITS - 1)) ou
(i1 > i2 et i1 - i2 < 2^(SERIAL_BITS - 1))

Noter qu'il y a certaines paires de valeurs s1 et s2 pour lesquelles s1 n'est pas égal à s2, mais pour lesquelles s1 n'est ni supérieur ni inférieur à s2. Essayer d'utiliser ces opérateurs de classement sur de telles paires de valeurs produit un résultat indéfini.

La raison en est que ces paires de valeurs sont telles que toute définition simple de s1 comme étant inférieur à s2 lorsque (s1, s2) est une telle paire, amènera aussi s2 à être inférieur à s1, lorsque la paire est (s2, s1). Cela signifie que l'ordre particulier choisi pour un essai amènera une différence de résultat, conduisant à une mise en œuvre imprévisible.

Bien qu'il soit possible de définir l'essai de telle façon que l'inégalité n'ait pas cette propriété surprenante, tout en étant définie pour toute paire de valeurs, une telle définition serait d'une lourdeur de mise en œuvre inutile, et difficile à comprendre, tout en laissant subsister des cas où 

s1 < s2 et (s1 + 1) > (s2 + 1)

ce qui est tout aussi non intuitif.

Le problème est donc laissé indéfini, les mises en œuvre étant libre de donner l'un ou l'autre résultat, ou d'afficher une erreur, et les utilisateurs doivent veiller à ne pas dépendre d'un résultat particulier. Cela veut généralement dire qu'il faut éviter de laisser coexister une de ces paires particulières de nombres.

Les relations supérieur ou égal, et inférieur ou égal, découlent de façon naturelle des définitions ci-dessus.

4.	Corollaires

Ces définitions donnent quelques résultats à noter.

4.1	Corollaire 1
Pour tout numéro de séquence s et tout entier n tels que l'addition de n à s est bien définie, (s + n) ≥ s. De plus (s + n) == s seulement lorsque n == 0, dans tous les autres cas définis, (s + n) > s.

4.2	Corollaire 2
Si s' est le résultat de l'addition de l'entier n différent de zéro au numéro de séquence s, et si m est un autre entier dans la gamme définie comme ajoutable à un numéro de séquence, et si s" est le résultat de l'addition à s', on ne peut pas définir alors si s" est supérieur ou inférieur à s, bien qu'on sache que s" n'est pas égal à s.

4.3	Corollaire 3
Si le s" du corollaire précédent est incrémenté, il n'y a alors aucune relation connue entre le résultat et s.

4.4	Corollaire 4
Si dans le corollaire 2 la valeur (n + m) est telle que l'addition de la somme au numéro de séquence s produirait un résultat défini, le corollaire 1 s'applique, et s" est connu comme supérieur à s.

5.	Exemples
5.1	Exemple trivial
Le plus simple espace de numéro de série significatif est SERIAL_BITS == 2. Dans cet espace, les entiers qui constituent l'espace des numéros de série sont 0, 1, 2, et 3. C'est-à-dire, 3 == 2^SERIAL_BITS - 1.

Dans cet espace, le plus grand entier qu'il est significatif d'ajouter à un numéro de séquence est 2^(SERIAL_BITS - 1) - 1, ou 1.

Donc, comme on a défini 0 + 1 == 1, 1 + 1 == 2, 2 + 1 == 3, et 3 + 1 == 0.
De plus, 1 > 0, 2 > 1, 3 > 2, et 0 > 3. Si 2 > 0 ou 0 > 2, et si 1 > 3 ou 3 > 1 sont indéfinis.

5.2	Exemple un petit peu plus grand
Considérons le cas où SERIAL_BITS == 8. Dans cet espace, les entiers qui constituent l'espace des numéros de série sont 0, 1, 2, ... 254, 255. 255 == 2^SERIAL_BITS - 1.

Dans cet espace, le plus grand entier qu'il est significatif d'ajouter à un numéro de séquence est 2^(SERIAL_BITS - 1) - 1, ou 127.

L'addition est comme prévu dans cet espace, par exemple: 255+1 == 0, 100+100 == 200, et 200+100 == 44.

La comparaison est plus intéressante, 1 > 0, 44 > 0, 100 > 0, 100 > 44, 200 > 100, 255 > 200, 0 > 255, 100 > 255, 0 > 200, et 44 > 200.

Noter que 100 + 100 > 100, mais que (100 + 100) +100 < 100. Incrémenter un numéro de série peut faire qu'il devienne "plus petit". Bien sûr, incrémenter d'un nombre plus petit permettra de faire plus d'incréments avant que cela ne survienne. Cependant c 'est quelque chose qu'il faut toujours avoir présent à l'esprit car cela peut causer des erreurs surprenantes, ou être utile lorsque c'est la seule façon définie de faire réellement décroître un numéro de série.

Les paires de valeurs 0 et 128, 1 et 129, 2 et 130, etc., jusqu'à 127 et 255 ne sont pas égales, mais dans chaque paire, aucun des numéros n'est défini comme étant supérieur ni inférieur à l'autre.

Il pourrait être défini (arbitrairement) que 128 > 0, 129 > 1, 130 > 2, ..., 255 > 127, en changeant les définitions d'opérateur de comparaison, comme mentionné plus haut. Noter cependant que cela provoquerait 255 > 127, alors que (255 + 1) < (127 + 1), ainsi que 0 < 128. De telles définitions, à part d'être arbitraires, seraient aussi plus coûteuses de mise en œuvre.

6.	Citation

Comme cette arithmétique définie peut être utile pour des besoins autres que ceux des numéros de série du DNS, on peut s'y référer comme à l'Arithmétique de numéro de série de la RFC 1982. Une telle référence doit être comprise comme impliquant que les règles des sections 2 à 5 du présent document s'appliquent aux valeurs déclarées.

7.	Numéro de série SOA du DNS

Le numéro de série dans l'enregistrement de ressource SOA du DNS est un numéro de série tel que défini ci-dessus, SERIAL_BITS étant 32. C'est-à-dire que le numéro de série est un entier non négatif avec des valeurs prises dans la gamme [0 .. 4 294 967 295]. C'est à dire, un entier de 32 bits non signé.

L'incrément maximum défini est 2 147 483 647 (2^31 - 1).

Il faut veiller à ce que le numéro de série ne soit pas incrémenté, en une ou plusieurs étapes, de plus que ce maximum dans la période donnée par la valeur du SOA.expire. Faire ainsi peut laisser quelques serveurs secondaires avec des copies périmées de la zone, mais avec un numéro de série "supérieur" à celui du serveur principal. Bien sûr, des circonstances particulières peuvent exiger que cette règle soit écartée, par exemple, lorsque on a besoin, pour une raison quelconque, d'établir un numéro de série à une valeur inférieure. Si cela doit être fait, il faut alors veiller tout particulièrement à vérifier que TOUS les serveurs ont réussi correctement à suivre les changements de numéro de série du serveur principal, à chaque étape.

Noter que chaque incrément du numéro de série doit être traité à cet égard comme le début d'une nouvelle séquence d'incréments, ainsi que comme étant la continuation de toutes les séquences précédentes commencées pendant la période spécifiée par SOA.expire.

Il faut aussi faire attention avant de provoquer la mise à zéro du numéro de série. Bien que cette valeur ne soit en aucune façon une valeur particulière dans l'arithmétique des numéros de série, ou pour le numéro de série SOA du DNS, de nombreuses mises en œuvre du DNS ont incorrectement traité zéro comme un cas particulier, avec des propriétés particulières, et un comportement anormal peut être prévu si zéro est utilisé comme numéro de série SOA du DNS.

8.	Mises à jour de documents

La RFC1034 et la RFC1035 sont à traiter comme si les références à "l'arithmétique d'espace de séquence" dans le présent document étaient remplacées par des références à l'arithmétique de numéro de série, comme défini dans le présent document.

9.	Considérations pour la sécurité

Le présent document n'aborde pas les questions de sécurité.

Il est estimé que rien dans le présent document n'ajoute aux problèmes de sécurité qui pourraient exister déjà dans le DNS, ni ne les diminue.

Références

[RFC1034]	P. Mockapetris, "Noms de domaines - Concepts et facilités", STD 13, novembre 1987.

[RFC1035]	P. Mockapetris, "Noms de domaines – Mise en œuvre et spécification", STD 13, novembre 1987

[RFC793]	J. Postel (éd.), "Protocole de commande de transmission – Spécification du protocole du programme Internet DARPA", (STD 7), septembre 1981.

[IEN-74]	William W. Plummer, "Arithmétique de numéro de séquence" BB&N Inc, septembre 1978

Remerciements

Merci à Rob Austein qui a suggéré de clarifier les opérateurs de comparaison non définis, et à Michael Patton qui a essayé de localiser une autre référence pour cette procédure. Merci aussi aux membres du groupe de travail IETF DNSIND de 1995-6, et en particulier à Paul Mockapetris.

Adresse des auteurs

Robert Elz	Randy Bush	
Computer Science	RGnet, Inc.	
University of Melbourne	10361 NE Sasquatch Lane	
Parkville, Vic,  3052	Bainbridge Island, Washington,  98110	
Australia.	United States.	
mél : kre@munnari.OZ.AU	mél : randy@psg.com