首页 > 解决方案 > 为什么 NTP 的 root_delay 与我测量的往返时间如此不同?

问题描述

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

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()

now - start我通常会得到大约 40 毫秒的往返时间。

然而,随着

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://www.rfc-editor.org/rfc/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_delay0.00056 秒,这似乎不太可能是真的!(我不认为我对时间服务器有 0.5 毫秒的 ping,往返时间......这真的太小了)

root_delay问题: NTP协议中如何精确测量?

笔记:

标签: pythontimentp

解决方案


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

如果你想计算出你自己的 root_delay 和 root_dispersion,你必须自己做数学。

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


推荐阅读