详尽地回答问题:
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.
*/
在广播服务器模式下,计算如下
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 协议(Simple NTP)仅使用一个服务器时钟,但没有官方参考实现。