web-dev-qa-db-fra.com

Quelle est la précision de synchronisation du serveur de temps de Windows? (et ça compense le temps de ping?)

Pour le projet décrit dans Application de cette question , j'ai besoin de la meilleure précision d'horloge possible. Une solution consiste à synchroniser avec précision le type de l'ordinateur horloge temps réel .

  1. Quelle est la précision documentée de la synchronisation avec Windows 7 Régler la date/heure> Heure Internet> Modifier les paramètres> Mettre à jour maintenant ... ?

  2. Plus précisément, compense-t-il le ping du serveur de temps?

    Exemple:

    • le serveur de temps envoie un paquet pour dire qu'il est précisément 12: 00: 00.000
    • disons que le ping moyen entre mon ordinateur et le serveur de temps est de 93 ms (le ping moyen calculé pendant, disons, à la dernière minute)
    • le paquet du serveur de temps atteindra mon ordinateur à 12: 00: 00.093, non?
    • alors Windows devrait régler l'heure à 12: 00: 00.093 et ​​non à 12: 00: 00.000, n'est-ce pas?
  3. Sinon, existe-t-il un logiciel Windows capable de réaliser une telle synchronisation d'horloge en temps réel avec compensation de ping ou un autre type de précision améliorée?

6
Basj

Question très intéressante, j'ai donc creusé dans plusieurs sources.

L'article Partie II: Réglage du temps système par Arno Lentfer de 2012 ( PDF ), contient de nombreuses mesures et dit ceci:

La synchronisation Windows avec une référence d’heure réseau s’est avérée peu précise. En particulier, les versions Windows Vista et 7 semblent avoir perdu certaines fonctionnalités pour une raison inconnue. Malheureusement, il n’ya pas beaucoup d’informations sur ce problème et le peu d’informations disponibles indique en gros que la synchronisation de l’heure Windows ne devrait pas être plus précise que quelques secondes et que le comportement de SetSystemTimeAdjustment peut présenter un problème en ce qui concerne le sens. de la valeur de dwTimeAdjustment. Seul Windows 8 a maintenant surmonté ces inconvénients et son réglage de l'heure système est similaire à celui de Windows XP.

L'article note que de petites erreurs sont intégrées à l'horloge système, qui ne conserve généralement pas l'heure exacte. L'analyse montre qu'avec le matériel examiné, l'heure système peut gagner 0,0448 ms/s par rapport à l'horloge réelle.

L'article de Microsoft Limite de la prise en charge pour configurer le service de temps Windows pour des environnements de grande précision , conclut que le mieux que vous puissiez espérer est une milliseconde, avec Windows 10 et Windows Server 2016 dans un environnement étroitement contrôlé. La documentation de Microsoft détaille les conditions requises pour une précision de 1 seconde, 50 ms et 1 ms, tandis que les anciens systèmes d'exploitation peinent à rester à quelques secondes près.

En revanche, Domain Time II atteint une précision prouvable inférieure à une milliseconde et, lors de l’utilisation du protocole PTP (Precision Time Protocol) IEEE 1588-2008, permet d’obtenir une faible précision à deux chiffres de la microseconde.

L'article de Microsoft décrit les exigences pour une précision donnée:

Précision de la cible: 1 seconde (1) requise

  • Le système cible doit exécuter Windows 10, Windows Server 2016.
  • Le système cible doit synchroniser l'heure d'une source de temps NTP extrêmement précise
  • Les systèmes Windows dans la hiérarchie NTP doivent être correctement configurés
  • La latence réseau unidirectionnelle cumulative entre la cible et la source ne doit pas dépasser 100 ms.

