获取网络时间协议数据包(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?)
答案 0 :(得分:0)
您只是在查询远程“服务器”作为“客户端”,它发送的root_delay和root_dispersion是服务器相对于Stratum-0源的值。
如果要计算自己的root_delay和root_dispersion,必须自己计算。
您可以使用时间戳数据计算出数据包的往返行程,将服务器发送的值添加为root_delay,现在您拥有了root_delay。