网络时间协议是如何工作的?

43

维基百科上的介绍不太详细,而RFC则过于复杂。这里有没有人能够以一种非常通俗易懂的方式,大体上解释一下NTP是如何工作的呢?

我在寻找一份概述,其中解释了如何使用马祖洛算法(或其修改版)将服务器上的时间戳转换为客户端上的时间戳。具体来说,在网络延迟高度不稳定且经常是延迟的数倍的情况下,用什么机制产生平均精度在10ms以内的准确性。

4个回答

99

这不是Marzullo的算法。高阶层服务器利用多个时间源获取高精度时间,而普通客户端使用单个服务器来获取时间。

NTP时间戳以自1900年1月1日起的秒数存储。32位用于表示秒数,另外32位用于表示秒的小数部分。

同步很棘手。客户端在发送请求时记录时间戳A(所有这些值都以秒为单位)。服务器会回复包含其接收到数据包的“真实”时间(称之为X)以及将要传输数据包的“真实”时间(Y)。客户端将接收到的时间记录下来(B)。

NTP假设在网络上所花费的时间对于发送和接收来说是相同的。在充足的时间间隔内,对于正常的网络来说,平均值应该相同。我们知道从发送请求到接收响应总共需要B-A秒。我们想要去除服务器处理请求所用的时间(Y-X),只剩下网络遍历时间,所以是B-A-(Y-X)。由于我们假设网络遍历时间是对称的,因此响应从服务器传输到客户端所需的时间是[B-A-(Y-X)]/2。因此我们知道服务器在时间Y发送了其响应,而它花费了[B-A-(Y-X)]/2秒钟才能让该响应到达我们。

因此,我们接收响应的真实时间是Y+[B-A-(Y-X)]/2秒。这就是NTP的工作原理。

举个例子(为了简便计算,以完整秒表示):

  • 客户端在“错误”的时间100发送请求。A=100。
  • 服务器在“真实”的时间150接收请求。X=150。
  • 服务器很慢,直到“真实”的时间160才发送响应。Y=160。
  • 客户端在“错误”的时间120接收到请求。B=120。
  • 客户端计算在网络上花费的时间是B-A-(Y-X)=120-100-(160-150)=10秒钟。
  • 客户端假设响应从服务器到客户端所需的时间为10/2=5秒钟。
  • 客户端将这段时间加到服务器发送响应的“真实”时间上,估计它在165秒的“真实”时间接收到了响应。
  • 客户端现在知道需要向自己的时钟添加45秒钟。
  • 在适当的实现中,客户端作为守护程序始终运行。经过长时间的多个样本测试,NTP实际上可以确定计算机时钟是慢还是快,并相应地自动调整它,即使它之后断开网络连接,它也能保持相当准确的时间。通过对来自服务器响应进行平均值处理和更复杂的思考,你可以得到非常精确的时间。

    当然,一个合适的实现还有更多内容,但这就是要点。


    2
    谢谢,这正是我寻找的那种解释。所做出的一些假设和某些限制有点令人惊讶。例如,服务器如何轻易地提供关于“Y”的可靠保证?此外,我想知道实际上网络时间有多对称?看起来你可能能够使用马祖洛算法在某种程度上减少这两种不确定性所造成的误差。 - Waylon Flinn
    了解服务器如何获取时间“X”和“Y”的更多详细信息会很有趣 - 即它是否需要操作系统的帮助来确定数据包接收/传输的确切时间,还是...? - Matti Virkkunen
    这是一篇出色且优雅的解释。不过有个问题:假设网络速度对称真的公平吗?许多ISP给客户的上传带宽比下载慢。如果系统中存在其他不对称性,那么假设网络延迟不对称也不是太牵强了。这是一个可解决的问题吗?如果只使用一个服务器,我猜测是不可能解决的。 - Edward Falk
    我能想到的另一个环境(我强烈认为)具有不对称延迟的是低功耗移动设备,其中移动设备的无线电远远优于其基础设施。虽然字节可能很容易地传输下来,但可怜的移动无线电可能会在将它们发送回互联网时遇到更大的困难。假设真正的NTP算法不能调整此问题,那么是否存在已知的误差上限,考虑到上行和下行延迟之间的绝对差异? - PythonNut
    关于上下行速度的差异,这是带宽而不是延迟的度量。实际上,可以想象两根水管在你和ISP之间发送水,一根用于上行(你发送水)和一根用于下行(接收水)。它们以相同的速度发送水,但一根管子更粗,一次移动更大的水量。带宽与延迟。然而,延迟可能极不对称:在世界上偏远或欠发达地区,使用卫星进行下行传输并使用56k调制解调器进行上行传输并不罕见。 - A.B. Carroll

    7
    1. NTP客户端会询问所有NTP服务器现在是几点钟。
    2. 不同的服务器会给出不同的答案,且置信度也不同,因为请求从客户端到服务器再返回所需的时间各不相同。
    3. 马祖洛算法将找到与所有提供的答案一致的最小时间范围。
    4. 通过此算法得出的答案比单个时间服务器得出的答案更准确,因为多个集合的交集可能包含的元素比任何单个集合少。
    5. 查询的服务器越多,对可能答案的限制就越多,您的时钟就越准确。

    0

    如果您使用时间戳来确定顺序,具体时间可能并不必要。相反,您可以使用 Lamport 时钟,它比网络同步更容易处理。它可以告诉您哪个事件“先发生”,但无法告诉您确切的时间差异。它不关心计算机时钟实际上显示的时间。


    我已经研究了Lamport时钟(和向量时钟),它们看起来很有趣。不幸的是,我必须计算增量而不仅仅是建立排序。 - Waylon Flinn

    -2
    诀窍在于有些数据包很快,而这些快速的数据包会给你时间上的严格限制。

    2
    重要的见解是为什么它在实践中有效。这将成为一个很好的评论。 - Waylon Flinn

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接