维基百科条目没有提供详细信息,而且RFC太密集了。这里有没有人以非常笼统的方式知道 NTP 的工作原理?
我正在寻找一个概述,解释如何使用Marzullo 的算法(或其修改)将服务器上的时间戳转换为客户端上的时间戳。具体来说,当通信发生在具有高度可变延迟的网络上(通常是该延迟的几倍)时,使用什么机制来产生平均在 10 毫秒内的准确性。
维基百科条目没有提供详细信息,而且RFC太密集了。这里有没有人以非常笼统的方式知道 NTP 的工作原理?
我正在寻找一个概述,解释如何使用Marzullo 的算法(或其修改)将服务器上的时间戳转换为客户端上的时间戳。具体来说,当通信发生在具有高度可变延迟的网络上(通常是该延迟的几倍)时,使用什么机制来产生平均在 10 毫秒内的准确性。
(这不是 Marzullo 的算法。它只被高层服务器使用,通过多个来源获得真正准确的时间。这是普通客户端获取时间的方式,只使用一个服务器)
首先,NTP 时间戳存储为自 1900 年 1 月 1 日以来的秒数。32 位表示秒数,32 位表示秒的小数部分。
同步很棘手。客户端在发送请求时存储时间戳(比如 A)(所有这些值都以秒为单位)。服务器发送一个回复,其中包含接收数据包时的“真实”时间(称为 X)和传输数据包的“真实”时间(Y)。客户端将接收该数据包并记录它收到它的时间(B)。
NTP 假设发送和接收在网络上花费的时间是相同的。在健全的网络上经过足够多的时间间隔,它应该是平均的。我们知道从发送请求到接收响应的总传输时间是 BA 秒。我们想去掉服务器处理请求所花费的时间(YX),只留下网络遍历时间,所以就是BA-(YX)。由于我们假设网络遍历时间是对称的,因此从服务器到客户端的响应所花费的时间为 [BA-(YX)]/2。所以我们知道服务器在 Y 时间发送了它的响应,我们用了 [BA-(YX)]/2 秒的时间才收到响应。
所以我们收到响应的真实时间是 Y+[BA-(YX)]/2 秒。这就是 NTP 的工作原理。
示例(在整秒内使数学变得容易):
在适当的实现中,客户端始终作为守护进程运行。在长时间的大量样本中,NTP 实际上可以确定计算机的时钟是慢还是快,并自动进行相应的调整,即使后来断开网络连接,它也能保持相当好的时间。加上对来自服务器的响应进行平均,并应用更复杂的思维,您可以获得非常准确的时间。
当然,正确的实现远不止这些,但这就是它的要点。
如果您使用时间戳来决定排序,则可能不需要特定时间。您可以改用灯时钟,这比网络同步更痛苦。它可以告诉你什么是“先”来的,但不能告诉你确切的时间差异。它并不关心计算机的时钟实际上在说什么。
诀窍是一些数据包很快,而快速数据包会给你时间上的严格限制。