实施主 NTP 服务器(GPS 接收器)

Implementing Primary NTP Server (GPS Receiver)

我正在尝试实现基于 NMEA GPS 接收器的 NTP 服务器。我不确定用什么填充根延迟字段。

我读过NTPv4 specification,上面写着根延迟是到参考时钟的总往返延迟。

如果我正在使用辅助服务器,根延迟可以根据与参考服务器发出数据包请求时的时间戳之间的时间差来计算(我正确吗?)。

但是如果我使用 GPS 接收器作为参考时钟,我不确定该填什么,我应该填 0 吗?

这在很大程度上取决于您如何通过 GPS 在服务器中设置时间。如果您正在阅读 NMEA 语句、解释它并设置时钟,则根延迟就是执行该操作所花费的时间。但这不是一个很好的时钟;读取 RS232 涉及很多不确定的延迟(抖动)(假设这是您连接到 GPS 的方式)。

您可以使用 GPS 接收器每秒 1 个脉冲的输出来解决这个问题。它通常位于数据载体检测引脚上。使用正确的 RS232 端口(不是 USB 端口),您可以使服务器的时钟与其同步(DCD 可用于引发中断),因此现在您可以很好地对齐 GPS 时间。这当然可以在 Solaris(内核的本机部分)和 Linux 中完成(http://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks)。如果您这样做,那么我认为根延迟会很小,但存在 OS 和硬件对中断的响应时间的问题。

编辑

根据this NTP docs page,

Root Delay

This is the total roundtrip delay to the primary reference source at the root of the synchronization subnet, in seconds. Note that this variable can take on both positive and negative values, depending on clock Precision and Skew.

所以 1PPS 会很低。据我所知,这是一个辅助 NTP 服务器用来告诉其客户端它对参考时钟的延迟是多少的字段。所以如果你有一个 1PPS 锁定的 GPS 时间源,你就是一个参考时钟。在这种情况下,也许零就足够了;我不认为 N​​TP 可以实现跨网络时间同步精度(最多 1 毫秒)优于计算机的 IRQ 响应时间(< 50us 希望有一个好的 CONFIG_PREEMPT_RT linux 内核没有别的继续)。