首页 > 解决方案 > 将本地计算机时钟与 NTP 时间同步

问题描述

我正在尝试将在 Windows 10 上运行的本地计算机时钟同步到time.nist.gov. 我从服务器流式传输数据(假设是 NTP 同步的)并且我正在研究优化延迟,所以我需要首先确保我有一个参考点。

我已经W32Time自动运行了。即使在强制与 同步后os.system('w32tm /resync/nowait'),我总是会得到约 50 毫秒的偏移量。这是否抵消了数据包随机路由的背景统计噪声?有没有办法强制准确同步?

基于如何使用 Python ntplib 将服务器时间降低到毫秒精度?Python ntplib 响应中的所有字段是什么,它们是如何使用的?,这是我使用的:

import ntplib
from datetime import datetime, timezone

def get_ntp_time():

    ntp_pool = ['pool.ntp.org', 'time.nist.gov']

    def call_ntp(serverAddress):
        call = ntplib.NTPClient()
        return call.request(server, version=3)

    for server in ntp_pool:
        response = call_ntp(server)
        print(f"server: {server}")
        print(f"request packet sent (as LOCAL client time, orig_time): {datetime.fromtimestamp(response.orig_time, timezone.utc)}")
        print(f"request packet received (as NTP server time, recv_time): {datetime.fromtimestamp(response.recv_time, timezone.utc)}")
        print(f"response packet sent (as NTP server time, tx_time): {datetime.fromtimestamp(response.tx_time, timezone.utc)}")
        print(f"response packet received (as LOCAL client time, dest_time): {datetime.fromtimestamp(response.dest_time, timezone.utc)}")
        print(f'round trip duration: {response.delay} s')
        print(f'* adjusted time, tx_time + delay/2: {datetime.fromtimestamp(response.tx_time + response.delay/2, timezone.utc)}')
        print(f'* adjusted time, dest_time + offset: {datetime.fromtimestamp(response.dest_time + response.offset, timezone.utc)}')
        print(f'correction to client: {response.delay/2 - response.offset} s\n')
        # for attr in dir(response):
            # if not attr .startswith('_'):
                # print("response.%s = %r" % (attr, getattr(response, attr)))
        print('-')
get_ntp_time()

我明白了:

server: pool.ntp.org
request packet sent (as LOCAL client time, orig_time): 2021-04-23 16:43:16.410470+00:00
request packet received (as NTP server time, recv_time): 2021-04-23 16:43:16.407630+00:00
response packet sent (as NTP server time, tx_time): 2021-04-23 16:43:16.407707+00:00
response packet received (as LOCAL client time, dest_time): 2021-04-23 16:43:16.469487+00:00
round trip duration: 0.05893993377685547 s
* adjusted time, tx_time + delay/2: 2021-04-23 16:43:16.437177+00:00
* adjusted time, dest_time + offset: 2021-04-23 16:43:16.437177+00:00
correction to client: 0.06177997589111328 s

-
server: time.nist.gov
request packet sent (as LOCAL client time, orig_time): 2021-04-23 16:43:16.528863+00:00
request packet received (as NTP server time, recv_time): 2021-04-23 16:43:16.514034+00:00
response packet sent (as NTP server time, tx_time): 2021-04-23 16:43:16.514035+00:00
response packet received (as LOCAL client time, dest_time): 2021-04-23 16:43:16.582343+00:00
round trip duration: 0.05347871780395508 s
* adjusted time, tx_time + delay/2: 2021-04-23 16:43:16.540774+00:00
* adjusted time, dest_time + offset: 2021-04-23 16:43:16.540774+00:00
correction to client: 0.06830835342407227 s

对于每台服务器,correction无论我运行此代码多少次,都大致保持在 50-100 毫秒的范围内。

标签: pythonsynchronizationclockntp

解决方案


在客户端和远程时间源之间的 Windows 环境中,50-100 毫秒的时间偏移并不罕见。请注意,测量中的往返持续时间超过 50 毫秒。

这篇Microsoft 文章定义了如何为高精度环境配置 Windows 时间服务,以实现 1 秒、50 毫秒和 1 毫秒精度的目标。

时间准确性需要从高度准确的权威时间源到终端设备的准确时间的端到端分布。任何引入网络不对称的东西都会对准确性产生负面影响,例如物理网络设备或目标系统上的高 CPU 负载。

此外,Microsoft 文章指出,1 毫秒的精度要求目标计算机在其时间源之间具有优于 0.1 毫秒的网络延迟,而 50 毫秒的精度需要 5 毫秒或更小的网络延迟。时间源的层级和从时间源到目标计算机的网络跳数也是影响因素。

如果使用NTP 池中的一些本地 NTP 服务器,您可能会得到不同的结果。在家附近试一试;例如 1.us.pool.ntp.org。2.us.pool.ntp.org 等用于美国境内的服务器。


推荐阅读