如何使用多个服务器进行完整的 NTP 调用?

How to make a complete NTP call using several servers?

我需要独立检查当前时间(顺便说一句,与系统提供的时间进行交叉检查),我想为此使用 NTP 协议。

有一个 NTP 模块 (ntplib) 允许查询 一个 NTP 服务器:

>>> import ntplib
>>> import time
>>> time.ctime(ntplib.NTPClient().request('europe.pool.ntp.org', version=3).tx_time)
'Wed Nov 18 17:17:16 2015'

我想使用 NTP 功能组合来自多个 NTP 服务器的响应以获得 optimum response:

[the NTP protocol] uses a modified version of Marzullo's algorithm to select accurate time servers and is designed to mitigate the effects of variable network latency.

Python(最好是 3.x)利用它的正确方法是什么?

What would be the right way in Python (ideally 3.x) to leverage that?

基本上,您必须在 Python 中实施 Marzullo 的算法。

一旦你查询了两台服务器,你将如何确定哪个时钟更接近原子钟?

确定 "optimum response"(a.k.a。最准确的时间来源)是一项棘手的工作。

您正在寻找的是 NTP implementation,除非您想在 python.

中自己动手

wiki 页面上讨论的 NTP 协议正在谈论 NTP Reference Implementation。这包括在所有服务器上运行的 ntp 守护程序 运行ning。 ntp 守护进程跟踪远程参考服务器,哪些是活动的,并且是最准确的。 Ntp 守护进程然后调整或步进您的时钟以匹配远程时钟。

也许最简单的方法 是 运行 在您的服务器上以客户端模式运行一个 ntp 守护进程(即使用参考实现) .在您的 ntp.conf 中,列出您试图用来从中查找 "optimum response" 的所有时间服务器。当你有 ntpd 运行ning 时,守护进程将为你确定最低层、最准确和可用的参考服务器。

您只需ntpq -p,时间最准确的远程服务器将是旁边有星号的服务器。

这是一些示例输出:

    remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 LOCAL(0)        .LOCL.          10 l  96h   64    0    0.000    0.000   0.000
*ns2.example.com 10.193.2.20      2 u  936 1024  377   31.234    3.353   3.096