python - 为什么 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_delay
0.00056 秒,这似乎不太可能是真的!(我不认为我对时间服务器有 0.5 毫秒的 ping,往返时间......这真的太小了)
root_delay
问题: NTP协议中如何精确测量?
笔记:
RFC 5905规定:
Root Delay (rootdelay): Total round-trip delay to the reference clock, in NTP short format.
我重新启动脚本的次数越多,似乎
root_delay
减少了(即使我的本地计算机 RTC 时间没有被我的 Python 脚本更新......所以这很奇怪......)我的解析
root_delay
似乎是正确的,请参阅https://www.rfc-editor.org/rfc/rfc5905#page-19:+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |LI | VN |Mode | Stratum | Poll | Precision | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Delay | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Dispersion | ...
和https://www.rfc-editor.org/rfc/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
which 似乎有不同的root_delay
解析(但不符合https://www.rfc-editor.org/rfc/rfc5905#page-13?)
解决方案
您只是将远程“服务器”作为“客户端”查询,它发送的 root_delay 和 root_dispersion 是服务器相对于 Stratum-0 源的值。
如果你想计算出你自己的 root_delay 和 root_dispersion,你必须自己做数学。
您可以使用时间戳数据来计算数据包的往返行程,将服务器发送的值添加为其 root_delay,现在您就有了自己的 root_delay。
推荐阅读
- swift - 如何在不破坏“菜单”按钮默认行为的情况下在 tvOS 游戏中设置主菜单
- c++ - Fuse 文件系统查找 /.Trash、/autorun.inf 和 /.xdg-volume-info 文件
- java - 使用 Java 中的接口作为与更多团队一起处理代码的一种手段
- solr - 数组字段特定索引处的 Solr 过滤器值
- printing - 在 IP 打印机中使用骆驼打印机打印
- php - 从模型中获取数据时为 foreach 提供的参数无效
- html - 在 about:blank 中更改背景颜色
- javascript - Emberjs 监视从父组件传递的变量更改?
- php - 通过使用 php 和 javascript 选择一个选项来更新数据库表
- android - 如何用文本框中的值替换文档路径?