为什么NTP的root_delay与我测量的往返次数如此不同?

时间:2018-06-04 21:00:48

标签: python time ntp

获取网络时间协议数据包(NTP版本4,请参阅here):

from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import struct, time

start = time.time()
with closing(socket(AF_INET, SOCK_DGRAM)) as s:
    s.sendto('\x23' + 47 * '\0', ('pool.ntp.org', 123))       # NTP v4, see RFC 5905
    msg, address = s.recvfrom(1024)
now = time.time()

我通常会在40毫秒左右获得往返时间now - start

然而,

format = "!4b4h9I"
unpacked = struct.unpack(format, msg[0:struct.calcsize(format)]) 
livnmode, stratum, poll, precision = unpacked[0:4]
print 'root_delay',  unpacked[4] + float(unpacked[5]) / 2**16                             # https://tools.ietf.org/html/rfc5905#page-13
print 'root_dispersion', unpacked[6] + float(unpacked[7]) / 2**16
print 'ref_id', unpacked[8]
print 'ref_timestamp  %.3f' % (unpacked[9] + float(unpacked[10]) / 2**32 - 2208988800L)
print 'orig_timestamp %.3f' % (unpacked[11] + float(unpacked[12]) / 2**32)
print 'recv_timestamp %.3f' % (unpacked[13] + float(unpacked[14]) / 2**32 - 2208988800L)
print 'tx_timestamp %.3f' % (unpacked[15] + float(unpacked[16]) / 2**32 - 2208988800L 

我得到root_delay 0.00056秒,这似乎不太可能是真的! (我不认为我有一个0.5毫秒的ping时间服务器,往返时间......这真的太小了)

问题:在NTP协议中如何衡量root_delay

注意:

  • RFC 5905州:

    Root Delay (rootdelay): Total round-trip delay to the reference
    clock, in NTP short format.
    
  • 我重新启动脚本越多,似乎root_delay减少了(即使我的本地计算机RTC时间没有被我的Python脚本更新......所以' s奇怪...)

  • 我对root_delay的解析似乎是正确的,请参阅https://tools.ietf.org/html/rfc5905#page-19

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |LI | VN  |Mode |    Stratum     |     Poll      |  Precision   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         Root Delay                            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                         Root Dispersion                       |
    ...
    

    https://tools.ietf.org/html/rfc5905#page-13

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          Seconds              |           Fraction            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
                         NTP Short Format
    
  • 我没有使用ntplib似乎有不同的root_delay解析(但不符合https://tools.ietf.org/html/rfc5905#page-13?)

1 个答案:

答案 0 :(得分:0)

您只是在查询远程“服务器”作为“客户端”,它发送的root_delay和root_dispersion是服务器相对于Stratum-0源的值。

如果要计算自己的root_delay和root_dispersion,必须自己计算。

您可以使用时间戳数据计算出数据包的往返行程,将服务器发送的值添加为root_delay,现在您拥有了root_delay。