我正在阅读NTPv4 rfc以更好地理解ntp使用的机制.所以,基本的想法似乎很简单.但我对NTP Clock Discipline如何工作有点困惑.
在NTPv4中,它表示混合PLL/FLL用于训练时钟.根据我的理解 - PLL锁定服务器阶段并在更新间隔调整客户端时钟.FLL锁定时钟频率并以更新间隔调整客户端时钟.
它还说如果有更多的网络抖动(延迟尖峰),如果时钟漂移是问题(不同的时钟频率/漂移),FLL工作得更好,PLL工作得更好
我可以理解使用反馈控制来调整它们,也可以从NTP rfc中包含的图表中了解它们是如何工作的.但是,任何人都可以解释NTP如何仅从服务器收到的数据包中实现FLL/PLL混合时钟规则?
如果有人能够解释它背后的逻辑,那将是很棒的.
详尽回答问题:
NTP如何仅根据从服务器收到的数据包实施FLL / PLL混合时钟规则?
需要文档的90页:网络时间协议版本4,参考和实施指南。我将在这里尝试总结答案。
简而言之,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.
*/
Run Code Online (Sandbox Code Playgroud)
在广播服务器模式下,计算如下
offset = LFP2D(r->xmt - r->dst);
delay = BDELAY;
disp = LOG2D(r->precision) + LOG2D(s.precision) + PHI * 2 * BDELAY;
Run Code Online (Sandbox Code Playgroud)
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.
*/
Run Code Online (Sandbox Code Playgroud)
clock_filter本身会调用该clock_select函数,只有在此之后才clock_update调用该函数。
要记住的重要一点是,这些算法正在与多个时钟同步,而不仅仅是与一个服务器时钟同步。这引入了一层复杂性和问题如何与一台服务器同步?没有直接答案,因为建立了可与多个时钟同步的算法。
SNTP协议(简单NTP)仅使用一个服务器时钟,但没有官方参考实现。