代码之家  ›  专栏  ›  技术社区  ›  Waylon Flinn

网络时间协议如何工作?

  •  37
  • Waylon Flinn  · 技术社区  · 15 年前

    这个 Wikipedia entry 不提供细节和 RFC 太密集了。这里有人知道NTP是如何工作的吗?

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

    4 回复  |  直到 15 年前
        1
  •  83
  •   David    15 年前

    (这不是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
  •  6
  •   nont    15 年前
    1. NTP客户端请求其所有NTP 服务器的时间。
    2. 不同的服务器会 不同的答案,不同的信心水平,因为 请求将采用不同的金额 从客户到 服务器和背面。
    3. Marzullo的算法会找到最小的 时间值范围与 提供的所有答案。
    4. 与任何单个时间服务器相比,您可以更确信此算法的答案的准确性,因为多个集合的交集可能包含的元素比任何单个集合都少。
    5. 查询的服务器越多,对可能的答案的约束就越多,您的时钟就越精确。
        3
  •  0
  •   Ape-inago    15 年前

    如果使用时间戳来决定排序,则可能不需要特定的时间。你可以使用 lamport clocks 相反,与网络同步相比,这不是一件痛苦的事情。它可以告诉你什么是“第一”,但不是确切的时间差异。它不在乎计算机的时钟到底是怎么说的。

        4
  •  -1
  •   starblue    15 年前

    诀窍是有些数据包速度很快,而这些快速的数据包给您时间上的严格限制。