所有各种时间戳的知识对于理解如何更改我的计算机时间以与NTP时间服务器一致并没有太大帮助。
经过几天的摆弄,我相信我找到了解决方案。答案是:不要使用任何时间戳——而是只使用偏移量!并且 ntplib 已经为您计算了偏移量。
这令人惊讶,因为大多数人使用其中一个时间戳(主要是 xmt),而且,我可能错过了它,但我从未见过有人使用偏移量。
让我们看一个例子。我使用了 3 个 NTP 服务器:一个在亚洲(最远),一个在欧洲(中等距离),一个在德国(最近)。数据包的往返时间变化很大,从几毫秒到 200 毫秒不等,与近距离或远距离目标无关。我选择了一个例子来证明我的观点(最后的代码)。我从时间戳中减去了原点,所以所有时间都相对于它们各自的原点。
NTP Server Type t-stamp sec
asia.pool.ntp.org orig 0.000
asia.pool.ntp.org recv 0.004
asia.pool.ntp.org tx 0.004
asia.pool.ntp.org dest 0.014
asia.pool.ntp.org offset -0.003
europe.pool.ntp.org orig 0.000
europe.pool.ntp.org recv 0.008
europe.pool.ntp.org tx 0.008
europe.pool.ntp.org dest 0.020
europe.pool.ntp.org offset -0.002
de.pool.ntp.org orig 0.000
de.pool.ntp.org recv 0.008
de.pool.ntp.org tx 0.008
de.pool.ntp.org dest 0.019
de.pool.ntp.org offset -0.002
在亚洲示例中,往返总时间为 14 毫秒。发送时钟差为 4ms,接收时钟差为 10ms。因此偏移量为 (4 - 10)/2 = -3ms。
现在要做的所有重要假设是往返的旅行时间是相同的!那么我可以说,如果我把这个偏移量加到我的计算机时间上,两个时间都会变成一样的!
同样适用于欧洲:往返 20 毫秒,偏移:(8 - 12)/2 = -2 毫秒,德国:往返 19 毫秒,偏移:(8 - 11)/2 = -1.5 毫秒。
由于 lib 已经给出了偏移量,所以您只需将这个带符号的偏移量添加(!,而不是减去)您的计算机时间。
然后我在使用德国(最近的)NTP 服务器大约半小时时记录了 ntplib-offsets:
'Ambient' 是 ntplib 报告的偏移量,单位为 ms。
看起来我的电脑设置得很好,它的时间大多在 NTP 时间的 5 毫秒内。但是有一些显着的偏移高达 70 毫秒!在一个程序中,我本可以选择这个——显然是错误的——时间。
显而易见的问题:如何确保在时钟调整中不会出现异常值?
代码的基本部分:
for i, ntpserver in enumerate(NTP_SERVERS):
ntps = []
client = ntplib.NTPClient()
try:
response = client.request(ntpserver, version=4, timeout=0.5) # latest NTP version = 4
orig = response.orig_time
recv = response.recv_time
tx = response.tx_time
dest = response.dest_time
offs = response.offset
ntps.append( ["orig" , orig - orig])
ntps.append( ["recv" , recv - orig])
ntps.append( ["tx " , tx - orig])
ntps.append( ["dest" , dest - orig])
ntps.append( ["offset" , offs])
for a in ntps:
print("{:20s} {:15s} {:10.3f} ".format(ntpserver, a[0], a[1]))
except Exception as e:
msg = fncname + "FAILED with Exception: {}".format(e)
edprint(msg)