正文 :
NTP 网络校时已有 20 年的历史,其核心同步算法(校准主机时钟漂移)是
反馈(PLL/FLL)。聚类算法从候选参考源中选择最佳者,减少网络时间漂移产生
的不良影响; 时钟调节算法校准计算机时钟的时间,补偿固有频率误差,根据测
得的抖动和漂移动态地调节相关参数。
符合 IETF RFC1589 标准的开源操作系统提供反馈同步算法,如下图所示,
系统调用 gettimeofday()、adjtime() 形成图一这样的后向反馈。
adjtime()
gettimeofday()
图二 后向反馈的一般模型
现在的个人计算机都内嵌了 TSC、ACPI(Advanced Confiuration and Power
Interface)、HPET(High Precisoin Event Timer ),在计算机操作系统启动时,这
些计数器都为 0,然后以各自相应的振荡器频率计数。计算机操作系统选择一个
认为可靠的计数器,并提供一个函数调用接口去访问它, linux Kernel 为
clocksource,FreeBSD Kernel 为 timecounter。
这些计数器的溢出产生 典型值为 1ms“硬件”中断。当程序执行一个
gettimeofday()系统调度,或者当“硬件时钟”产生中断时,常规 NTP 算法用 Kernel
生成一个系统时钟时间戳(time record)。
Kernel 读取当前计数器值(counter record)并计算出 δ,即上一次的计数器记录
与当前值之差值。Kernel 调用 adjtime()函数将 δ 转化成秒数,与上一次的时间记
录(time record)相加,就可得到系统时钟时间戳。
如果是执行一个 gettimeofday()系统调度,那么生成系统时钟时间戳将送回
给用户程序;如果由“硬件时钟”中断触发,那么生成系统时钟时间戳将变为新
的时间记录,同时当前计数器值也成为新的计数器记录。
在网络通信环境下,常规 NTP 算法打时间戳具有不确定性,呈高斯分布,
并挟带少量尖峰信号,这严重影响 NTP 反馈算法的实现精度,并可能导致 NTP
反馈算法失效。目前 NTP 的精度是毫秒级。