PTP精确时间协议调研

简介

PTP(Precision Time Protocol,精确时间协议),由IEEE 1588标准定义,是一种专门设计用于在分布式系统中通过网络(主要是以太网)同步时钟的协议。其核心目标是提供比NTP更高的时间同步精度。

PTP的主从(Master-Slave)层级架构

层级架构

PTP网络采用一种动态建立的主从(Master-Slave)层级架构来组织网络中的所有时钟 。在这个架构中,整个PTP域(一个共享相同时间属性的逻辑网络)只有一个最终的时间源,称为最高级主时钟(Grandmaster Clock, GM)‍。

  • 最高级主时钟(Grandmaster Clock, GM): GM是整个同步层级的根节点,它通常连接到一个权威的外部时间源,如全球定位系统(GPS)或原子钟(如铯钟、铷钟),以获取协调世界时(UTC) 。GM负责生成并向下游分发精确的时间信息。
  • 主时钟(Master Clock): 在同步链中,任何为其下游设备提供时间参考的时钟都扮演着主时钟的角色。GM是顶级的主时钟。
  • 从时钟(Slave Clock): 任何从其上游主时钟接收时间信息并调整自身时钟的设备,都扮演着从时钟的角色 。

这种主从关系构成了一个树状的同步层次结构。GM位于树根,时间信息从树根逐级流向树叶。网络中的一个普通时钟,既可以作为其上游时钟的从时钟,也可以作为其下游时钟的主时钟,这种设备被称为边界时钟(Boundary Clock)‍。

层级架构维护与自愈

通过最佳主时钟算法(BMCA)‍,可以实现一个PTP域中如何从众多潜在的主时钟中选举出唯一的Grandmaster。

BMCA是PTP分布式特性的核心体现,它允许网络中的时钟设备自动、动态地确定最佳的时间源,并构建出最优的同步树,无需人工干预。BMCA的运作机制如下:

  • 宣告消息(Announce Message)的交换: 每个PTP时钟(或潜在的主时钟)都会周期性地向网络中多播“宣告消息”。这个消息中包含了该时钟的时间属性信息。

  • 时间属性的比较: 当一个时钟收到来自其他时钟的宣告消息时,它会将其自身的时间属性与收到的消息中的时间属性进行比较。这个比较过程遵循一个严格的、预定义的优先级顺序。

  • 状态决策:

    1. 如果一个时钟发现网络中存在一个比它“更好”的时钟(根据上述比较规则),它将进入从属(Slave)‍状态,并停止发送自己的宣告消息,开始同步到那个更好的主时钟。
    2. 如果一个时钟在一段时间内没有收到任何比它更好的宣告消息,它将认为自己是当前子网中最好的时钟,于是进入主控(Master)‍状态,并开始发送自己的宣告消息。

    最终,整个PTP域中只有一个时钟——那个拥有最优时间属性的时钟——会赢得所有比较,成为Grandmaster。其他所有时钟则通过逐级比较,形成一个指向GM的同步路径。

BMCA的动态特性使得PTP网络具有很高的鲁棒性。如果当前的GM发生故障或与网络断开连接,它会停止发送宣告消息。其他时钟在超时后会重新启动BMCA选举过程,自动从剩余的时钟中选举出新的最佳主时钟,从而实现同步链路的自愈。

时间戳交换与延迟测量机制

PTP实现高精度同步的核心,在于其精确测量并补偿网络传输延迟和本地时钟偏差的能力。这是通过一系列带有精确时间戳的消息交换来完成的 。

该过程主要涉及四种消息:Sync(同步)、Follow_Up(跟随)、Delay_Req(延迟请求)和Delay_Resp(延迟响应)。

整个过程可以分解为两个阶段:偏差计算阶段和延迟计算阶段。

偏差计算(Offset Calculation)‍

主时钟(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消息。

延迟计算(Delay Calculation)‍

为了求解上面公式中的两个未知数(offsetd_ms),从时钟需要发起一次反向的测量:

  1. 从时钟(Slave)‍ 在其本地时间t3时刻,向主时钟发送一个 Delay_Req 消息。
  2. 主时钟(Master)‍ 在其本地时间 t4 时刻,接收到这个 Delay_Req 消息。
  3. 主时钟将 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消息)。通过联立上述两个方程,可以解出 offsetd_ms

  1. 计算平均路径延迟(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 
    
  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精确时间协议高精度原理

PTP之所以能达到NTP难以企及的精度,关键在于其充分利用了硬件能力,并针对网络延迟进行了精细化处理。

硬件时间戳

PTP的精髓在于将时间戳的生成点尽可能地推近物理层(PHY)。支持PTP的以太网MAC或PHY芯片内置了专用的硬件时钟和时间戳单元。

  • 发送时: 当PTP事件消息的第一个比特(或最后一个比特,取决于实现)真正在物理链路上发出时,硬件会捕捉此刻硬件时钟的精确时间,生成时间戳t1或t3。这个过程完全绕开了操作系统和软件协议栈的延迟和抖动。
  • 接收时: 当PTP事件消息的第一个比特(或最后一个比特)从物理链路到达时,硬件会立即捕捉此刻硬件时钟的精确时间,生成时间戳t2或t4。

通过硬件时间戳,PTP消除了由本地主机软件栈引入的最大的、最不可预测的延迟变量,使得t1, t2, t3, t4能够以纳秒级的精度反映消息在网络接口的真实收发时刻。这是PTP精度比NTP高出2-3个数量级的根本原因。

频率同步与伺服算法

PTP不仅仅是一次性的时间校对,它是一个持续的同步过程。从时钟内部通常会运行一个复杂的时钟伺服算法(Clock Servo Algorithm)‍。

  • 相位调整(Phase Adjustment): 当从时钟计算出与主时钟的偏差(offset)后,它需要调整自己的本地时钟。简单的做法是直接“跳变”,即将时钟设置为正确的时间。但在许多应用中(如音视频流),时间的突然跳变是不可接受的。因此,伺服算法通常会采用“微步”或“频率调整”的方式,平滑地将本地时钟“拨”向正确的时间,这个过程称为相位对齐。
  • 频率同步(Frequency Synchronization): 更重要的是,伺服算法会持续监控计算出的offset的变化趋势。如果offset持续向一个方向增长或减少,这表明从时钟的晶体振荡器(晶振)的频率与主时钟不一致(即从时钟的“秒”比主时钟的“秒”长或短)。伺服算法(通常是一个PID控制器或类似的控制环路)会通过调整本地时钟的频率(例如,通过调整数字控制振荡器DAC/NCO)来使其与主时钟的频率保持一致。

通过同时对相位和频率进行闭环控制,PTP从时钟不仅在某一时刻与主时钟对齐,而且能确保在长期运行中以几乎相同的“步调”前进,从而实现持久的、高稳定性的同步。


本文章使用limfx的vscode插件快速发布