【发布时间】:2009-08-04 15:13:23
【问题描述】:
Wikipedia entry 没有提供细节,RFC 太密集了。这里有没有人大致了解 NTP 的工作原理?
我正在寻找解释如何使用Marzullo's algorithm(或其修改)将服务器上的时间戳转换为客户端上的时间戳的概述。具体来说,当通信发生在具有高度可变延迟(通常是该延迟的几倍)的网络上时,使用什么机制来产生平均在 10 毫秒内的准确度。
【问题讨论】:
标签: time synchronization ntp
Wikipedia entry 没有提供细节,RFC 太密集了。这里有没有人大致了解 NTP 的工作原理?
我正在寻找解释如何使用Marzullo's algorithm(或其修改)将服务器上的时间戳转换为客户端上的时间戳的概述。具体来说,当通信发生在具有高度可变延迟(通常是该延迟的几倍)的网络上时,使用什么机制来产生平均在 10 毫秒内的准确度。
【问题讨论】:
标签: time synchronization ntp
(这不是 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 的工作原理。
示例(在整秒内使数学变得简单):
在正确的实现中,客户端始终作为守护进程运行。在长时间的大量样本中,NTP 实际上可以确定计算机的时钟是慢还是快,并自动进行相应的调整,即使后来断开网络连接,它也能保持相当好的时间。加上对来自服务器的响应进行平均,并应用更复杂的思维,您可以获得非常准确的时间。
当然,正确的实现远不止这些,但这就是它的要点。
【讨论】:
【讨论】:
如果您使用时间戳来决定排序,则可能不需要具体时间。您可以改用lamport clocks,这比网络同步更痛苦。它可以告诉你什么是“先”来的,但不能告诉你确切的时间差异。它并不关心计算机的时钟实际上在说什么。
【讨论】:
诀窍在于某些数据包速度很快,而快速数据包会给您时间上的严格限制。
【讨论】: