【发布时间】:2019-02-26 12:45:52
【问题描述】:
我正在尝试构建一个非常简单的 NTP (v3) 服务器,用于接收来自 LAN 上的 IP 摄像机的 NTP 请求以进行时间同步。摄像头与互联网断开连接,因此我们的想法是使用本地 PC 服务器作为摄像头的 NTP 服务器。
我尝试了两种不同的方法。
- 编写简单的 UDP 转发到已知 NTP 服务器(例如 time.windows.com)。这运作良好。
- 编写一个简单的 UDP 服务器,在端口 123 上侦听传入的 NTP 请求,它只返回服务器的系统时间。这对于简单的要求不高的 NTP 客户端(例如物理网络路由器)也很有效,但对于本地 HIKVISION 摄像头来说总是失败。
方法:接收一个48字节的缓冲区。确保偏移量 0 处的字节为 0x1B。将偏移量 0 处的字节转换为 0x1C 并将当前 UTC 时间写入最后 8 个字节作为 NTP 时间戳。这适用于大多数 NTP 客户端,但不适用于 HIKVISION。
相机发送此请求:
1B-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
00-00-00-00-00-00-00-00-61-8C-DE-CA-C3-73-89-DC
最后 8 个字节非零。如果我尝试修改我的 UDP 转发解决方案 [1],以便在转发之前将最后 8 个字节清零,则相机会报告错误。所以事实证明这些位很重要,并且可能具有一定的密码意义。
我正在研究 RFC 以试图理解这一点,但我找不到解释。我能找到的任何示例代码都完全忽略了这一点,走的是简单的路线。
所以问题是......如何解释 NTP 请求的尾随字节以及如何返回正确的 NTP 响应?欢迎提供一些示例代码或资源指针。
【问题讨论】:
标签: ntp