14. Simple Network Time Protocol (简化网络时间协议 - SNTP)
简化网络时间协议(SNTPv4)是NTP的一个子集,适用于不需要实现完整缓解算法的主服务器和客户端。SNTP与NTP服务器和客户端完全互操作,可以在NTP子网中混合使用。
14.1. SNTP概述
适用场景:
- 主服务器:配备单个参考时钟的主服务器
- 客户端:具有单个上游服务器且无依赖客户端的客户端
NTP完整实现的适用场景:
- 具有多个上游服务器的辅助服务器
- 具有多个下游服务器或客户端的服务器
14.2. SNTP主服务器
特点:
- 实现第8节描述的线上协议
- 除单个参考时钟外没有上游服务器
- 原则上与具有缓解算法的NTP主服务器无法区分
数据包构造:
收到客户端请求后,SNTP主服务器按以下方式构造回复数据包:
| 数据包变量 | 来源变量 | 说明 |
|---|---|---|
| x.leap | s.leap | 闰秒指示器 |
| x.version | r.version | 版本号 |
| x.mode | 4 | 模式(服务器) |
| x.stratum | s.stratum | 层级 |
| x.poll | r.poll | 轮询间隔 |
| x.precision | s.precision | 精度 |
| x.rootdelay | s.rootdelay | 根延迟 |
| x.rootdisp | s.rootdisp | 根离散 |
| x.refid | s.refid | 参考ID |
| x.reftime | s.reftime | 参考时间 |
| x.org | r.xmt | 起源时间戳 |
| x.rec | r.dst | 接收时间戳 |
| x.xmt | clock | 传输时间戳 |
| x.keyid | r.keyid | 密钥ID(可选) |
| x.digest | md5 digest | 消息摘要(可选) |
注意事项:
- 数据包头中的离散字段必须按第5节描述进行更新
14.3. SNTP客户端
特点:
- 实现线上协议
- 具有单个服务器
- 无依赖客户端
实现选项:
最简单方法:
- 仅使用服务器数据包的传输时间戳
- 忽略所有其他字段
推荐方法:
- 实现完整的线上协议
- 附加复杂度很小
- 可获得更好的时间精度和可靠性
完整实现的优势:
- 可以计算往返延迟
- 可以检测和处理不对称延迟
- 可以验证数据包的有效性
- 支持可选的认证机制
14.4. SNTP与NTP的互操作性
互操作性保证:
- SNTP和NTP服务器/客户端完全互操作
- 可以在同一NTP子网中混合使用
- 使用相同的数据包格式和协议
区别:
- SNTP不实现缓解算法(选择、聚类、组合)
- SNTP不支持多个对等体之间的仲裁
- SNTP适用于简单的时间同步场景
使用建议:
- 对于简单应用,SNTP提供足够的时间同步能力
- 对于需要高可靠性和精度的应用,应使用完整的NTP实现
- SNTP客户端可以从NTP服务器获取时间,反之亦然