43

维基百科条目没有提供详细信息,而且RFC太密集了。这里有没有人以非常笼统的方式知道 NTP 的工作原理?

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

4

4 回答 4

98

(这不是 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 的工作原理。

示例(在整秒内使数学变得容易):

  • 客户端在“错误”时间 100 发送请求。A=100。
  • 服务器在“真”时间 150 接收请求。X=150。
  • 服务器很慢,所以它直到“真”时间 160 才发出响应。Y=160。
  • 客户端在“错误”时间 120 收到请求。B=120。
  • 客户端确定在网络上花费的时间是 BA-(YX)=120-100-(160-150)=10 秒
  • 客户端假设从服务器到客户端的响应所花费的时间是 10/2=5 秒。
  • 客户端将该时间添加到服务器发送响应时的“真实”时间,以估计它在“真实”时间 165 秒收到响应。
  • 客户端现在知道它需要在时钟上增加 45 秒。

在适当的实现中,客户端始终作为守护进程运行。在长时间的大量样本中,NTP 实际上可以确定计算机的时钟是慢还是快,并自动进行相应的调整,即使后来断开网络连接,它也能保持相当好的时间。加上对来自服务器的响应进行平均,并应用更复杂的思维,您可以获得非常准确的时间。

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

于 2009-08-05T02:02:51.340 回答
7
  1. NTP 客户端询问它的所有 NTP 服务器现在是什么时间。
  2. 不同的服务器将给出不同的答案,具有不同的置信度,因为请求从客户端到服务器并返回所需的时间不同。
  3. Marzullo 的算法将找到与所提供的所有答案一致的最小时间值范围。
  4. 您可以比任何单个时间服务器的答案的准确性更有信心,因为多个集合的交集可能包含比任何单个集合更少的元素。
  5. 您查询的服务器越多,您对可能答案的限制就越多,您的时钟就越准确。
于 2009-08-05T01:20:25.247 回答
0

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

于 2009-08-05T02:44:14.400 回答
-2

诀窍是一些数据包很快,而快速数据包会给你时间上的严格限制。

于 2009-08-04T17:55:03.220 回答