7. Data Structures (Structures de données)
Les machines à états NTP sont définies dans les sections suivantes. Les variables d'état sont séparées en classes selon leur fonction dans les en-têtes de paquets, les processus de pair et de sondage, le processus système et le processus de discipline d'horloge. Les variables de paquet (Packet variables) représentent les valeurs d'en-tête NTP dans les paquets transmis et reçus. Les variables de pair et de sondage (Peer and poll variables) représentent le contenu de l'association pour chaque serveur séparément. Les variables système (System variables) représentent l'état du serveur tel que vu par ses clients dépendants. Les variables de discipline d'horloge (Clock discipline variables) représentent le fonctionnement interne de l'algorithme de discipline d'horloge. Un exemple est décrit dans l'annexe A.
7.1. Structure Conventions (Conventions de structure)
Afin de distinguer différentes variables du même nom mais utilisées dans différents processus, la convention de nommage résumée dans la figure 5 est adoptée. Une variable de paquet de réception v est un membre de la structure de paquet r avec le nom complet r.v. De manière similaire, x.v est une variable de paquet de transmission, p.v est une variable de pair, s.v est une variable système, et c.v est une variable de discipline d'horloge. Il existe un ensemble de variables de pair pour chaque association ; il n'existe qu'un seul ensemble de variables système et d'horloge.
| Nom (Name) | Description |
|---|---|
| r. | variable d'en-tête de paquet de réception (receive packet header variable) |
| x. | variable d'en-tête de paquet de transmission (transmit packet header variable) |
| p. | variable de pair/sondage (peer/poll variable) |
| s. | variable système (system variable) |
| c. | variable de discipline d'horloge (clock discipline variable) |
Figure 5 : Conventions de préfixe
7.2. Global Parameters (Paramètres globaux)
En plus des classes de variables, un certain nombre de paramètres globaux sont définis dans ce document, y compris ceux présentés avec des valeurs dans la figure 6.
| Nom (Name) | Valeur (Value) | Description |
|---|---|---|
| PORT | 123 | numéro de port NTP (NTP port number) |
| VERSION | 4 | numéro de version NTP (NTP version number) |
| TOLERANCE | 15e-6 | tolérance de fréquence PHI (frequency tolerance PHI, s/s) |
| MINPOLL | 4 | exposant de sondage minimum (minimum poll exponent, 16 s) |
| MAXPOLL | 17 | exposant de sondage maximum (maximum poll exponent, 36 h) |
| MAXDISP | 16 | dispersion maximale (maximum dispersion, 16 s) |
| MINDISP | .005 | incrément de dispersion minimum (minimum dispersion increment, s) |
| MAXDIST | 1 | seuil de distance (distance threshold, 1 s) |
| MAXSTRAT | 16 | numéro de strate maximum (maximum stratum number) |
Figure 6 : Paramètres globaux
Bien que ce soient les seuls paramètres globaux nécessaires pour l'interopérabilité, une collection plus large est nécessaire dans toute implémentation. L'annexe A.1.1 contient ceux utilisés par le squelette pour les algorithmes d'atténuation, l'algorithme de discipline d'horloge et les fonctions dépendantes de l'implémentation associées. Certaines de ces valeurs de paramètres sont gravées dans le marbre, comme le numéro de port NTP attribué par l'IANA et le numéro de version attribué à NTPv4 lui-même. D'autres, comme la tolérance de fréquence (également appelée PHI), impliquent une hypothèse sur le comportement dans le pire des cas d'une horloge système une fois synchronisée puis autorisée à dériver lorsque ses sources sont devenues inaccessibles. Les paramètres minimum et maximum définissent les limites des variables d'état comme décrit dans les sections ultérieures de ce document.
Bien qu'affichés avec des valeurs fixes dans ce document, certaines implémentations peuvent les rendre ajustables par des commandes de configuration. Par exemple, l'implémentation de référence calcule la valeur de PRECISION comme log2 du temps minimum dans plusieurs itérations pour lire l'horloge système.
7.3. Packet Header Variables (Variables d'en-tête de paquet)
Les variables d'état les plus importantes d'un point de vue externe sont les variables d'en-tête de paquet décrites dans la figure 7 et ci-dessous. L'en-tête de paquet NTP se compose d'un nombre intégral de mots de 32 bits (4 octets) dans l'ordre des octets du réseau. Le format de paquet se compose de trois composants : l'en-tête lui-même, un ou plusieurs champs d'extension facultatifs, et un code d'authentification de message facultatif (message authentication code, MAC). Le composant d'en-tête est identique à l'en-tête NTPv3 et aux versions précédentes. Les champs d'extension facultatifs sont utilisés par les algorithmes cryptographiques à clé publique Autokey décrits dans [RFC5906]. Le MAC facultatif est utilisé à la fois par Autokey et par l'algorithme cryptographique à clé symétrique décrit dans ce RFC.
| Nom (Name) | Formule (Formula) | Description |
|---|---|---|
| leap | leap | indicateur de saut (leap indicator, LI) |
| version | version | numéro de version (version number, VN) |
| mode | mode | mode |
| stratum | stratum | strate (stratum) |
| poll | poll | exposant de sondage (poll exponent) |
| precision | rho | exposant de précision (precision exponent) |
| rootdelay | delta_r | délai racine (root delay) |
| rootdisp | epsilon_r | dispersion racine (root dispersion) |
| refid | refid | ID de référence (reference ID) |
| reftime | reftime | horodatage de référence (reference timestamp) |
| org | T1 | horodatage d'origine (origin timestamp) |
| rec | T2 | horodatage de réception (receive timestamp) |
| xmt | T3 | horodatage de transmission (transmit timestamp) |
| dst | T4 | horodatage de destination (destination timestamp) |
| keyid | keyid | ID de clé (key ID) |
| dgst | dgst | résumé de message (message digest) |
Figure 7 : Variables d'en-tête de paquet
Le paquet NTP est un datagramme UDP [RFC0768]. Certains champs utilisent plusieurs mots et d'autres sont emballés dans des champs plus petits dans un mot. L'en-tête de paquet NTP illustré dans la figure 8 comporte 12 mots suivis de champs d'extension facultatifs et enfin d'un code d'authentification de message facultatif (MAC) composé du champ Identificateur de clé et du champ Résumé de message.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Delay |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Root Dispersion |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reference ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Reference Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Origin Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Receive Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Transmit Timestamp (64) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Extension Field 1 (variable) .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| dgst (128) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 8 : Format d'en-tête de paquet
Les champs d'extension sont utilisés pour ajouter des capacités facultatives, par exemple, le protocole de sécurité Autokey [RFC5906]. Le format de champ d'extension est présenté afin que le paquet puisse être analysé sans la connaissance des fonctions du champ d'extension. Le MAC est utilisé à la fois par Autokey et par le schéma d'authentification à clé symétrique.
Une liste des variables d'en-tête de paquet est présentée dans la figure 7 et décrite en détail ci-dessous. À l'exception d'une variation mineure lors de l'utilisation de la famille d'adresses IPv6, ces champs sont rétrocompatibles avec NTPv3. Les champs d'en-tête de paquet s'appliquent à la fois aux paquets transmis (préfixe x) et aux paquets reçus (préfixe r). Dans la figure 8, la taille de certains champs multi-mots est indiquée en bits si elle n'est pas la valeur par défaut de 32 bits. L'en-tête de base s'étend du début du paquet à la fin du champ Horodatage de transmission.
Interprétation des champs
LI (Leap Indicator, Indicateur de saut, leap) : entier de 2 bits avertissant d'une seconde intercalaire imminente à insérer ou supprimer dans la dernière minute du mois en cours avec des valeurs définies dans la figure 9.
| Valeur (Value) | Signification (Meaning) |
|---|---|
| 0 | pas d'avertissement (no warning) |
| 1 | la dernière minute du jour a 61 secondes (last minute has 61 seconds) |
| 2 | la dernière minute du jour a 59 secondes (last minute has 59 seconds) |
| 3 | inconnu (horloge non synchronisée, clock unsynchronized) |
Figure 9 : Indicateur de saut
VN (Version Number, Numéro de version, version) : entier de 3 bits représentant le numéro de version NTP, actuellement 4.
Mode (mode) : entier de 3 bits représentant le mode, avec des valeurs définies dans la figure 10.
| Valeur (Value) | Signification (Meaning) |
|---|---|
| 0 | réservé (reserved) |
| 1 | symétrique actif (symmetric active) |
| 2 | symétrique passif (symmetric passive) |
| 3 | client |
| 4 | serveur (server) |
| 5 | diffusion (broadcast) |
| 6 | message de contrôle NTP (NTP control message) |
| 7 | réservé pour usage privé (reserved for private use) |
Figure 10 : Modes d'association
Stratum (Strate, stratum) : entier de 8 bits représentant la strate, avec des valeurs définies dans la figure 11.
| Valeur (Value) | Signification (Meaning) |
|---|---|
| 0 | non spécifié ou invalide (unspecified or invalid) |
| 1 | serveur primaire (primary server, par exemple équipé d'un récepteur GPS) |
| 2-15 | serveur secondaire (secondary server, via NTP) |
| 16 | non synchronisé (unsynchronized) |
| 17-255 | réservé (reserved) |
Figure 11 : Strate de paquet
Il est coutumier de mapper la valeur de strate 0 dans les paquets reçus à MAXSTRAT (16) dans la variable de pair p.stratum et de mapper les valeurs p.stratum de MAXSTRAT ou supérieures à 0 dans les paquets transmis. Cela permet aux horloges de référence, qui apparaissent normalement à la strate 0, d'être commodément atténuées en utilisant les mêmes algorithmes de sélection d'horloge utilisés pour les sources externes (voir l'annexe A.5.5.1 pour un exemple).
Poll (Sondage) : entier signé de 8 bits représentant l'intervalle maximum entre les messages successifs, en log2 secondes. Les limites par défaut suggérées pour les intervalles de sondage minimum et maximum sont respectivement 6 et 10.
Precision (Précision) : entier signé de 8 bits représentant la précision de l'horloge système, en log2 secondes. Par exemple, une valeur de -18 correspond à une précision d'environ un microseconde. La précision peut être déterminée au démarrage du service comme le temps minimum de plusieurs itérations pour lire l'horloge système.
Root Delay (rootdelay, Délai racine) : délai aller-retour total vers l'horloge de référence, en format court NTP.
Root Dispersion (rootdisp, Dispersion racine) : dispersion totale vers l'horloge de référence, en format court NTP.
Reference ID (refid, ID de référence) : code de 32 bits identifiant le serveur particulier ou l'horloge de référence. L'interprétation dépend de la valeur dans le champ strate. Pour la strate de paquet 0 (non spécifiée ou invalide), il s'agit d'une chaîne ASCII [RFC1345] de quatre caractères, appelée « kiss code », utilisée à des fins de débogage et de surveillance. Pour la strate 1 (horloge de référence), il s'agit d'une chaîne ASCII de quatre octets, justifiée à gauche et remplie de zéros, attribuée à l'horloge de référence. La liste officielle des identificateurs de référence est maintenue par l'IANA ; cependant, toute chaîne commençant par le caractère ASCII « X » est réservée à l'expérimentation et au développement non enregistrés. Les identificateurs de la figure 12 ont été utilisés comme identificateurs ASCII :
| ID | Source d'horloge (Clock Source) |
|---|---|
| GOES | Satellite environnemental en orbite géosynchrone (Geosynchronous Orbit Environment Satellite) |
| GPS | Système de positionnement global (Global Position System) |
| GAL | Système de positionnement Galileo (Galileo Positioning System) |
| PPS | Impulsion par seconde générique (Generic pulse-per-second) |
| IRIG | Inter-Range Instrumentation Group |
| WWVB | Radio LF WWVB Ft. Collins, CO 60 kHz |
| DCF | Radio LF DCF77 Mainflingen, DE 77,5 kHz |
| HBG | Radio LF HBG Prangins, HB 75 kHz |
| MSF | Radio LF MSF Anthorn, UK 60 kHz |
| JJY | Radio LF JJY Fukushima, JP 40 kHz, Saga, JP 60 kHz |
| LORC | Station Radio MF LORAN C, 100 kHz |
| TDF | Radio MF Allouis, FR 162 kHz |
| CHU | Radio HF CHU Ottawa, Ontario |
| WWV | Radio HF WWV Ft. Collins, CO |
| WWVH | Radio HF WWVH Kauai, HI |
| NIST | Modem téléphonique NIST (NIST telephone modem) |
| ACTS | Modem téléphonique NIST (NIST telephone modem) |
| USNO | Modem téléphonique USNO (USNO telephone modem) |
| PTB | Modem téléphonique européen (European telephone modem) |
Figure 12 : Identificateurs de référence
Au-dessus de la strate 1 (serveurs secondaires et clients) : il s'agit de l'identificateur de référence du serveur et peut être utilisé pour détecter les boucles de synchronisation. Si vous utilisez la famille d'adresses IPv4, l'identificateur est l'adresse IPv4 de quatre octets. Si vous utilisez la famille d'adresses IPv6, il s'agit des quatre premiers octets du hachage MD5 de l'adresse IPv6. Notez que, lors de l'utilisation de la famille d'adresses IPv6 sur un serveur NTPv4 avec un client NTPv3, le champ Identificateur de référence semble être une valeur aléatoire et une boucle de synchronisation pourrait ne pas être détectée.
Reference Timestamp (Horodatage de référence) : heure à laquelle l'horloge système a été dernièrement définie ou corrigée, en format d'horodatage NTP.
Origin Timestamp (org, Horodatage d'origine) : heure au client lorsque la demande est partie pour le serveur, en format d'horodatage NTP.
Receive Timestamp (rec, Horodatage de réception) : heure au serveur lorsque la demande est arrivée du client, en format d'horodatage NTP.
Transmit Timestamp (xmt, Horodatage de transmission) : heure au serveur lorsque la réponse est partie pour le client, en format d'horodatage NTP.
Destination Timestamp (dst, Horodatage de destination) : heure au client lorsque la réponse est arrivée du serveur, en format d'horodatage NTP.
Note : le champ Horodatage de destination n'est pas inclus comme champ d'en-tête ; il est déterminé à l'arrivée du paquet et rendu disponible dans la structure de données du tampon de paquet.
Si le NTP a accès à la couche physique, alors les horodatages sont associés au début du symbole après le début de la trame. Sinon, les implémentations devraient tenter d'associer l'horodatage au point le plus tôt accessible dans la trame.
Le MAC se compose de l'identificateur de clé suivi du résumé de message. Le résumé de message, ou somme cryptographique, est calculé comme dans [RFC1321] sur tous les champs d'en-tête NTP et les champs d'extension facultatifs, mais pas le MAC lui-même.
Extension Field n (Champ d'extension n) : voir la section 7.5 pour une description du format de ce champ.
Key Identifier (keyid, Identificateur de clé) : entier non signé de 32 bits utilisé par le client et le serveur pour désigner une clé MD5 secrète de 128 bits.
Message Digest (digest, Résumé de message) : hachage MD5 de 128 bits calculé sur la clé suivie des champs d'en-tête et d'extension de paquet NTP (mais pas les champs Identificateur de clé ou Résumé de message).
Il convient de noter que le calcul du MAC utilisé ici diffère de ceux définis dans [RFC1305] et [RFC4330] mais est cohérent avec la façon dont les implémentations existantes génèrent un MAC.
7.4. The Kiss-o'-Death Packet (Le paquet Kiss-o'-Death)
Si le champ Stratum est 0, ce qui implique non spécifié ou invalide, le champ Reference Identifier peut être utilisé pour transmettre des messages utiles pour les rapports d'état et le contrôle d'accès. Ceux-ci sont appelés paquets Kiss-o'-Death (KoD) et les messages ASCII qu'ils transmettent sont appelés kiss codes. Les paquets KoD ont obtenu leur nom parce qu'une utilisation précoce était de dire aux clients d'arrêter d'envoyer des paquets qui violent les contrôles d'accès du serveur. Les kiss codes peuvent fournir des informations utiles pour un client intelligent, soit NTPv4 soit SNTPv4. Les kiss codes sont codés dans des chaînes ASCII de quatre caractères qui sont justifiées à gauche et remplies de zéros. Les chaînes sont conçues pour les affichages de caractères et les fichiers journaux. Une liste des kiss codes actuellement définis est donnée dans la figure 13. Les destinataires des kiss codes MUST les inspecter et, dans les cas suivants, prendre ces mesures :
a. Pour les kiss codes DENY et RSTR, le client MUST démobiliser toutes les associations à ce serveur et arrêter d'envoyer des paquets à ce serveur ;
b. Pour le kiss code RATE, le client MUST réduire immédiatement son intervalle de sondage à ce serveur et continuer à le réduire chaque fois qu'il reçoit un kiss code RATE.
c. Les kiss codes commençant par le caractère ASCII « X » sont destinés à l'expérimentation et au développement non enregistrés et MUST être ignorés s'ils ne sont pas reconnus.
d. Outre les conditions ci-dessus, les paquets KoD n'ont aucune signification protocolaire et sont éliminés après inspection.
L'horodatage de réception et l'horodatage de transmission (défini par le serveur) sont indéfinis dans un paquet KoD et NE DOIVENT PAS (MUST NOT) être considérés comme ayant des valeurs valides et DOIVENT (MUST) être éliminés.
7.5. NTP Extension Field Format (Format de champ d'extension NTP)
Dans NTPv4, un ou plusieurs champs d'extension peuvent être insérés après l'en-tête et avant le MAC, qui est toujours présent lorsqu'un champ d'extension est présent. Outre la définition du format de champ, ce document ne fait aucune utilisation du contenu du champ. Un champ d'extension contient un message de demande ou de réponse au format illustré dans la figure 14.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Field Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. .
. Value .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Padding (as needed) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 14 : Format de champ d'extension
Tous les champs d'extension sont remplis de zéros jusqu'à une limite de mot (quatre octets). Le champ Type de champ est spécifique à la fonction définie et n'est pas élaboré ici. Bien que la longueur de champ minimale contenant les champs requis soit de quatre mots (16 octets), une longueur de champ maximale reste à établir.
Le champ Longueur est un entier non signé de 16 bits qui indique la longueur du champ d'extension entier en octets, y compris le champ Remplissage.