PTP(Precision Time Protocol,精确时间协议),由IEEE 1588标准定义,是一种专门设计用于在分布式系统中通过网络(主要是以太网)同步时钟的协议。其核心目标是提供比NTP更高的时间同步精度。
PTP网络采用一种动态建立的主从(Master-Slave)层级架构来组织网络中的所有时钟 。在这个架构中,整个PTP域(一个共享相同时间属性的逻辑网络)只有一个最终的时间源,称为最高级主时钟(Grandmaster Clock, GM)。
这种主从关系构成了一个树状的同步层次结构。GM位于树根,时间信息从树根逐级流向树叶。网络中的一个普通时钟,既可以作为其上游时钟的从时钟,也可以作为其下游时钟的主时钟,这种设备被称为边界时钟(Boundary Clock)。
通过最佳主时钟算法(BMCA),可以实现一个PTP域中如何从众多潜在的主时钟中选举出唯一的Grandmaster。
BMCA是PTP分布式特性的核心体现,它允许网络中的时钟设备自动、动态地确定最佳的时间源,并构建出最优的同步树,无需人工干预。BMCA的运作机制如下:
宣告消息(Announce Message)的交换: 每个PTP时钟(或潜在的主时钟)都会周期性地向网络中多播“宣告消息”。这个消息中包含了该时钟的时间属性信息。
时间属性的比较: 当一个时钟收到来自其他时钟的宣告消息时,它会将其自身的时间属性与收到的消息中的时间属性进行比较。这个比较过程遵循一个严格的、预定义的优先级顺序。
状态决策:
最终,整个PTP域中只有一个时钟——那个拥有最优时间属性的时钟——会赢得所有比较,成为Grandmaster。其他所有时钟则通过逐级比较,形成一个指向GM的同步路径。
BMCA的动态特性使得PTP网络具有很高的鲁棒性。如果当前的GM发生故障或与网络断开连接,它会停止发送宣告消息。其他时钟在超时后会重新启动BMCA选举过程,自动从剩余的时钟中选举出新的最佳主时钟,从而实现同步链路的自愈。
PTP实现高精度同步的核心,在于其精确测量并补偿网络传输延迟和本地时钟偏差的能力。这是通过一系列带有精确时间戳的消息交换来完成的 。
该过程主要涉及四种消息:Sync(同步)、Follow_Up(跟随)、Delay_Req(延迟请求)和Delay_Resp(延迟响应)。
整个过程可以分解为两个阶段:偏差计算阶段和延迟计算阶段。
主时钟(Master) 在其本地时间 t1 时刻,向网络中发送一个 Sync 消息。
从时钟(Slave) 在其本地时间 t2 时刻,接收到这个 Sync 消息。
此时,如果网络传输是瞬时的,那么 t2 应该等于 t1 加上主从时钟之间的固定偏差(offset)。但实际上,Sync 消息在网络中传输需要时间,这个时间我们称之为路径延迟(Path Delay),记为 d_ms(master-to-slave delay)。因此,我们有:
t2 = t1 + offset + d_ms
Sync 消息本身可能不包含 t1 时间戳,因为在消息发送的瞬间获取并插入精确时间戳在某些硬件实现上很困难。为了解决这个问题,PTP引入了两步时钟(Two-Step Clock)机制:
主时钟在发送完 Sync 消息后,获取到该消息离开发送端口的精确时间戳 t1。然后,它会立即发送一个 Follow_Up 消息,这个消息中包含了刚才那个 Sync 消息的精确发送时间戳 t1。
注: 支持单步时钟(One-Step Clock)的硬件可以在发送Sync消息的同时,将精确的t1时间戳直接写入Sync消息中,从而无需发送Follow_Up消息。
为了求解上面公式中的两个未知数(offset 和 d_ms),从时钟需要发起一次反向的测量:
t3时刻,向主时钟发送一个 Delay_Req 消息。t4 时刻,接收到这个 Delay_Req 消息。t4 时间戳打包在一个 Delay_Resp 消息中,发送回从时钟。PTP协议中,假设了网络路径是对称的,即从时钟到主时钟的延迟 d_sm 等于主时钟到从时钟的延迟 d_ms。那么,我们有:
t2 = t1 + offset + d_sm
t4 = t3 - offset + d_ms (因 d_sm = d_ms)
现在,从时钟拥有了四个关键的时间戳:t1(来自Follow_Up消息)、t2(本地记录)、t3(本地记录)和 t4(来自Delay_Resp消息)。通过联立上述两个方程,可以解出 offset 和 d_ms:
计算平均路径延迟(Mean Path Delay),将两个方程相加:
(t2 - t1) + (t4 - t3) = (offset + d_ms) + (-offset + d_ms) = 2 * d_ms
可得平均路径延迟 d_ms 为:
d_ms = [(t2 - t1) + (t4 - t3)] / 2
计算时钟偏差(Clock Offset),将两个方程相减:
(t2 - t1) - (t4 - t3) = (offset + d_ms) - (-offset + d_ms) = 2 * offset
因此,时钟偏差 offset 为:
offset = [(t2 - t1) - (t4 - t3)] / 2
一旦从时钟计算出 offset,它就可以调整自己的本地时钟来消除这个偏差,从而与主时钟同步。例如,从时钟的正确时间 = 从时钟的当前时间 - offset。这个计算和调整的过程会周期性地重复进行,以不断跟踪和补偿时钟频率的漂移和网络延迟的变化。
PTP之所以能达到NTP难以企及的精度,关键在于其充分利用了硬件能力,并针对网络延迟进行了精细化处理。
PTP的精髓在于将时间戳的生成点尽可能地推近物理层(PHY)。支持PTP的以太网MAC或PHY芯片内置了专用的硬件时钟和时间戳单元。
通过硬件时间戳,PTP消除了由本地主机软件栈引入的最大的、最不可预测的延迟变量,使得t1, t2, t3, t4能够以纳秒级的精度反映消息在网络接口的真实收发时刻。这是PTP精度比NTP高出2-3个数量级的根本原因。
PTP不仅仅是一次性的时间校对,它是一个持续的同步过程。从时钟内部通常会运行一个复杂的时钟伺服算法(Clock Servo Algorithm)。
通过同时对相位和频率进行闭环控制,PTP从时钟不仅在某一时刻与主时钟对齐,而且能确保在长期运行中以几乎相同的“步调”前进,从而实现持久的、高稳定性的同步。
本文章使用limfx的vscode插件快速发布