5. Horloges Locales
Afin de mettre en œuvre une horloge locale précise et exacte, l'hôte doit être équipé d'une horloge matérielle composée d'un oscillateur et d'une interface et capable de la précision et de la stabilité requises. Une horloge logique est ensuite construite en utilisant ces composants plus des composants logiciels qui ajustent le temps apparent et la fréquence en réponse aux mises à jour périodiques calculées par NTP ou un autre protocole de synchronisation temporelle tel que Hellospeak [MIL83b] ou le Unix 4.3bsd TSP [GUS85a]. Cette section décrit le modèle et l'implémentation de l'horloge locale Fuzzball, qui comprend des dispositions pour l'ajustement précis du temps et de la fréquence et peut maintenir le temps à moins de 15 ns et la fréquence à moins de 0,3 ms par jour. Le modèle convient à une utilisation avec des oscillateurs à quartz compensés et non compensés et peut être adapté aux oscillateurs de fréquence d'alimentation. Un résumé des caractéristiques de ces types d'oscillateurs et d'autres peut être trouvé dans l'Annexe E, tandis qu'une analyse mathématique complète du modèle d'horloge locale NTP peut être trouvée dans l'Annexe G.
Il est important de noter que l'implémentation particulière décrite n'est qu'une des nombreuses implémentations possibles qui fournissent une fonctionnalité équivalente. Cependant, il est tout aussi important de noter que le modèle d'horloge décrit dans l'Annexe G et qui est la base de l'implémentation implique un type particulier de boucle de rétroaction de contrôle qui est potentiellement instable si les règles de conception sont enfreintes. Le modèle et les paramètres décrits dans l'Annexe G sont conçus pour fournir un temps précis et stable dans des conditions de fonctionnement typiques en utilisant du matériel conventionnel et face aux perturbations de la connectivité matérielle ou réseau. Les paramètres ont été conçus pour un fonctionnement fiable dans un sous-réseau hiérarchique à plusieurs niveaux où un fonctionnement instable à un niveau peut perturber de nombreux autres niveaux.
5.1. Implémentation Fuzzball
L'horloge locale Fuzzball consiste en une collection de registres matériels et logiciels, ainsi qu'un ensemble d'algorithmes, qui implémentent une horloge logique qui fonctionne comme un oscillateur discipliné et se synchronise sur une source externe. Ce qui suit est une description de ses composants et de son mode de fonctionnement. Notez que toute l'arithmétique est en entier en complément à deux et que tous les décalages "<<" et ">>" sont arithmétiques (remplissage de signe pour les décalages à droite et remplissage de zéro pour les décalages à gauche). Notez également que x << n est équivalent à x >> -n.
Les principaux composants de l'horloge locale sont le registre d'Horloge de 48 bits et le Prescaler de 32 bits qui fonctionnent comme un oscillateur discipliné s'incrémentant en millisecondes par rapport à minuit au point de fraction. Le registre d'Ajustement d'Horloge de 32 bits est utilisé pour ajuster la phase de l'oscillateur par étapes graduelles afin d'éviter les discontinuités dans l'échelle de temps indiquée. Son contenu est désigné x dans ce qui suit. Le registre de Compensation de Biais de 32 bits est utilisé pour ajuster la fréquence de l'oscillateur en ajoutant de petits incréments de phase à des intervalles d'ajustement périodiques et peut compenser des erreurs de fréquence allant jusqu'à 0,01% ou ±100 ppm. Son contenu est désigné y dans ce qui suit. Le compteur Watchdog de 16 bits et le registre de Conformité de 32 bits sont utilisés pour déterminer la validité, ainsi que pour établir la bande passante PLL et l'intervalle de sondage (voir Annexe G). Le contenu du registre de Conformité est désigné z dans ce qui suit. Le registre d'Ajustement PPS de 32 bits n'est utilisé que lorsqu'un signal d'impulsion par seconde (PPS) est disponible et est utilisé pour ajuster l'horloge.
5.2. Ajustements de Phase Graduels
Le registre d'Ajustement d'Horloge est utilisé pour ajuster la phase de l'horloge locale par étapes graduelles. À chaque interruption d'horloge, le contenu x du registre d'Ajustement d'Horloge est ajouté au registre Prescaler:
Prescaler <- Prescaler + TICK + x
Puisque x peut être un entier positif ou négatif, l'opération ci-dessus varie la fréquence de l'horloge locale. À chaque changement de seconde, le registre d'Ajustement d'Horloge est augmenté ou diminué de CLOCK.ADJUST (typiquement 8), ce qui a pour effet d'augmenter ou de diminuer la fréquence de l'horloge et de diminuer ou d'augmenter en conséquence le temps nécessaire pour ajuster l'horloge. Dans le cas où le décalage résiduel est inférieur à CLOCK.MAX (typiquement 128 ms), la fréquence de l'horloge est ajustée d'une plus petite quantité et l'époque de l'horloge est ajustée d'une quantité proportionnelle au décalage résiduel.
5.3. Ajustements de Phase par Étapes
Lorsque l'amplitude de la correction dépasse CLOCK.MAX (typiquement 128 ms), un ajustement par étapes est effectué. L'ajustement par étapes est utilisé lorsque le temps de l'horloge locale diffère significativement du temps de référence, comme après un redémarrage ou lorsqu'une correction est requise en raison d'un changement de fuseau horaire. Dans un ajustement par étapes, l'horloge est définie directement sur la nouvelle heure, et toutes les estimations en cours de fréquence et de conformité sont réinitialisées.
Le compteur Watchdog est réinitialisé à zéro chaque fois que le registre d'Ajustement d'Horloge est mis à jour. Si le compteur atteint la valeur CLOCK.HOLDTC (typiquement 2048 s ou environ 34 minutes), le registre d'Ajustement d'Horloge est réinitialisé à zéro. Cela fournit de l'hystérésis et empêche l'utilisation de données de décalage obsolètes.
5.4. Questions d'Implémentation
Le modèle d'horloge locale particulier décrit ici et dans l'Annexe G est basé sur une boucle de rétroaction de second ordre. La constante de temps de la boucle est relativement longue, de l'ordre de plusieurs heures, afin de minimiser l'effet des délais réseau transitoires et de maximiser la stabilité. En conséquence, les changements de correction de fréquence peuvent prendre un temps considérable pour se terminer, en particulier après un redémarrage ou un ajustement de phase par étapes. Afin d'accélérer la réponse de la boucle, le registre d'Ajustement d'Horloge peut être préchargé avec la dernière valeur calculée avant un arrêt.
Dans l'implémentation Fuzzball, une installation complète de surveillance et de contrôle est fournie pour examiner toutes les variables d'horloge locale et contrôler le fonctionnement de l'horloge. De plus, une fonction spéciale fournit un affichage de l'heure indiquant non seulement la lecture de l'horloge, mais aussi la conformité et si une source de synchronisation valide est disponible. Des informations supplémentaires sur la conception et l'implémentation de l'horloge locale Fuzzball peuvent être trouvées dans [MIL88b].
Le modèle d'horloge locale décrit ici est spécifiquement conçu pour fonctionner avec NTP et dans l'environnement Internet. Cependant, il existe de nombreuses autres possibilités qui peuvent être plus appropriées dans différentes circonstances. Par exemple, certains systèmes peuvent avoir accès à un oscillateur de précision hautement stable sur de longs intervalles, tel qu'un oscillateur au césium ou un récepteur GPS. Dans de tels cas, les mécanismes de correction de fréquence peuvent être inutiles ou inappropriés. De plus, si une haute précision sur des intervalles d'une seconde environ est requise, comme pour les applications vocales ou vidéo, les mécanismes de correction de phase graduelle décrits ici peuvent ne pas fournir une précision adéquate. Dans de tels cas, une certaine forme de prédicteur-correcteur ou de boucle à verrouillage de phase peut être nécessaire pour interpoler entre les mises à jour peu fréquentes de NTP.
Comme mentionné précédemment, dans certaines configurations, une impulsion de synchronisation de précision espacée à des intervalles d'une seconde peut être disponible. Dans de tels cas, il peut être approprié d'utiliser le signal PPS pour discipliner la fréquence de l'horloge locale, tout en utilisant NTP pour discipliner la numérotation des secondes, minutes, heures et jours. Cela peut fournir des précisions de l'ordre des microsecondes tout en fournissant toujours un temps UTC authentique. Dans de tels cas, il faut veiller à ce que la source de numérotation ne défaille pas sans prendre les mesures appropriées pour supprimer les mises à jour ultérieures du signal PPS.