我正在尝试将在Windows10上运行的本地计算机时钟同步到time.nist.gov。我从服务器流式传输数据(假设是NTP同步的),并且我正在寻找优化延迟,因此我需要首先确保我有一个参考点。
我让W32Time自动运行。即使在强制与os.system('w32tm /resync/nowait')同步之后,我也总是得到大约50ms的偏移。这是数据包随机路由产生的背景统计噪声吗?有没有办法强制精确同步?
在How to ntp server time down to millisecond precision using Python ntplib?和What are all the fields in a Python ntplib response, and how are they used?的基础上,我使用的是:
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-100ms范围内。
发布于 2021-05-29 02:54:19
在Windows环境中,客户端和远程时间源之间的50-100ms时间偏移并不少见。请注意,您的测量中的往返持续时间超过50ms。
此Microsoft article定义如何为高精度环境配置Windows时间服务,以实现1秒、50毫秒和1毫秒精度的目标。
时间准确性要求将准确的时间从高度精确的权威时间源到终端设备的端到端分布。任何引入网络不对称性的因素都会对准确性产生负面影响,例如物理网络设备或目标系统上的高CPU负载。
此外,Microsoft的文章指出,1毫秒的精确度将要求目标计算机在其时间源之间具有优于0.1毫秒的网络延迟,而50毫秒的精确度需要5毫秒或更小的网络延迟。时间源的层次级别和从时间源到目标计算机的网络跳数也是影响因素。
如果在NTP pool中使用某些本地NTP服务器,可能会得到不同的结果。试试离家近的;例如1.us.pool.ntp.org。用于美国境内服务器的2.us.pool.ntp.org等。
https://stackoverflow.com/questions/67233945
复制相似问题