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 报文交互流程总览
为了让你看得更清楚,我画了一张流程图。这张图展示了双步模式下,主时钟和从时钟之间报文的完整交互过程。
这张图里,①和④是事件报文(需要硬件打时间戳),③和⑥是通用报文(不需要硬件打时间戳)。②和⑤是本地记录动作,不涉及报文传输。
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指路——四兄弟齐上阵,时间同步才能准。