# Network Time Protocol

Network Time Protocol (NTP) (litt. « protocole de temps réseau »), parfois appelé protocole de synchronisation de réseau, est un protocole qui permet de synchroniser, via un réseau informatique, l'horloge locale d'ordinateurs sur une référence d'heure.
La première version v.0 de NTP, formalisée dans la RFC 958, date de septembre 1985. Dès le début, ce protocole fut conçu pour offrir une précision de synchronisation meilleure que la seconde. Par rapport au service « Time Protocol » qui offre un service d'heure sans proposer une infrastructure, le projet NTP propose une solution globale et universelle de synchronisation qui est utilisable dans le monde entier.
La version 3 de NTP est la plus répandue à ce jour. Elle est formalisée par la RFC 1305 et a le statut « Draft Standard (en) » c'est-à-dire « spécification finale », elle spécifie plusieurs aspects :
* la description du protocole réseau ;
* les modes de fonctionnement ;
* les algorithmes à mettre en place dans les machines.
La mise au point de ce protocole et des algorithmes a été menée de pair avec le développement d'un logiciel conforme à ces spécifications. De ce fait, cette réalisation fait office de référence dans le domaine et est appelée « logiciel NTP » même si d'autres solutions existent. Ces travaux ont été réalisés en grande partie à l'Université du Delaware grâce au professeur David L. Mills et à une importante équipe de bénévoles.
La version 4 de NTP est une révision importante publiée dans la RFC 5905 en juin 2010.
Aussitôt après la parution de la version 3 de NTP, une version simplifiée est apparue, appelée « Simple Network Time Protocol » (SNTP) qui a également fait l'objet de plusieurs RFC. Par rapport à NTP, cette version est simplifiée dans le sens qu'elle ne spécifie pas les algorithmes à mettre en place dans les machines.

## Présentation générale de NTP

Le NTP est un protocole permettant de synchroniser l'horloge d'un ordinateur avec celle d'un serveur de référence. NTP est un protocole basé sur UDP et utilise le port 123.
Le protocole NTP comprend :
* une partie architecture,
* une partie messagerie,
* et une partie algorithmique.

### Partie architecture
#### Architecture du réseau NTP

L'architecture NTP prévoit :
* la diffusion verticale arborescente de proche en proche d'une heure de référence à partir d'une ou plusieurs machines racines garantes d'une grande précision. Dans cette arborescence, chaque nœud choisit parmi ses nœuds parents, celui qui présente les meilleures garanties de qualité et hérite au passage d'un attribut nommé stratum qu'il transmet à ses descendants. Les machines de stratum 1 sont les machines racines et à chaque traversée d'un nœud ce nombre augmente d'une unité. Ce stratum est une mesure de la distance d'un nœud aux machines racines, il est considéré comme un indicateur de la qualité de synchronisation qu'une machine donnée peut offrir à ses descendants.
* la diffusion latérale à des machines paires d'une heure commune. Cette diffusion vient en complément de la précédente ; elle permet à ces machines de partager une référence de temps qui leur est commune. Cette diffusion améliore la résilience de cette architecture NTP dans le sens où elle permet de suppléer une déficience locale/temporaire de connectivité vers les machines racines, voire de permettre à un groupe de machines de conserver entre elles une même référence relative en l'absence de machines racines.
Dans la terminologie NTP, les serveurs de stratum 1 sont appelés serveurs primaires, et les autres sont appelés serveurs secondaires.
Chaque nœud de cette architecture doit être configuré en lui indiquant au minimum quels sont ses serveurs parents et/ou collatéraux. C'est à la charge de chaque utilisateur de réaliser localement cette configuration. C'est cette agrégation de configurations qui, de proche en proche, crée le réseau NTP, il n'est pas préexistant ni même configuré de façon centralisée. Cette architecture est flexible, extensible et robuste, mais c’est à la charge des utilisateurs d’y contribuer.

#### Méthodes pour la diffusion de l'heure

