4. PTP报文类型:事件报文与通用报文

各位好,今天我们来聊聊PTP协议里最基础的东西——报文类型。说实话,我刚接触PTP的时候,被那一堆报文名字搞得有点晕。Sync、Follow_Up、Delay_Req、Delay_Resp……这些到底干嘛用的?

其实没那么复杂。PTP报文就两大类:事件报文通用报文。搞懂这个分类,后面的东西就顺了。

4.1 事件报文 vs 通用报文

先说说分类依据。PTP协议里,报文分两类,区别在于:需不需要打时间戳

  • 事件报文(Event Message):这类报文在发送或接收时,硬件必须记录精确的时间戳。说白了,时间同步全靠它们。
  • 通用报文(General Message):这类报文不要求硬件打时间戳,只负责传递状态、配置等信息。

我个人习惯把事件报文比作「测量员」,通用报文比作「传令兵」。测量员必须知道每个动作的精确时刻,传令兵只要把话带到就行。

核心要点:事件报文有4种——Sync、Delay_Req、Pdelay_Req、Pdelay_Resp。通用报文有Follow_Up、Delay_Resp、Pdelay_Resp_Follow_Up、Announce、Signaling、Management。

嗯,这里要注意:Pdelay_Req和Pdelay_Resp是用于Peer Delay机制的,咱们今天先聚焦最常用的端到端(E2E)机制,也就是Sync、Follow_Up、Delay_Req、Delay_Resp这四位。

4.2 Sync报文——时间同步的起跑枪

Sync报文,你可以理解为时间同步的「发令枪」。主时钟(Master)定期发送Sync报文,告诉从时钟(Slave):「嘿,我要开始同步了!」

但Sync报文里装的是什么?这取决于单步模式还是双步模式

  • 单步模式(One-Step):Sync报文里直接携带了发送时间戳t1。从时钟收到后,记录接收时间t2。这样一对时间戳就拿到了。
  • 双步模式(Two-Step):Sync报文不携带t1,只负责触发从时钟记录t2。真正的t1由后续的Follow_Up报文送来。

我在项目中遇到过一种情况:有些交换机不支持透明时钟,但硬件时间戳又不够精确,结果Sync报文里的时间戳偏差很大。后来我们换了一款支持1588v2的交换机,问题才解决。

避坑指南:我曾经在调试时发现,Sync报文的发送间隔设置太短(比如每秒100次),导致网络拥塞。建议根据网络负载调整,一般每秒1-10次就够用了。

4.3 Follow_Up报文——Sync的「跟屁虫」

Follow_Up报文,说白了就是Sync的补充说明。它只在双步模式下出现。

为什么需要它?因为有些硬件无法在发送Sync的瞬间就把时间戳塞进报文里(比如软件时间戳或某些网卡)。所以PTP协议设计了一个「事后补报」的机制:Sync先发出去,Follow_Up随后跟上,把精确的t1带过来。

你想想看,这就像你寄快递时先发个空箱子,后面再补一张纸条写上发货时间。虽然麻烦点,但保证了时间戳的准确性。

报文 作用 携带信息 是否需要时间戳
Sync 触发从时钟记录t2 单步模式带t1,双步模式不带 是(发送端记录t1)
Follow_Up 传递精确的t1 t1

4.4 Delay_Req报文——从时钟的「回访」

Sync和Follow_Up解决了主到从的路径延迟吗?没有。它们只告诉从时钟「主时钟在t1时刻发了报文,你在t2时刻收到了」。但网络延迟是多少?不知道。

所以从时钟需要主动发一个Delay_Req报文,问主时钟:「我发这个报文的时间是t3,你收到的时间是多少?」

Delay_Req也是一个事件报文,从时钟在发送时记录t3,主时钟在接收时记录t4。

注意:Delay_Req的发送时机不是随意的。从时钟通常会在收到Sync后,等待一个随机时间再发Delay_Req,避免多个从时钟同时发送造成冲突。我曾经见过一个网络里200个从时钟同时发Delay_Req,直接把主时钟的网卡打爆了……后来加了随机延迟才稳定。

4.5 Delay_Resp报文——主时钟的「回执」

主时钟收到Delay_Req后,会回复一个Delay_Resp报文。这个报文里装的就是t4——主时钟收到Delay_Req的精确时间。

至此,从时钟手里有了四个时间戳:

  • t1:Sync的发送时间(来自Follow_Up或Sync本身)
  • t2:Sync的接收时间(从时钟自己记录的)
  • t3:Delay_Req的发送时间(从时钟自己记录的)
  • t4:Delay_Req的接收时间(来自Delay_Resp)

有了这四个时间戳,从时钟就能算出主从之间的时间偏差和网络延迟。具体怎么算?咱们下一章再细聊。

4.6 报文交互流程总览

为了让你看得更清楚,我画了一张流程图。这张图展示了双步模式下,主时钟和从时钟之间报文的完整交互过程。

主时钟 (Master) 从时钟 (Slave) ① Sync (记录t1) t1 ② 记录接收时间t2 ③ Follow_Up (携带t1) t1 ④ Delay_Req (记录t3) t3 ⑤ 记录接收时间t4 ⑥ Delay_Resp (携带t4) t4 主时钟动作 从时钟动作 通用报文

这张图里,①和④是事件报文(需要硬件打时间戳),③和⑥是通用报文(不需要硬件打时间戳)。②和⑤是本地记录动作,不涉及报文传输。

4.7 小结

今天咱们把PTP最核心的四种报文捋了一遍。记住几个关键点:

  • 事件报文要打时间戳,通用报文不用
  • Sync和Delay_Req是事件报文,Follow_Up和Delay_Resp是通用报文
  • 双步模式下,Sync只负责触发,Follow_Up负责送t1
  • Delay_Req和Delay_Resp配合,用来测量网络往返延迟

这些报文组合起来,就构成了PTP时间同步的完整链路。下一章咱们会深入时间戳的计算逻辑,看看从时钟到底怎么算出偏差和延迟的。

一句话总结:Sync开跑,Follow_Up补票,Delay_Req问路,Delay_Resp指路——四兄弟齐上阵,时间同步才能准。


专注资料整理