跳到主要内容

5. 实现模型

图 2 展示了一个典型多线程实现的架构. 它为每台服务器包含两个专用进程: 一个对等方进程 (peer process), 用于从服务器或参考时钟接收消息; 以及一个轮询进程 (poll process), 用于向服务器或参考时钟传输消息.

.....................................................................
. Remote . Peer/Poll . System . Clock .
. Servers . Processes . Process .Discipline.
. . . . Process .
.+--------+. +-----------+. +------------+ . .
.| |->| |. | | . .
.|Server 1| |Peer/Poll 1|->| | . .
.| |<-| |. | | . .
.+--------+. +-----------+. | | . .
. . ^ . | | . .
. . | . | | . .
.+--------+. +-----------+. | | +-----------+. .
.| |->| |. | Selection |->| |. +------+ .
.|Server 2| |Peer/Poll 2|->| and | | Combine |->| Loop | .
.| |<-| |. | Cluster | | Algorithm |. |Filter| .
.+--------+. +-----------+. | Algorithms |->| |. +------+ .
. . ^ . | | +-----------+. | .
. . | . | | . | .
.+--------+. +-----------+. | | . | .
.| |->| |. | | . | .
.|Server 3| |Peer/Poll 3|->| | . | .
.| |<-| |. | | . | .
.+--------+. +-----------+. +------------+ . | .
....................^.........................................|......
| . V .
| . +-----+ .
+--------------------------------------| VFO | .
. +-----+ .
. Clock .
. Adjust .
. Process .
............

图 2: 实现模型

这些进程操作一个公共数据结构, 称为关联 (association). 该结构包含上述统计量, 以及第 9 节描述的各种其他数据. 客户端向一个或多个服务器发送数据包, 然后在收到返回的数据包时处理它们. 服务器会交换源地址和目标地址以及源端口和目标端口, 覆写数据包中的某些字段, 并立即返回该数据包 (在 client/server 模式中), 或在稍后某个时刻返回 (在 symmetric 模式中). 每收到一条 NTP 消息, 都会计算对等方时钟与系统时钟之间的偏移量 theta, 以及相关统计量 delta, epsilon 和 psi.

系统进程 (system process) 包含选择算法 (selection algorithm), 聚类算法 (cluster algorithm) 和组合算法 (combine algorithm). 这些算法在各服务器和参考时钟之间进行缓解处理, 以确定最准确, 最可靠的候选项来同步系统时钟. 选择算法使用拜占庭故障检测 (Byzantine fault detection) 原理, 从输入总体中丢弃那些推定为不正确的候选项, 即 "falsetickers", 只保留称为 "truechimers" 的良好候选项. truechimer 是一种相对于先前发布且受信任标准保持计时准确性的时钟, 而 falseticker 是一种显示误导性或不一致时间的时钟. 聚类算法使用统计原理寻找最准确的一组 truechimers. 组合算法通过对幸存的 truechimers 进行统计平均来计算最终时钟偏移量.

时钟规训进程 (clock discipline process) 是一个系统进程, 用于控制系统时钟的时间和频率, 此处系统时钟表示为可变频率振荡器 (variable frequency oscillator, VFO). 由 VFO 打出的时间戳会闭合维持系统时钟时间的反馈环路. 与时钟规训进程相关联的是时钟调整进程 (clock-adjust process), 它每秒运行一次, 注入计算得到的时间偏移量并维持恒定频率. 过去时间偏移量差值的 RMS 平均值表示标称误差或系统时钟抖动. 过去频率偏移量差值的 RMS 平均值表示振荡器频率稳定性或频率漂移 (frequency wander). 第 11.3 节对这些术语给出了精确定义.

客户端按 2^tau 秒的轮询间隔 (poll interval) 向每台服务器发送消息, 该间隔由轮询指数 (poll exponent) tau 决定. 在 NTPv4 中, tau 的范围为 4 (16 s) 到 17 (36 h). tau 的值由时钟规训算法确定, 用以匹配环路时间常数 T_c = 2^tau. 在 client/server 模式中, 服务器立即响应; 然而在 symmetric 模式中, 两个对等方各自将 tau 作为当前系统偏移量和系统抖动的函数来管理, 因此它们可能不会同意相同的值. 为了在整个 NTP 子网中保持稳定性, 必须仔细控制时钟规训算法的动态行为. 这要求对等方就一个公共 tau 达成一致, 该 tau 等于两个对等方中较小的轮询指数. NTP 协议包含相应规定, 用于正确协商这个值.

实现模型包含某些设置和调整系统时钟的手段. 这里假定操作系统提供两个函数: 一个用于直接设置时间, 例如 Unix settimeofday() 函数; 另一个用于以小增量调整时间, 通过指定量来推进或延后时间, 例如 Unix adjtime() 函数. 在本处及后续引用中, 名称后的括号表示引用的是函数, 而不是简单变量. 在预期设计中, 如果调整量小于指定阈值, 时钟规训进程使用 adjtime() 函数; 如果调整量高于该阈值, 则使用 settimeofday() 函数. 第 10 节描述了执行方式以及该阈值的取值.