我正在阅读NTPv4 rfc以更好地理解ntp使用的机制。所以,基本的想法似乎很简单。但我对NTP Clock Discipline works的方式感到有些困惑。
在NTPv4中,它表示混合PLL / FLL用于训练时钟。根据我的理解 - PLL锁定服务器阶段并在更新间隔调整客户端时钟。 FLL锁定时钟频率并以更新间隔调整客户端时钟。
它还说如果有更多的网络抖动(延迟峰值),PLL工作得更好 如果时钟漂移是问题(不同的时钟频率/漂移),FLL工作得更好
我可以理解使用反馈控制来调整它们,也可以从NTP rfc中包含的图表中了解它们的工作原理。但是,任何人都可以解释NTP如何仅从服务器收到的数据包中实现FLL / PLL混合时钟规则?
如果有人能够解释其背后的逻辑,那将是很棒的。
答案 0 :(得分:4)
彻底回答问题:
NTP如何仅从服务器收到的数据包中实现FLL / PLL混合时钟规则?
需要文档的90页:Network Time Protocol Version 4, Reference and Implementation Guide。我将在这里总结一下答案。
简而言之,NTP客户端从一个或多个服务器接收时间戳并估计要应用的相位校正。然后逐渐应用校正以避免时钟跳跃。
可以使用PLL或FLL,但文档说
当网络抖动占主导地位时,PLL通常效果更好 当振荡器漂移占主导地位时,FLL效果更好。
与NTPv3相反,在NTPv4中,PLL和FLL同时使用并组合使用。
反馈控制系统
时钟规则是作为图1所示的反馈控制系统实现的。
图1:时钟规则反馈循环
theta_r 表示由组合算法生成的参考相位,表示相对于服务器组的系统时钟偏移的最佳估计值。
theta_c 表示系统时钟的控制阶段,建模为可变频率振荡器(VFO)。
V_d 是相位差theta_r - theta_c
V_s 是时钟滤波算法的输出,用于选择最佳偏移样本。
V_c 是环路滤波器产生的信号,它将PLL和FLL组合在一起,如第二幅图所示。
图2:时钟规则环路滤波器
===更新===
要了解相位偏移和频率偏移计算的细节,您必须深入了解参考实现。一个好的开始是packet()
函数
/*
* packet() - process packet and compute offset, delay and
* dispersion.
*/
在广播服务器模式下,计算如下
offset = LFP2D(r->xmt - r->dst);
delay = BDELAY;
disp = LOG2D(r->precision) + LOG2D(s.precision) + PHI * 2 * BDELAY;
其中r
是收到的数据包指针,s
是系统结构。
然后调用clock_filter
函数
/*
* The clock filter contents consist of eight tuples (offset,
* delay, dispersion, time). Shift each tuple to the left,
* discarding the leftmost one. As each tuple is shifted,
* increase the dispersion since the last filter update. At the
* same time, copy each tuple to a temporary list. After this,
* place the (offset, delay, disp, time) in the vacated
* rightmost tuple.
*/
clock_filter本身会调用clock_select
函数,只有在此之后调用clock_update
函数。
重要的是要记住,这些算法与多个时钟同步,而不是只与一个服务器时钟同步。这引入了一层复杂性和问题如何与一台服务器同步?没有直接的答案,因为算法是为了与多个时钟同步而构建的。
SNTP协议(简单NTP)仅使用一个服务器时钟,但没有官方参考实现。