Précision de la cible: exigences de 50 millisecondes

  • L'ordinateur cible doit avoir une latence réseau supérieure à 5 ms entre sa source de temps.
  • Le système cible ne doit pas être plus éloigné de la strate 5 d'une source de temps extrêmement précise
  • Le système cible doit se situer à moins de 6 sauts de réseau de la source de temps très précise
  • L’utilisation moyenne du processeur sur un jour pour toutes les strates ne doit pas dépasser 90%
  • Pour les systèmes virtualisés, l'utilisation moyenne de la CPU par l'hôte sur une journée ne doit pas dépasser 90%.

Remarque: exécutez w32tm /query /status à partir de la ligne de commande pour afficher la strate.

Précision cible: 1 milliseconde requise

  • L’ordinateur cible doit avoir une latence réseau meilleure que 0,1 ms entre sa source de temps
  • Le système cible ne doit pas être plus éloigné de la strate 5 d'une source de temps extrêmement précise
  • Le système cible doit se situer à moins de 4 sauts de réseau de la source de temps très précise
  • L’utilisation moyenne du processeur sur une journée pour chaque strate ne doit pas dépasser 80%
  • Pour les systèmes virtualisés, l'utilisation moyenne de la CPU par l'hôte sur une journée ne doit pas dépasser 80%.

Si vous vous demandez quelle est la strate, il est important de réaliser que NTP est un système hiérarchique semi-stratifié de niveaux d'horloge. Le diagramme suivant provient de l'article NTP (Network Time Protocol). Quelle est sa précision? de Dave Gault ( PDF ):

NTP hierarchy

L'article énumère également les facteurs pouvant avoir un effet néfaste sur la qualité du temps affiché:

  • Vitesse (latence) de la connexion Internet.
  • Strates du ou des serveurs de temps choisis pour la synchronisation.
  • Distance du signal depuis les serveurs (y compris vers et depuis les satellites en orbite).
  • La qualité et la complexité de l'algorithme logiciel utilisé.
    • Est-ce qu'il utilise plus d'un serveur?
    • Est-ce qu'il calcule le délai aller-retour?
    • Compense-t-il le biais systématique?
    • Est-ce qu'il rend compte de la précision de la synchronisation?

Cela est sorti plus longtemps que prévu. Mais pour répondre à vos questions:

Quelle est la précision documentée de la synchronisation avec Windows 7 Ajuster date/heure> Heure Internet> Modifier les paramètres> Mettre à jour maintenant ...?

Cela dépend des exigences relatives à la précision cible ci-dessus qui s'appliquent à votre installation. Si aucune des conditions ci-dessus ne s'applique, votre temps peut être décalé de 2 secondes maximum par rapport au temps réel. Le serveur de temps NTP peut également comporter une imprécision, en fonction de sa strate. Notez également que l'utilisation de l'horloge en temps réel de l'ordinateur, que vous pourrez peut-être mesurer (ou qui peut être disponible chez le fabricant), entraînera une dérive constante dans le temps.

Plus précisément, compense-t-il le ping du serveur de temps?

La réponse est non. C'est à vous de mesurer, en vous rappelant que le temps de ping peut ne pas rester constant.

Conclusion: Si vous avez besoin de plus de précision que celle fournie par les serveurs de temps Internet, vous devez acquérir et utiliser un dispositif d’horloge spécialisé.

Une lecture intéressante est l'article d'Algorithmic Trading Indication de l'heure de précision sous Windows , qui explique comment Microsoft a amélioré ses fonctions d'indication de l'heure internes et avec quelle précision de l'horloge système:

image

Outils utiles pour régler ou vérifier l'heure de l'ordinateur

Si vous souhaitez synchroniser l'heure de votre ordinateur avec des serveurs à bas niveau via Internet, vous pouvez utiliser le produit gratuit Dimension 4 =:

Dimension 4 utilise un protocole Internet de bas niveau, appelé SNTP, pour se connecter à des serveurs de temps Internet spécialement conçus pour maintenir le reste du Web à l'heure depuis plus de 20 ans. Ces serveurs de temps ont généralement un accès direct à leur propre source de temps ou sont directement connectés à d'autres serveurs de temps Internet.