La diffusion de l'heure est basée :
* sur un modèle du type « client/serveur » pour la diffusion verticale :
** un nœud « serveur » répond aux demandes d'heure émises par un nœud « client » ;
** les parents sont les serveurs, les enfants sont les clients ;
** en opérant dans le mode « serveur », un nœud annonce son désir de synchroniser ;
** en opérant dans le mode « client », un nœud annonce son désir d’être synchronisé ;
** le mode d'adressage « unicast » est utilisé pour transférer les messages de demande et de réponse ;
* sur un modèle du type « symétrique actif/passif » pour la diffusion latérale :
** un nœud « symétrique passif » répond aux demandes d'heure émises par un nœud « symétrique actif » ;
** ce paradigme est proche du précédent avec la différence suivante : une fois la demande initiale émise, « serveur » et « client » échangent leur rôle tour à tour, la réponse de l'un devient une demande pour l'autre ;
** en opérant dans le mode « symétrique », aussi bien passif qu’actif, un nœud annonce son désir de synchroniser et d’être synchronisé ;
** comme précédemment le mode d'adressage « unicast » est utilisé pour transférer les messages de demande et de réponse ;
* sur un modèle du type « broadcast » pour la diffusion locale :
** un nœud émet spontanément et périodiquement des messages de l'heure courante à destination de voisins d'opportunité proches, un peu à la manière d’une horloge parlante sans se préoccuper de savoir si son information d'heure sera utilisée ;
** en opérant dans ce mode, un nœud annonce son désir de synchroniser ses voisins ;
** le mode d'adressage « broadcast » est utilisé pour transférer ces messages horaires ; de par ce fait, et également parce que par défaut les routeurs ne routent pas les messages « broadcast », cette méthode de diffusion de l'heure ne concerne que les machines d'un même réseau local.

### Partie messagerie

La messagerie NTP prévoit :
* des messages pour qu'un client interroge un serveur et que celui-ci lui retourne l'heure courante ;
* des messages de service pour interroger un client donné sur son état interne.
Lors de la parution de nouvelles versions de NTP, la structure des nouveaux messages est formée en agrégeant les informations nouvelles à la suite de celle des messages de version précédente. Cette façon de procéder permet l'interopérabilité des différentes versions ce qui facilite la migration globale du parc de machines d'une version ancienne vers une nouvelle.

### Partie algorithmique

Le protocole NTP prévoit pour chaque client des algorithmes :
* pour calculer la période d'interrogation du ou des serveurs ;
* pour calculer l'écart de son heure locale avec celle d'un serveur donné ;
* pour calculer la durée de transit des messages sur le réseau ;
* pour choisir le serveur qui présente les meilleures garanties de qualité, et calculer ainsi son stratum local ;
* pour filtrer les écarts et calculer les corrections temps/fréquence à appliquer sur son horloge locale ;
* pour gérer les secondes intercalaires.

## Description détaillée du « fonctionnement NTP »

Le message de demande d'heure envoyé par un client vers un serveur et celui pour la réponse ont la même structure. Celle-ci est schématisée ci-dessous, elle correspond à la version 3 de NTP, mais le principe général décrit ci-dessous est conservé au fil des versions; les informations principales utilisées dans ce message pour calculer les écarts d'heure entre client et serveur sont les suivantes :
* OT : Originate Timestamp; heure de départ de la requête,
* RT : Receive Timestamp; heure de réception de la requête,
* TT : Transmit Timestamp; heure d'émission de la requête et/ou de la réponse.
Les autres informations contenues dans ce message sont utilisées à des fins de gestion ; leur usage n'est pas détaillé dans cet article, on pourra se reporter à la RFC 1305 pour plus de détails.
* LI : indicateur d'insertion/retrait d'une seconde intercalaire la dernière minute du jour courant,
* VN : numéro de version,
* Mode : mode de fonctionnement,
* Stratum : stratum de l'horloge locale,
* Poll : intervalle minimum entre deux messages successifs,
* Precision: précision de l'horloge locale.

### Description du modèle NTP « client/serveur »

La façon dont client et serveur gèrent ces informations est illustrée sur le schéma ci-dessous :
* à T1, lorsque le client émet son message pour interroger le serveur sur l'heure courante, il envoie un message dans lequel il renseigne le champ TT avec l'heure courante T1 indiquée par son horloge locale ;
* à T'1, lorsque le serveur reçoit le message, il complète aussitôt le champ RT du message avec l'heure courante T'1 indiquée par son horloge locale, et recopie le champ TT dans le champ OT ;
* à T'2, lorsque le serveur émet son message de réponse, il complète le champ TT du message avec l'heure courante T'2 indiquée par son horloge locale ;
* à T2, lorsque le client reçoit le message de réponse, il note aussitôt l'heure T2 de réception indiquée par son horloge locale.
Le client peut alors calculer le délai aller/retour $\delta$ de ces 2 messages ainsi que l'écart $\theta$ entre son horloge locale et celle du serveur :
Méthode de calcul « client/serveur » :
| | délai δ aller/retour | écart θ entre les horloges |
| Client | $\scriptstyle {(T2-T1)-(T'2-T'1)}$ | $\textstyle {\frac {(T'1-T1)+(T'2-T2)}{2}}$ |
| Serveur | aucun calcul | aucun calcul |
Plus court est le délai $\delta$, meilleure est la précision avec laquelle est connu l'écart $\theta$ entre les deux horloges.

### Description du modèle NTP « symétrique Actif / Passif »

Ce modèle est proche du précédent avec la différence suivante : une fois la demande initiale émise, « serveur » et « client » échangent leur rôle tour à tour, la réponse de l'un devient une demande pour l'autre, c'est ce que montre l'image ci-dessous.
Chacun des nœuds « Actif » et « Passif » peut alors calculer le délai aller/retour des messages et l'écart entre son horloge locale et celle du nœud opposé :
Méthode de calcul « symétrique Actif / Passif » :
| | délai δ aller/retour | écart θ entre les horloges |
| Actif | $\scriptstyle {(T2-T1)-(T'2-T'1)}$ | $\textstyle {{\frac {(T'1+T'2)}{2}}-{\frac {(T1+T2)}{2}}}$ |
| Passif | $\scriptstyle {(T'3-T'2)-(T3-T2)}$ | $\textstyle {{\frac {(T2+T3)}{2}}-{\frac {(T'2+T'3)}{2}}}$ |
Et de la même façon que précédemment, de façon symétrique pour chacun des deux nœuds, plus court est le délai $\delta$ et meilleure est la précision avec laquelle est connue l'écart $\theta$ entre les deux horloges.

### Description du modèle NTP « broadcast »

Le nœud émetteur du message renseigne le champ TT avec l'heure courante T1 indiquée par son horloge locale. Le récepteur de ce message utilise cette heure comme heure locale en retranchant au préalable le délai estimé de transmission du message.

## Pourquoi synchroniser les horloges des ordinateurs

Bien que chaque ordinateur calcule son horloge à partir d'un oscillateur à quartz, il ne peut atteindre la précision des horloges de référence. Leurs horloges internes ont tendance à dériver jusqu'à plusieurs secondes par jour, par rapport à l'heure officielle. Ceci rend nécessaire de synchroniser régulièrement l'horloge interne avec une horloge de référence.
Avec le développement des réseaux informatiques, la synchronisation des horloges des systèmes informatiques communicants entre eux est devenue nécessaire. Certains domaines ont absolument besoin d'avoir un temps de référence, on peut citer notamment :
* le contrôle aérien ;
* les échanges commerciaux ;
* les transactions journalisées des bases de données ;
* les logs des systèmes informatiques ;
* la diffusion de contenu multimédia en temps-réel, comme pour des vidéoconférences ;
* etc.
Sans une bonne synchronisation des horloges de tous les systèmes communicants entre eux, certains services ne sont pas utilisables correctement. C'est ainsi que rapidement, il a été nécessaire de définir des méthodes permettant de synchroniser les horloges sur une heure de référence. Dans le cas de NTP, ce dernier utilise le temps universel coordonné (UTC).

## Histoire

NTP est l'un des plus anciens protocoles d'Internet encore en service. Il fut conçu pour offrir une précision inférieure à la seconde dans la synchronisation des horloges et remplace à ce titre le Time protocol (TP, RFC 868), datant de mai 1983.
La version 3 de NTP est la plus aboutie à ce jour, elle spécifie plusieurs aspects :
* la description du protocole réseau ;
* les modes de fonctionnement ;
* les algorithmes à mettre en place dans les machines.
La mise au point de ce protocole et des algorithmes ont été menés de pair avec le développement d'un logiciel conforme à ces spécifications. De ce fait, cette réalisation fait office de référence dans le domaine et est appelée logiciel NTP. Ces travaux ont été réalisés en grande partie par l'Université du Delaware sous la houlette du professeur David L. Mills.
Aussitôt après la parution de cette version 3 de NTP, une version simplifiée est apparue, appelée Simple Network Time Protocol (SNTP) qui a également fait l'objet de plusieurs RFC. Par rapport à NTP, cette version est simplifiée dans le sens qu'elle ne spécifie pas les algorithmes à mettre en place dans les machines.

### NTP
#### Tableau récapitulatif

| date | version | RFC | statut |
| septembre 1985 | v0 | RFC 958 | rendu obsolète par RFC 1059 |
| juillet 1988 | v1 | RFC 1059 | rendu obsolète par RFC 1119 |
| octobre 1989 | v2 | RFC 1119 | rendu obsolète par RFC 1305 |
| mars 1992 | v3 | RFC 1305 | rendu obsolète par RFC 5905 |
| juin 2010 | v4 | RFC 5905 | Standard proposé |

#### Version 0

C'est le professeur David L. Mills de l'Université du Delaware, qui en septembre 1985 proposa NTP (RFC 958), cette version est une version de développement, elle est à ce titre considérée comme une version 0. Mais le développement de NTP remonte à quelques années auparavant, avec une démonstration en 1979 à la National computer conference (NCC) et sa mise en application quelques années plus tard dans le routeur logiciel Fuzzball, via le protocole de routage HELLO (RFC 891).

#### Version 1

Dans cette première version stable, des filtres et des algorithmes de sélections sont ajoutés (RFC 956), ce qui offre une nette amélioration de la précision. NTP a atteint la version 1 en juillet 1988 (RFC 1059).

#### Version 2

En octobre 1989, NTP passa en version 2 (RFC 1119), avec notamment l'ajout d'une authentification par clé symétrique (utilisant DES-CBC).

#### Version 3

En 1989, Digital Equipment Corporation (DEC) présenta un protocole de synchronisation concurrent, le Digital time synchronization service (DTSS). Selon la communauté développant NTP, le gros défaut de DTSS était que le protocole pouvait dans certains cas avoir une importante perte de précision, car il ne prenait pas en compte la fréquence des horloges. Alors que la communauté autour de DTSS pointait du doigt la mauvaise architecture des algorithmes de correction. C'est ainsi qu'après discussion, il fut décidé que NTP utiliserait l'algorithme de Marzullo (en), utilisé par DTSS. Cela aboutit au passage à la version 3 de NTP (RFC 1305), en mars 1992. Cette version ajoute également le mode broadcast, aux deux modes déjà existants (client-serveur et symétrique).

#### Version 4

Depuis 1994, une nouvelle révision du protocole est en cours. La version 4 est très utilisée. Les améliorations portent notamment sur :
* la calibration et la stabilisation des modèles d'horloges du noyau des systèmes d'exploitation
* la fiabilité
* la mise en place d'une configuration automatisée
* la réduction de la taille des échanges
* l'authentification (avec l'utilisation de la cryptographie à clé publique)
Parallèlement à cela, des travaux sur un nouveau modèle d'horloge pour les noyaux des systèmes d'exploitation, ayant une précision de l'ordre de la nanoseconde, sont également en cours.

### SNTP

| date | version | RFC | description | statut |
| août 1992 | | RFC 1361 | SNTP | rendu obsolète par RFC 1769 |
| mars 1995 | v3 | RFC 1769 | SNTP | rendu obsolète par RFC 4330 |
| octobre 1996 | v4 | RFC 2030 | SNTP pour IPv4, IPv6 et OSI | rendu obsolète par RFC 4330 |
| janvier 2006 | v4 | RFC 4330 | SNTP pour IPv4, IPv6 et OSI | Informational |
Le Simple Network Time Protocol (SNTP) est une version simplifiée du protocole NTP, utilisant le même format de paquet réseau. La synchronisation en utilisant SNTP se base le plus souvent sur un seul serveur de temps. La simplicité est possible au détriment de l'utilisation de certains algorithme de NTP. En conséquence, il n'y a pas de compensation des déviations de l'heure du système local. SNTP offre donc un niveau de précision inférieur à celui de NTP
De plus, la spécification SNTP recommande de n'utiliser SNTP qu'aux extrémités d'un réseau NTP, c'est-à-dire au niveau stratum 1 (avec une seule source de synchronisation) et au niveau des nœuds de stratum le plus élevé.
Ce choix d'un nombre réduit d'algorithmes et d'une unique communication client-serveur permet la synchronisation avec SNTP en utilisant beaucoup moins de ressources qu'avec NTP. Cela est particulièrement utile pour les appareils simples ou les systèmes ne disposant que d'une faible puissance de calcul, où les exigences de précision et de fiabilité ne sont pas trop élevées.

