5. Implementation Model (实现模型)
图2显示了典型的多线程实现架构 (multi-threaded implementation). 它包括为每个服务器专用的两个进程, 一个对等体进程 (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节中描述的各种其他数据. 客户端向一个或多个服务器发送数据包, 然后在接收到返回的数据包时处理它们. 服务器交换源地址和目标地址以及端口, 覆盖数据包中的某些字段并立即返回 (在客户端/服务器模式下) 或稍后某个时间返回 (在对称模式下). 当接收到每个NTP消息时, 计算对等体时钟与系统时钟之间的偏移 (offset, theta) 以及相关的统计量delta、epsilon和psi.
系统进程 (system process) 包括选择 (selection)、聚类 (cluster) 和组合 (combine) 算法, 这些算法在各种服务器和参考时钟之间进行缓解, 以确定最准确和可靠的候选者来同步系统时钟. 选择算法使用拜占庭故障检测原理 (Byzantine fault detection principles) 从入射总体中丢弃被认为不正确的候选者 (称为"falsetickers"), 只留下称为"truechimers"的良好候选者. truechimer是维持计时精度到先前发布和可信标准的时钟, 而falseticker是显示误导性或不一致时间的时钟. 聚类算法使用统计原理找到最准确的truechimers集合. 组合算法通过统计平均幸存的truechimers来计算最终时钟偏移.
时钟调控进程 (clock discipline process) 是控制系统时钟的时间和频率的系统进程, 在这里表示为可变频率振荡器 (variable frequency oscillator, VFO). 从VFO获取的时间戳关闭了维护系统时钟时间的反馈回路 (feedback loop). 与时钟调控进程相关联的是时钟调整进程 (clock-adjust process), 它每秒运行一次以注入计算的时间偏移并保持恒定频率. 过去时间偏移差异的RMS平均值表示标称误差或系统时钟抖动 (system clock jitter). 过去频率偏移差异的RMS平均值表示振荡器频率稳定性 (oscillator frequency stability) 或频率漂移 (frequency wander). 这些术语在第11.3节中给出精确解释.
客户端以2^tau秒的轮询间隔 (poll interval) 向每个服务器发送消息, 如轮询指数 (poll exponent) tau所确定. 在NTPv4中, tau的范围从4 (16秒) 到17 (36小时). tau的值由时钟调控算法确定以匹配环路时间常数 (loop-time constant) T_c = 2^tau. 在客户端/服务器模式下, 服务器立即响应; 然而, 在对称模式下, 两个对等体中的每一个都将tau管理为当前系统偏移和系统抖动的函数, 因此它们可能不同意相同的值. 重要的是, 必须仔细控制时钟调控算法的动态行为, 以便在整个NTP子网中保持稳定性. 这要求对等体就等于两个对等体的最小轮询指数的公共tau达成一致. NTP协议包括正确协商此值的规定.
实现模型包括一些设置和调整系统时钟的方法. 假设操作系统提供两个函数: 一个直接设置时间, 例如Unix的 settimeofday() 函数, 另一个以小增量调整时间, 按指定量推进或延迟时间, 例如Unix的 adjtime() 函数. 在此及以下引用中, 名称后面的括号表示对函数的引用而不是简单变量. 在预期设计中, 如果调整小于指定阈值 (threshold), 时钟调控进程使用 adjtime() 函数, 如果超过阈值则使用 settimeofday() 函数. 第10节中描述了完成此操作的方式和阈值的值.