À l’intervalle que vous spécifiez, Dimension 4 se connecte à l’un de ces serveurs de temps Internet, que vous aurez le choix parmi une liste exhaustive construite directement dans Dimension 4. Le serveur de temps renvoie ensuite l’heure correcte à votre ordinateur, où Dimension 4 utilise des algorithmes sophistiqués pour ajuster correctement l'horloge de votre ordinateur à quelques millisecondes du temps réel .

Vous pouvez également vérifier l’horloge de votre ordinateur par rapport au site Web time.is :

image

6
harrymc

C'est une tentative de réglage de l'heure en Python, selon un serveur NTP, avec compensation du temps de parcours du paquet entre le serveur de temps et moi-même (voir algorithme de synchronisation d'horloge ):

NTPSERVER, PORT = 'pool.ntp.org', 123

from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM
import struct, time, sys, datetime
import win32api  # pip install pywin32

t0 = time.time()
with closing(socket(AF_INET, SOCK_DGRAM)) as s:
    s.sendto('\x23' + 47 * '\0', (NTPSERVER, PORT))   # see https://stackoverflow.com/a/26938508
    msg, address = s.recvfrom(1024)                   # and https://stackoverflow.com/a/33436061
t3 = time.time()

unpacked = struct.unpack("!12I", msg[0:struct.calcsize("!12I")])  # ! => network (= big-endian), 12 => returns 12-Tuple, I => unsigned int

t1 = unpacked[8] + float(unpacked[9]) / 2**32 - 2208988800L     # see https://tools.ietf.org/html/rfc5905#page-19
t2 = unpacked[10] + float(unpacked[11]) / 2**32 - 2208988800L   # and https://tools.ietf.org/html/rfc5905#page-13

offset = ((t1 - t0) + (t2 - t3)) / 2    # https://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm
roundtrip = (t3 -  t0) - (t2 - t1)

print "Local computer time (t0)                               %.3f" % t0
print "NTP server time (t1, receive timestamp)                %.3f" % t1 
print "NTP server time (t2, transmit timestamp)               %.3f" % t2
print "Local computer time (t3)                               %.3f" % t3
print "Offset                                                 %.1f ms" % (offset * 1000)
print "Local -> NTP server -> local roundtrip time            %.1f ms" % (roundtrip * 1000)
print "New local computer time                                %.3f" % (t3 + offset)

dt = datetime.datetime.utcfromtimestamp(t3 + offset)
win32api.SetSystemTime(dt.year, dt.month, dt.isocalendar()[2], dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000)

Exemple de sortie:

Local computer time (t0)                               1528290913.275
NTP server time (t1, receive timestamp)                1528290913.297
NTP server time (t2, transmit timestamp)               1528290913.297
Local computer time (t3)                               1528290913.340
Offset                                                 -10.5 ms
Local -> NTP server -> local roundtrip time            65.0 ms
New local computer time                                1528290913.330

Remarque:

  • Nous aurions pu utiliser ntplib à la place, mais l'avantage réside dans le fait que nous avons appris comment cela fonctionne en interne et que le code n'est pas long de toute façon!

  • Dans le cas t1 == t2 (cela a toujours été vrai lors de mes tests), alors t3 + offset = t1 + (t3 - t0)/2, et ce calcul donne exactement le même résultat que celui de cette réponse édition précédentetcompensated = t + (now-start) / 2.

  • ((t1 - t0) + (t2 - t3)) / 2 vraiment indique le décalage entre l'horloge locale et NTP l'horloge du serveur. En effet, appelons trip le temps de parcours aller simple d'un paquet pour aller de l'ordinateur local au serveur NTP. Puis t1 = t0 + offset + trip et t3 = t2 - offset + trip. Puis ((t1 - t0) + (t2 - t3)) / 2 = (offset + trip + offset - trip) / 2 = offset.

1
Basj