首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该使用NTP时间服务器的什么时间来设置我的时钟?

应该使用NTP时间服务器的什么时间来设置我的时钟?
EN

Stack Overflow用户
提问于 2021-01-03 12:23:26
回答 1查看 1.7K关注 0票数 0

我使用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. ,它是传输时间已经增加的xmt时间,也是设置时钟
  2. 的合适时间,或者是NTP数据包到达时时钟的时间。如果我的时钟错了,现在不是使用

的合适时间。

是哪一个?

我认为#1 (使用dst)更有意义,但是大多数在网络上找到的脚本都使用普通的xmt。就ntplib的代码而言,这意味着:

代码语言:javascript
复制
    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服务器的使用没有明显的模式。

所以这并不多,但我不想做出不合逻辑的选择。

EN

回答 1

Stack Overflow用户

发布于 2021-01-21 11:30:19

所有各种时间戳的知识对于理解如何改变我的计算机的时间以与NTP时间服务器保持一致并不是很有帮助的。

经过几天的摆弄,我相信我找到了解决办法。答案是:不要使用任何时间戳,而只使用偏移量!偏移量已经由ntplib计算出来了。

这是令人惊讶的,因为大多数人使用的时间戳(主要是xmt),而且,我可能已经错过了,但我从来没有看到任何人使用该偏移量。

让我们看一个例子。我使用了3台NTP服务器:一台在亚洲(最偏远),一台在欧洲(中程),一台在德国(最近)。数据包的往返时间变化很大,从几毫秒到200毫秒不等,与近距离或远距离目标无关。我选择了一个例子来说明我的观点(最后是代码)。我从时间戳中减去了原点,所以所有时间都是相对于它们各自的原点的。

代码语言:javascript
复制
    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毫秒!在一个程序中,我可以选择这个-显然是错误的-时间。

显而易见的问题:我如何确保在我的时钟调整中不出现异常值?

守则的基本部分:

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65549802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档