【问题标题】:How Does the Network Time Protocol Work?网络时间协议如何工作?
【发布时间】:2009-08-04 15:13:23
【问题描述】:

Wikipedia entry 没有提供细节,RFC 太密集了。这里有没有人大致了解 NTP 的工作原理?

我正在寻找解释如何使用Marzullo's algorithm(或其修改)将服务器上的时间戳转换为客户端上的时间戳的概述。具体来说,当通信发生在具有高度可变延迟(通常是该延迟的几倍)的网络上时,使用什么机制来产生平均在 10 毫秒内的准确度。

【问题讨论】:

    标签: time synchronization ntp


    【解决方案1】:

    (这不是 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 实际上可以确定计算机的时钟是慢还是快,并自动进行相应的调整,即使后来断开网络连接,它也能保持相当好的时间。加上对来自服务器的响应进行平均,并应用更复杂的思维,您可以获得非常准确的时间。

    当然,正确的实现远不止这些,但这就是它的要点。

    【讨论】:

    • 谢谢,这正是我正在寻找的那种解释。所做的假设和一些限制有点令人惊讶。例如,服务器对“Y”提供可靠保证有多容易?另外,我想知道实践中网络时间的对称性如何?似乎您可以在某种程度上使用 Marzullo 算法来减少由这两种不确定性引起的错误。
    • 更详细地了解服务器如何获取时间“X”和“Y”会很有趣 - 即是否需要操作系统的帮助才能确定接收数据包的确切时间/将被传输,或者...?
    • 这是一个伟大而优雅的解释。但是有一个问题:假设网络速度对称真的公平吗?许多 ISP 为客户提供比下载更慢的上传带宽。如果系统中存在类似的其他不对称性,那么假设网络中的不对称延迟并不是太牵强。这甚至是一个可以解决的问题吗?如果只有一台服务器在使用,我猜不会。
    • 我能想到的另一个具有(我强烈假设)非对称延迟的环境是低功耗移动设备,其中移动设备的无线电远远超过其基础设施。虽然这些字节可能很容易让它下降,但糟糕的移动无线电可能更难将它们恢复到互联网上。假设真正的 NTP 算法无法对此进行调整,考虑到上行和下行延迟之间的绝对差异,是否存在已知的误差上限?
    • 关于不同的上行/下行速度,这是衡量带宽而不是延迟的重要指标。实际上,假设有两条水管在您和您的 ISP 之间输送水,一条用于上行链路(您发送水)和下行链路(接收水)。它们以相同的速度送水,但一根管子更胖,一次输送的水量更大。带宽与延迟。然而,延迟可能非常不对称:在世界偏远或未开发的地区,使用卫星进行下行链路并使用 56k 调制解调器进行上行链路的情况并不少见。
    【解决方案2】:
    1. NTP 客户端询问其所有 NTP 服务器几点了。
    2. 不同的服务器会给出 不同的答案,具有不同的置信水平,因为 请求将采取不同的金额 从客户到 服务器并返回。
    3. Marzullo 的算法将找到最小的 时间值范围与 提供的所有答案。
    4. 与任何单个时间服务器的结果相比,您可以更加确信此算法的答案的准确性,因为多个集合的交集所包含的元素可能比任何单个集合都少。
    5. 您查询的服务器越多,您对可能答案的限制就越多,您的时钟就越准确。

    【讨论】:

      【解决方案3】:

      如果您使用时间戳来决定排序,则可能不需要具体时间。您可以改用lamport clocks,这比网络同步更痛苦。它可以告诉你什么是“先”来的,但不能告诉你确切的时间差异。它并不关心计算机的时钟实际上在说什么。

      【讨论】:

      • 我看过灯钟(和矢量钟),它们看起来很有趣。不幸的是,我必须计算增量,而不仅仅是建立排序。
      【解决方案4】:

      诀窍在于某些数据包速度很快,而快速数据包会给您时间上的严格限制。

      【讨论】:

      • 关于为什么它在实践中有效的重要见解。这将是一个很好的评论。
      猜你喜欢
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2013-12-14
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多