Aller au contenu principal

6. Data Types (Types de données)

Toutes les valeurs temporelles NTP sont représentées en format complément à deux (twos-complement format), avec des bits numérotés en format big-endian (comme décrit dans l'annexe A de [RFC0791]) à partir de zéro commençant à gauche, ou position de poids fort. Il existe trois formats temporels NTP, un format de date de 128 bits (date format), un format d'horodatage de 64 bits (timestamp format) et un format court de 32 bits (short format), comme le montre la Figure 3. Le format de date de 128 bits est utilisé lorsque suffisamment de stockage et de taille de mot sont disponibles. Il comprend un champ de secondes signées de 64 bits (signed seconds field) couvrant 584 milliards d'années et un champ de fraction de 64 bits (fraction field) résolvant 0,05 attoseconde (c'est-à-dire 0,5e-18). Pour faciliter le mappage entre les formats, le champ de secondes est divisé en un champ Numéro d'ère (Era Number field) de 32 bits et un champ Décalage d'ère (Era Offset field) de 32 bits. Les ères ne peuvent pas être produites directement par NTP, et il n'est pas nécessaire de le faire. Lorsque nécessaire, elles peuvent être dérivées de moyens externes, tels que le système de fichiers ou du matériel dédié.

    0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds | Fraction |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Format court NTP

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fraction |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Format d'horodatage NTP

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Era Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Era Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Fraction |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Format de date NTP

Figure 3 : Formats temporels NTP

Le format d'horodatage de 64 bits est utilisé dans les en-têtes de paquets et d'autres endroits avec une taille de mot limitée. Il comprend un champ de secondes non signées de 32 bits (unsigned seconds field) couvrant 136 ans et un champ de fraction de 32 bits résolvant 232 picosecondes (picoseconds). Le format court de 32 bits est utilisé dans les champs d'en-tête de délai et de dispersion où la résolution complète et la plage des autres formats ne sont pas justifiées. Il comprend un champ de secondes non signées de 16 bits et un champ de fraction de 16 bits.

Dans les formats de date et d'horodatage, l'époque primaire (prime epoch), ou date de base de l'ère 0, est le 1er janvier 1900 à 0 h UTC, lorsque tous les bits sont à zéro. Il convient de noter que, strictement parlant, l'UTC n'existait pas avant le 1er janvier 1972, mais il est commode de supposer qu'il a existé pour toute l'éternité, même si toute connaissance des secondes intercalaires historiques a été perdue. Les dates sont relatives à l'époque primaire ; les valeurs supérieures à zéro représentent des temps après cette date ; les valeurs inférieures à zéro représentent des temps avant celle-ci. Notez que le champ Décalage d'ère du format de date et le champ Secondes du format d'horodatage ont la même interprétation.

Les horodatages sont des valeurs non signées, et les opérations sur eux produisent un résultat dans la même ère ou dans des ères adjacentes. L'ère 0 comprend les dates depuis l'époque primaire jusqu'à un certain moment en 2036, lorsque le bit le plus significatif est à zéro. L'ère 1 continue à partir de ce point et dure 136 ans, puis l'ère 2 commence, et ainsi de suite. Dans l'ère 0, l'horodatage de zéro représente l'époque primaire, 2^(31) secondes représente le temps en 2036, et 2^(32)-1 secondes représente la seconde avant l'époque primaire. En utilisant des horodatages non signés, ils sont traités de la même manière. Un danger perçu avec les calculs d'horodatage de 64 bits couvrant une ère, comme c'est possible en 2036, pourrait entraîner un dépassement. En fait, si le client est réglé dans les 68 ans du serveur avant le démarrage du protocole, des valeurs correctes sont obtenues même si le client et le serveur sont dans des ères adjacentes.

Certaines valeurs temporelles sont représentées en format exponentiel (exponent format), y compris la précision (precision), la constante de temps (time constant) et l'intervalle de sondage (poll interval). Celles-ci sont en format entier signé de 8 bits en log2 (logarithme en base 2) secondes. Les seules opérations arithmétiques autorisées sur elles sont l'incrémentation et la décrémentation. Pour les besoins de ce document et pour simplifier la présentation, une référence à l'une de ces variables par nom signifie la valeur exponentiée, par exemple, l'intervalle de sondage est de 1024 s, tandis que la référence par nom et exposant signifie la valeur réelle, par exemple, l'exposant de sondage est 10.

Pour convertir le temps système dans n'importe quel format en formats de date et d'horodatage NTP, il est nécessaire de déterminer le nombre de secondes s depuis l'époque primaire jusqu'au temps système. Pour déterminer l'ère entière et l'horodatage étant donné s,

era = s / 2^(32) et timestamp = s - era * 2^(32),

ce qui fonctionne pour les dates positives et négatives. Pour déterminer s étant donné l'ère et l'horodatage,

s = era * 2^(32) + timestamp.

La conversion entre le temps NTP et le temps système peut être un peu compliquée et dépasse le cadre de ce document. Notez que le nombre de jours dans l'ère 0 est supérieur d'un jour au nombre de jours dans la plupart des autres ères, et cela ne se reproduira pas avant l'année 2400 dans l'ère 3.

Dans la description des variables d'état qui suit, une référence explicite au type entier implique un entier non signé de 32 bits. Cela simplifie les vérifications de limites, car seule la limite supérieure doit être définie. Sans référence explicite, le type par défaut est double flottant de 64 bits (floating double). Les exceptions seront notées si nécessaire.