## Principe

En plus de définir le protocole réseau permettant de transmettre l'heure de référence, NTP définit une architecture, différentes méthodes et algorithmes visant à limiter au maximum la dérive par rapport à cette heure de référence, dû au temps de transmission.

### Ce que ne fait pas NTP

L'heure de référence fournie par NTP est UTC, à ce titre, il ne s'occupe pas :
* du changement de l'heure dû au fuseau horaire ;
* du passage à l'heure d'été et d'hiver.
Cela est du ressort du système d'exploitation, qui suivant l'endroit où l'administrateur a déclaré que l'ordinateur se trouvait, doit effectuer les corrections adéquates pour se caler sur l'heure légale.
Aucun mécanisme de chiffrement n'est fourni, les messages NTP circulent en clair sur le réseau.

### Architecture

Le réseau NTP est composé :
* de récepteurs récupérant l'heure de référence par radios, câbles, satellites ou directement depuis une horloge atomique ;
* de serveurs de temps récupérant l'heure de référence auprès des récepteurs ou bien auprès d'autres serveurs de temps ;
* de clients récupérant l'heure de référence auprès des serveurs de temps.
Tous ces systèmes sont organisés de façon hiérarchique, dont chaque couche ou niveau est appelé une strate. Chaque client NTP est également un serveur et se synchronise avec d'autres serveurs, le plus souvent de la strate supérieure. La strate 0 comprend des horloges de référence (récepteurs GPS ou grandes ondes, horloges au césium ou au rubidium, oscillateur à quartz thermostaté…) qui ne sont pas connectées aux serveurs de strate 1 via un réseau mais via une interface comme un port série. La norme prévoit jusqu'à 16 strates, mais la plupart des clients se situent dans les strates 3 ou 4. La strate 16 est aussi utilisée par les serveurs qui ne sont synchronisés à aucune source externe. La redondance des serveurs et leur organisation permet une répartition de la charge et ainsi la fiabilité du réseau.
En 1999, on estimait le nombre :
* de serveurs de strate 1 à environ 300 ;
* de serveurs de strate 2 à environ 20 000 ;
* de serveurs de strate 3 à environ 80 000.
sur un total de 175 000 serveurs NTP
En décembre 2006, le nombre de clients NTP était certainement de plusieurs dizaines de millions.
De nos jours, la quasi-totalité des systèmes d'exploitation utilise le protocole NTP. La configuration par défaut ne vise cependant pas à garantir un contrôle précis de l'horloge du système mais simplement à remettre approximativement la machine à l'heure de temps en temps.
A noter que dans un domaine Microsoft le NTP synchronise les postes de travail depuis le domaine.

### Implémentation

Le temps est défini comme un entier de 64 bits :
* les 32 bits de poids forts correspondent au nombre de secondes écoulées depuis le 1er janvier 1900 à minuit ;
* les 32 bits restant représentent la fraction d'une seconde.
L'échelle de temps est donc de 2$^{32}$ secondes (soit un peu plus de 136 ans), avec une résolution théorique de 2$^{-32}$ seconde (ce qui correspond à un peu moins de 0,233 nanoseconde).
NTP utilise l'algorithme d'intersection (en) (une version modifiée de l'algorithme de Marzullo (en) pour choisir les horloges sources et prend en charge l'ajout de secondes additionnelles. La version 4 du protocole permet de maintenir le temps d'une machine avec une précision de 10 ms à travers Internet et peut permettre une précision de 200 µs sur des réseaux locaux.
Les ordinateurs clients peuvent calculer leur dérive interne entre deux requêtes et la corriger. Cela permet d'affiner le calcul de la dérive (drift) et sa compensation en espaçant progressivement les requêtes. Plus le temps entre deux requêtes est long, plus le calcul est précis. Ce principe permet de lisser et de réduire considérablement la charge des serveurs. La pire des pratiques serait de faire des requêtes à heures fixes, surtout si de nombreux clients utilisent les mêmes.
Le logiciel ntp peut être remplacé par chrony, spécialement conçu pour les machines Unix/Linux connectées par intermittence à Internet.
Bien que NTP soit le plus souvent utilisé avec UDP, il peut aussi l'être avec TCP.
Cette implémentation n'est pas sujet au bug de l'an 2038 mais au bug de l'an 2036.