网络时间协议(NTP)是一个用于在互联网上同步主机和客户端时钟的系统。NTP是一种协议,旨在将参与网络的所有计算机同步到协调世界时(UTC)的毫秒内。protocolis NTP时钟规则算法的核心,该算法调整本地计算机的时钟时间和滴答频率,以响应外部源,如另一个受信任的NTP服务器、无线电或卫星接收器或电话调制解调器。NTP中的一个核心问题是建立NTP网络中节点的信任和准确性。这是通过选择和过滤算法的组合来实现的,可以从同步网络中最可靠、最准确的对等节点中进行选择。
可以说,网络时间协议(NTP)是互联网上运行时间最长、连续运行的分布式应用程序,其根源可以追溯到1979年。该协议的第一份文件于1981年作为InternetEngineering Note series 173 IEN-173提供。从那时起,它已经演变成网络时间协议版本4,记录在RFC5905中,并移植到今天可用的Almostery客户端和服务器平台。NTP在世界各地运行着数以百万计的服务器和客户端,以在整个互联网上保持设备的准确时间。
NTP使用分层网络架构,形成树状结构。这个层次结构的每一层都被称为一个层,并被分配一个从零开始的数字,代表参考硬件时钟。一级服务器与零级服务器同步,并且这种关系将继续,以便同步到地层\(n\)服务器的服务器在地层\(n+1\)上运行。因此,地层编号表示与精确参考时钟的距离。一般来说,服务器中节点的状态是质量和可靠性的标志,但情况并非总是如此;通常会发现三层时间源的质量高于其他两层时间源。
维基百科对不同阶层有一套很好的定义,我在这里提供了一个稍加修改的定义:
这些是高精度的计时设备,如原子钟、GPS或其他无线电时钟。它们产生一个非常精确的时间信号,直接连接到连接的计算机。Stratum0设备也称为参考时钟。NTP服务器不能将自己作为层0进行广告。
这些是直接连接到stratum0设备的计算机。他们的系统时间被同步到连接设备的几微秒之内。stratum1服务器可以与其他stratum1服务器对等,以进行健全性检查和备份。它们也被称为主要的时间服务器。
这些是通过网络与Stratum 1服务器同步的计算机。通常情况下,第二层计算机查询多个stratum1服务器,并从中选择最准确的时间表示。第二层计算机还可以与其他第二层计算机进行对等,以便为对等组中的所有设备提供更稳定、更健壮的时间。
这些是与第2层服务器同步的计算机。他们使用与第二层相同的对等和数据采样算法,并且可以自己充当第四层计算机的服务器,等等。
这种等级制度一直延续到第15层。下图显示了NTP系统的等级性质。层次结构顶端的参考时钟是精确的时间段,第1层是直接连接到这些时间段的计算机。从那里开始,不断增加的层数表明每台计算机从哪里同步时间数据。
在NTP网络中,客户端每隔一段时间轮询一个或多个服务器,以检索更新的时间戳信息。
要使NTP系统尽可能准确可靠,首先需要主机系统上有一个准确可靠的本地时钟。在大多数情况下,本地时钟被假定为石英晶体时钟,这是手表和计算机中使用的典型数字时钟。当向晶体施加电压时,会使其改变形状;当电压被移除时,晶体会恢复到原来的形状(在这个过程中产生少量的电压)。这种形状的变化和恢复以稳定的频率发生,可在制造过程中进行调整。一旦凝固,晶体可以长时间保持频率。
本地计算机系统使用晶体的振荡频率来增加计算机的逻辑时钟。由于晶体以预先定义的速率振荡,计算机系统可以使用这个速率作为时间模型。石英足够精确,每天可以将时间保持在几毫秒以内。然而,随着时间的推移,这些每天只有几百万秒的缺陷可能会累积,使时钟不准确。输入NTP。NTP使用更精确的时间服务器接收到的更正,定期调整这些不准确度。对于要求最高可靠性的主机,计算机连接到本地硬件时钟,如原子钟,并直接从该连接的时钟接收时间信息。
锁相环或PLL是任何产生输出信号的控制系统,其相位与输入信号的相位有关。PLL最简单的版本是一个电子电路,由一个变频振荡器和一个在连续反馈回路中工作的相位检测器组成。振荡器产生周期信号,相位检测器将该信号的相位与输入周期信号的相位进行比较,调整振荡器以保持相位匹配。
在图中,\(x_i\)表示来自可靠来源的参考时间戳,\(c_i\)表示本地时间戳。两个时间戳都在第\(i \)次更新中。这些时间戳\(x_i-c_i\)之间的差异是输入偏移量,它由时钟滤波器处理。过滤器记录最近的偏移量,并从设置中选择一个作为输出偏移量,以更改本地时钟。然后使用环路滤波器产生本地时钟振荡器所需的校正。如果需要校正,本地时钟将逐渐倾斜到正确的值,以便时钟显示平滑的时间指示,并使时间值单调增加。
PLL的另一种选择是FLL,它的工作原理相同,但调整频率而不是相位。有证据表明,当网络抖动是时钟漂移的主要因素时,PLL通常工作得更好,而当振荡器的自然漂移是时钟漂移的主要因素时,FLL工作得更好。NTP v4使用PLL和FLL的组合,并将这些因素组合成时钟本地调整。
NTP中PLL/FLL算法的完整详尽解释需要90页的文档,但总体思路可以相当简洁地总结。
NTP客户端从一个或多个连接的服务器接收时间数据,并使用该时间数据计算相位或频率校正,以应用于本地时钟。如果时间修正只是一个微小的变化,则逐渐进行修正(称为回转),以避免时钟跳变。如果本地时钟大量关闭,则可同时进行调整。
对本地时钟的调整称为时钟规程算法,其实现方式类似于简单的PLL反馈控制系统。下图来自presentation Network Time Protocol(NTP)General overview,显示了该过程的基本概述:
在这里,一个NTP客户端连接到三个NTP服务器,并从所有这些服务器接收Stimestamp数据。让多台服务器充当NTP对等机为系统提供了一些冗余和多样性。时钟过滤器从客户端接收的前八个时间样本中选择统计上最佳的时间偏移,选择和聚类算法通过从结果集中删除异常值来进一步缩小数据集。然后,合并算法计算时间资产的加权平均值。
第一个过程的输出作为PLL/FLL环路的输入。环路本身根据经过过滤和平均的NTP服务器集提供的输入,不断调整本地时钟相位和频率。
在典型操作期间,NTP客户端定期轮询一个或多个NTP服务器以接收更新的时间数据。在收到新数据后,客户机计算来自服务器的时间偏移和往返延迟,如下图所示。
时间偏移量\(\θ\),即两个时钟之间的绝对时间差,在数学上定义为
更直观地说,偏移量计算是两个时钟之间的绝对时间差,即数据包在客户端和服务器之间传输所需的时间。
NTP的核心是使用过滤和选择算法来提高\(\theta\)和\(\delta\)值的准确性的算法。这些算法的复杂性取决于对等点之间路径的统计特性和所需的精度。例如,如果两个节点位于同一个千兆局域网上,对等节点之间发送的消息之间的路径延迟通常在所需的时钟精度之内或之下。在这样的情况下,接收过程传递的原始偏移量可用于直接调整本地时钟。在其他情况下,两个节点可能广泛分布在互联网上,延迟可能远远大于可接受的范围。
有许多算法可以过滤时间偏移数据,以去除大致分为两大类:大多数子类算法和聚类算法。多数子集算法试图通过比较均值和方差等统计数据,从不同时钟的总体中选择最佳时钟,从而将好的数据子集与坏的数据子集分开。另一方面,聚类算法的工作原理是,在给定一系列观测值的情况下,通过去除异常值来改进对时钟的总体偏移估计。
NTP时钟滤波算法的完整实现在NTP体系结构、协议和算法的描述中相当简洁。
在NTP中保持高可靠性的一个最重要因素可能是选择一个对等方。每当一个事件发生并计算出一个对等点的新偏移估计值时,就会使用对等点选择算法来确定应该选择哪个对等点作为时钟源。
在NTP网络中,有助于选择算法的一个关键设计假设是,准确的时钟相对较多,可以由靠近UTC的窄分布随机变量表示,而错误的时钟相对较少,可以由广泛分布在整个测量空间的随机变量表示。
因此,对等点选择过程从按阶层构建候选对等点列表开始。要被列入候选人名单,贵族必须通过某些健康检查。例如,一项检查要求对等方不能是主机本身。另一项检查要求对等方必须拥有至少半满的可达性寄存器,这避免了使用来自低质量关联或明显中断的实现的数据。如果没有候选人通过健全性检查,现有的时钟选择(如果有的话)将被取消,本地空闲时钟将以其固有频率运行。
然后,列表从末尾开始修剪,使其长度不超过当前设置为5的最大值。从一开始,列表在第一个条目处被截断,列表中不同地层的数量超过最大值,当前设置为两个。这一过程的目的是为那些接近候选名单头部的同龄人而设计,这些同龄人处于最底层,延迟最低,大概可以提供最准确的时间。
文中给出了NTP选择算法在NTP体系结构、协议和算法中的完整实现。
联合算法是其中最简单的一种:它通过对经过过滤和选择的剩余时钟进行平均来计算最终时钟偏移量,从而产生最终偏移量,用于使用PLL/FLL时钟控制系统调整时钟。
NTP时间戳记录相对于UTC的标准秒数。UTC于1972年1月1日开始测量时间。概念上的NTP时钟在同一时间点设置为2272060800.0,表示自1972年1月1日(UTC开始)和1900年1月1日(NTP时间概念开始)以来的标准秒数。
NTP时间戳编码为64位无符号数,其中前32位编码时间戳的整数部分,后32位编码小数部分。这种格式可以方便地进行多精度运算,并可根据需要轻松转换为其他时间格式。时间戳的32位精度提供了约232皮秒的精度,对于网络系统上的实际应用来说,这可能已经足够精度了。
NTP主机和客户端通过将本地时钟的当前值复制到时间戳变量来交换时间戳记录,以响应即将到来的NTP消息。NTP主机解析传入消息,设置消息的时间戳,并将其返回给客户端。
1 0 0 1 3 3 3 3 4 4 4 4 5 5 6 6 6 7 9 9 0 0 1 1 1 3 3 3 4 5 6 6 7 7 7 7 7 7 9 9 9 9 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 7 7 7 7 7 7 9 9 9 9 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1根延迟|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|根色散|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|引用ID |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| |+接收时间戳(64)+|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+。扩展字段1(变量).||+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|。扩展字段2(变量).| |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+密钥标识符|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| dgst(128)|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
LI(闰指示器):警告在当天结束时插入或删除即将到来的闰秒。
轮询:控制主机发送给对等方的NTP消息之间的间隔。发送主机始终使用其自己的轮询间隔和对等轮询间隔中的最小值。
根延迟/色散:分别表示主要参考源的估计往返延迟和估计色散。
参考ID、参考时间戳:识别参考时钟及其上次更新的时间,主要用于管理功能。
起源时间戳:上次收到的NTP消息的起源时间,在到达时从其传输时间戳字段复制。
在每台主机上运行的NTP状态机为上述每一个量维护状态变量,并记录主机及其对等机的IP地址和端口、记录传输NTP消息之间的间隔的计时器、记录是否可访问PEER的寄存器,以及测量电流的数据,以及与每次观测相关的估计测量延迟和偏移。
NTP还跟踪当前时钟源,该时钟源标识当前用于跟踪时间的时钟以及从主机上的逻辑时钟派生的本地时钟时间。
在正常的客户机-服务器操作中,服务器从对等方接收到此格式的消息,并且服务器在将消息发送回对等方之前使用更新的时间戳数据填充该消息。
每个NTP主机还为与之通信的每个对等机设置一个可达性移位寄存器。每次收到信息时,寄存器中的最低顺序位被设置为1,其余位置被移到左侧。如果寄存器不为零,也就是说,如果对等方在最近八次更新间隔中至少发送了一条消息,则认为该对等方是可访问的。无法联系到的同龄人可能会清除他们的状态信息。
NTP是一个由客户端和对等方组成的系统,它们以分层格式传递时间信息,其中,通常认为靠近层次结构根的节点比层次结构中较低的节点更准确地记录时间。每个NTP主机响应请求时间信息的输入消息,并为每个客户端保持活动的对等关联以跟踪关键信息。
为了响应接收到的时间信息,NTP对等方运行一个过程,该过程包括选择、集群和组合算法,这些算法将不同的服务器和参考时钟进行组合,以确定与时钟同步的最准确、最可靠的候选者。选择算法使用拜占庭式的故障检测原理,从事故人群中丢弃可能不正确的候选者“Falstickers”,只留下被称为“truechimers”的好候选者。truechimer是一种时钟,它可以将计时精度保持在以前发布的可信标准,而Falsticker是一种时钟,它显示的时间具有误导性或不一致性。聚类算法使用统计原理来寻找最准确的真嵌合体集。combine算法通过统计平均幸存的TrueChemer来计算最终时钟偏移。
一旦进行了适当的时钟调整,调整本身就由锁相和频率锁定回路进行处理。
这篇文章介绍了NTP,应该为想了解更多协议的人提供一个很好的概述。如果您想了解更多信息,可以从以下几大资源中进行选择: