我使用Python3和ntplib https://pypi.org/project/ntplib/来查询NTP时间服务器。工作正常,但我不知道提供的时间变量中的哪一个可以正确地设置我的计算机上的时钟。
在第23 for页上阅读IETF的NTP https://www.rfc-editor.org/rfc/rfc5905文档,我选择了以下两种方法之一:
传输时间戳(xmt):当响应留给客户端时,在服务器上的时间,格式为NTP时间戳。目的时间戳(dst):当来自服务器的回复以NTP时间戳格式到达客户端时的时间。
我的解释是,xmt是服务器发送它的正确时间,这似乎意味着我仍然需要添加从服务器到我的计算机的传输时间的时间延迟?
我不清楚dst时间的定义。这可能意味着:
的合适时间。
是哪一个?
我认为#1 (使用dst)更有意义,但是大多数在网络上找到的脚本都使用普通的xmt。就ntplib的代码而言,这意味着:
client = ntplib.NTPClient()
resp = client.request(server, version=3)
xmt = resp.tx_time # for the use of xmt
# or:
dst = resp.dest_time # for the use of dst在一些测试运行中,dst总是比xmt晚3. 30 ms,对于本地、区域或全局NTP服务器的使用没有明显的模式。
所以这并不多,但我不想做出不合逻辑的选择。
发布于 2021-01-21 11:30:19
所有各种时间戳的知识对于理解如何改变我的计算机的时间以与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 ms。发送时差为4ms,接收时差为10 4ms。因此,偏移量为(4-10)/2= -3ms。
现在要做的最重要的假设是往返的旅行时间是一样的!那么我可以说,如果我把这个偏移量加到我的电脑时间里,两次都会变成一样的!
欧洲同样的作品:往返20 2ms,偏移:(8-12)/2= -2ms,德国:往返19 2ms,偏移:(8-11)/2= -1.5ms。
由于偏移量已经由库提供,所以您所做的就是将这个签名的偏移量添加(!,而不是减去)到计算机的时间。
在使用德国(最近的) NTP服务器时,我记录了大约半小时的ntplib偏移量:

“‘Ambient”是ntplib以ms表示的偏移量。
看上去我的电脑安装得很好,它的时间大多在NTP时间的5ms之内。但也有一些重要的远足高达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)https://stackoverflow.com/questions/65549802
复制相似问题