跳到主要内容

10. 时钟过滤算法 (Clock Filter Algorithm)

时钟过滤算法 (clock filter algorithm) 是对等体过程 (peer process) 的一部分. 它整理线上 (on-wire) 数据流, 从中选择最可能表示准确时间的样本. 该算法产生的变量包括偏移 (offset, theta), 延迟 (delay, delta), 离散度 (dispersion, epsilon), 抖动 (jitter, psi) 和到达时间 (time of arrival, t). 这些数据由缓解算法 (mitigation algorithms) 使用, 用于确定规训系统时钟时采用的最佳最终偏移. 它们也用于判断服务器健康状态, 以及服务器是否适合同步.

10.1. 过滤器结构 (Filter Structure)​

时钟过滤算法将最近的样本元组 (theta, delta, epsilon, t) 保存在过滤器结构 (filter structure) 中, 该结构作为 8 级移位寄存器运行. 元组按分组到达顺序保存. 这里, t 是由秒计数器给出的分组到达时间, 不应与对等体变量 (peer variable) tp 混淆.

以下机制用于确保过滤器中有足够样本, 并丢弃过旧的失效数据:

  • 初始化 (Initialization): 所有级的元组都设置为哑元组 (dummy tuple) (0, MAXDISP, MAXDISP, 0).
  • 样本到达 (Sample Arrival): 当有效分组到达时, 元组移入过滤器, 旧元组被丢弃, 因此最终只会留下有效元组.
  • 超时处理 (Timeout Handling): 如果可达寄存器 (reach register) 的低三位为零, 表示三个轮询间隔 (poll interval) 内没有收到有效分组, 轮询过程 (poll process) 将使用哑元组调用时钟过滤算法. 如果这种状态持续八个轮询间隔, 寄存器将回到初始状态.

10.2. 离散度计算 (Dispersion Calculation)​

下一步, 将移位寄存器各级复制到一个临时列表, 并按 delta 递增排序. 令 i 从 delta 最低的级开始索引. 如果第一个元组的历元 (epoch) t_0 不晚于最后一个有效样本的历元 tp, 该例程退出, 且不影响当前对等体变量. 否则, 令 epsilon_i 为第 i 个条目的离散度, 则对等体离散度 (peer dispersion) p.disp 为:

         i=n-1
--- epsilon_i
epsilon = \ ----------
/ (i+1)
--- 2
i=0

观察结果 (Observations):

a) 如果所有级都包含离散度为 MAXDISP 的哑元组, 则计算得到的离散度略小于 16 s.

b) 每当一个有效元组移入寄存器, 离散度会下降到略低于原来一半的程度, 具体取决于该有效元组的离散度.

c) 第四个有效分组之后, 离散度通常略小于 1 s, 这是选择算法 (selection algorithm) 使用的 MAXDIST 参数的假定值.

10.3. 抖动计算 (Jitter Calculation)​

令排序列表中第一级的偏移为 theta_0; 对于其它级, 无论顺序如何, 抖动都是以下 RMS 平均值:

              +-----                 -----+^1/2
| n-1 |
| --- |
1 | \ 2 |
psi = ---- * | / (theta_0-theta_j) |
(n-1) | --- |
| j=1 |
+----- -----+

其中 n 是过滤器中有效元组的数量 (n > 1). 为保证一致性并避免除法异常, psi 的下界为以秒表示的系统精度 (system precision) s.rho.

虽然通常不把抖动视为服务器质量排序的主要因素, 但它是基础计时性能和网络拥塞状态的重要指标.

10.4. 同步距离 (Synchronization Distance)​

同步距离 (synchronization distance) lambda 由延迟和离散度计算:

lambda = (delta / 2) + epsilon

说明 (Notes):

  • epsilon 以及由此得到的 lambda 以 PHI 速率增加.
  • lambda 不是状态变量 (state variable), 因为 lambda 每次使用时都会重新计算.
  • 它是根同步距离 (root synchronization distance) 的组成部分, 缓解算法将其作为指标, 用于评估每个服务器可提供时间的质量.

10.5. NTPv4 与 NTPv3 的差异​

需要注意, 与 NTPv3 不同, NTPv4 关联 (associations) 不会通过将层级 (stratum) 设置为 16 并将闰秒指示符 (leap indicator) 设置为 3 来表示超时条件. 关联变量 (association variables) 会保留最后一个分组到达时确定的值.

在 NTPv4 中:

  • lambda 随时间增加.
  • 同步距离最终会超过距离阈值 MAXDIST.
  • 此时该关联被认为不适合同步.

时钟过滤算法的示例实现在 Appendix A.5.2 的 clock_filter() 例程中给出.