跳到主要内容

3. 协议模式

NTP 协议有三种变体: 对称 (symmetric), 客户端/服务器 (client/server), 以及广播 (broadcast). 如图 1 所示, 每种变体都关联一种关联模式 (association mode), 即对两个 NTP 通信实体之间关系的描述. 此外, 持久关联 (persistent association) 在启动时被动员 (mobilized), 且永不解除动员 (demobilized). 临时关联 (ephemeral association) 在数据包到达时被动员, 并在发生错误或超时时解除动员.

+-------------------+-------------------+------------------+
| 关联模式 | 关联模式值 | 数据包模式值 |
+-------------------+-------------------+------------------+
| Symmetric Active | 1 | 1 or 2 |
| Symmetric Passive | 2 | 1 |
| Client | 3 | 4 |
| Server | 4 | 3 |
| Broadcast Server | 5 | 5 |
| Broadcast Client | 6 | N/A |
+-------------------+-------------------+------------------+

图 1: 关联模式和数据包模式

在 client/server 变体中, 一个持久客户端向服务器发送数据包模式 4 的数据包, 服务器返回数据包模式 3 的数据包. 服务器向一个或多个客户端提供同步, 但不从这些客户端接受同步. 服务器也可以是参考时钟驱动程序 (reference clock driver), 直接从 GPS 接收器或电话调制解调器服务等标准源获取时间. 在这种变体中, 客户端从服务器拉取同步.

在 symmetric 变体中, 对等方 (peer) 通过对称主动 (symmetric active) 或对称被动 (symmetric passive) 关联, 同时作为服务器和客户端运行. 一个持久的对称主动关联向对称主动的对等关联发送对称主动 (模式 1) 数据包. 另一种情况是, 当一个没有匹配关联的对称主动数据包到达时, 可以动员一个临时的对称被动关联. 该关联发送对称被动 (模式 2) 数据包, 并持续到发生错误或超时. 对等方彼此之间既推送同步也拉取同步. 就本文档而言, 对等方的运行方式类似客户端, 因此提到客户端时也隐含包括对等方.

在 broadcast 变体中, 一个持久广播服务器 (broadcast server) 关联会定期发送可由多个客户端接收的广播服务器 (模式 5) 数据包. 收到没有匹配关联的广播服务器数据包时, 会动员一个临时广播客户端 (broadcast client, 模式 6) 关联, 并持续到发生错误或超时. 提供一个初始交换轮次是有用的: 以客户端模式运行的客户端先与服务器交换若干数据包, 以校准传播延迟并运行 Autokey 安全协议, 随后客户端恢复为广播客户端模式. 广播服务器向客户端和其他服务器推送同步.

大体沿用电话行业建立的惯例, 层次结构中每台服务器的级别由 stratum 编号 (stratum number) 定义. 主服务器被分配为 stratum one; 每个更低层级的辅助服务器被分配的 stratum 编号比前一层级大 1. 随着 stratum 编号增大, 其准确性会下降, 下降程度取决于具体网络路径和系统时钟稳定性. 以同步距离 (synchronization distance) 衡量的平均误差, 大致与 stratum 编号和测得的往返延迟成比例增加.

作为标准实践, 定时网络拓扑 (timing network topology) 应组织为避免定时环路, 并尽量减小同步距离. 在 NTP 中, 子网拓扑使用 Bellman-Ford 分布式路由算法的一个变体确定, 该算法计算以主服务器为根的最短路径生成树. 这种设计使算法即使在定时网络发生故障时, 也能自动重组子网, 从而产生最准确, 最可靠的时间.

3.1. 动态服务器发现

有两种特殊关联: 多播客户端 (manycast client) 和多播服务器 (manycast server), 它们提供动态服务器发现功能. 多播客户端关联有两种类型: 持久型和临时型. 持久多播客户端向指定的 IPv4 或 IPv6 广播或组播组地址发送客户端 (模式 3) 数据包. 位于数据包头部生存时间 (time-to-live, TTL) 字段范围内的指定多播服务器, 会侦听发往该地址的数据包. 如果某个服务器适合同步, 它会使用客户端的单播地址返回一个普通服务器 (模式 4) 数据包. 收到该数据包后, 客户端会动员一个临时客户端 (模式 3) 关联. 该临时客户端关联会持续到发生错误或超时.

多播客户端会持续发送数据包, 以搜索最小数量的关联. 它从 TTL 等于 1 开始, 并不断将 TTL 加 1, 直到建立了最小数量的关联, 或 TTL 达到最大值. 如果 TTL 达到最大值但动员的关联仍不足, 客户端会停止传输一个超时周期, 以清除所有关联, 然后重复搜索周期. 如果已动员最小数量的关联, 客户端便开始在每个超时周期发送一个数据包, 以维持这些关联. 字段约束将最小值限制为 1, 最大值限制为 255. 这些限制可以根据具体应用需求调优.

临时关联之间会相互竞争. 随着新的临时关联被动员, 客户端会运行第 10 节和第 11.2 节描述的缓解算法, 从总体中选出最佳候选; 其余临时关联会超时并解除动员. 通过这种方式, 总体中只包含最近用 NTP 数据包作出响应, 可用于规训系统时钟的最佳候选.