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 .
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 ... ?
Plus précisément, compense-t-il le ping du serveur de temps?
Exemple:
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?
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
Précision de la cible: exigences de 50 millisecondes
Remarque: exécutez w32tm /query /status
à partir de la ligne de commande pour afficher la strate.
Précision cible: 1 milliseconde requise
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 ):
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:
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 :
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
.