PTP协议精讲(2.12):PTP的十种语言——报文格式全解析
2.12 PTP的十种语言报文格式全解析如果PTP报文会说话想象PTP报文是信使在网络中穿梭。它们携带不同的信件Sync“主时钟说现在是10:00:00.000000000秒”Announce“我是主时钟我的clockClass是6clockAccuracy是0x20”Delay_Req“请告诉我你什么时候收到这条消息”Delay_Resp“我在10:00:01.000000100秒收到你的请求”每种报文都有特定的格式和用途。今天我们就来解读PTP的十种报文。PTP报文的分类事件报文Event Messages特点需要打时间戳精确性要求高通常由硬件处理报文类型报文类型值用途Sync0x0携带时间信息Delay_Req0x1请求延迟测量Pdelay_Req0x2对等延迟测量请求Pdelay_Resp0x3对等延迟测量响应为什么需要时间戳这些报文用于时间同步和延迟测量必须精确记录发送和接收时间。通用报文General Messages特点不需要打时间戳携带配置和状态信息可以由软件处理报文类型报文类型值用途Follow_Up0x8携带精确时间戳two-step模式Delay_Resp0x9延迟测量响应Pdelay_Resp_Follow_Up0xA对等延迟测量精确时间戳Announce0xB主时钟公告Signaling0xC信令Management0xD管理公共报文头部所有报文的信封头部结构34字节每个PTP报文都以一个34字节的公共头部开始。字段字节数含义majorSdoId messageType1高4位sdoId高位低4位报文类型minorVersionPTP versionPTP1高4位次版本号低4位主版本号messageLength2整个报文的字节数domainNumber1域编号minorSdoId1sdoId低位flagField2标志位correctionField8校正值单位纳秒×2¹⁶messageTypeSpecific4消息类型特定字段sourcePortIdentity10发送端口的标识sequenceId2序列号controlField1控制字段已过时logMessageInterval1消息间隔关键字段详解messageType报文类型低4位标识报文类型0x0Sync0x1Delay_Req0x2Pdelay_Req0x3Pdelay_Resp0x8Follow_Up0x9Delay_Resp0xAPdelay_Resp_Follow_Up0xBAnnounce0xCSignaling0xDManagement高4位majorSdoId用于域隔离见2.3节。domainNumber sdoIddomainNumber1字节majorSdoId高4位minorSdoId1字节 完整的域标识。flagField标志位16位标志位各位含义字节位名称含义00alternateMasterFlagTRUE表示发送端口不在MASTER状态01twoStepFlagTRUE表示会有Follow_Up02unicastFlagTRUE表示单播05-6profileSpecific1/2Profile定义10leap61当月最后一分钟61秒11leap59当月最后一分钟59秒12currentUtcOffsetValidUTC偏移有效13ptpTimescaleTRUE表示PTP时间尺度14timeTraceable时间可溯源15frequencyTraceable频率可溯源16synchronizationUncertain同步不确定correctionField校正字段8字节整数单位是纳秒×2¹⁶支持亚纳秒精度。用途携带小数纳秒部分透明时钟累加驻留时间路径不对称校正值示例correctionField 0x0000000000028000 值 0x28000 / 65536 2.5纳秒sourcePortIdentity发送端口标识10字节前8字节clockIdentity后2字节portNumber示例clockIdentity 00-1B-19-00-00-00-00-01 portNumber 0x0001 sourcePortIdentity 00-1B-19-00-00-00-00-01-00-01sequenceId序列号2字节标识报文的序号。用途关联Sync和Follow_Up关联Delay_Req和Delay_Resp检测丢包各报文类型详解Sync报文格式字段字节数公共头部34originTimestamp10originTimestamp10字节6字节秒部分4字节纳秒部分one-step模式Sync报文直接携带发送时间戳误差≤1秒。two-step模式Sync报文的originTimestamp为0或估计值精确时间戳由Follow_Up携带。Follow_Up报文格式字段字节数公共头部34preciseOriginTimestamp10preciseOriginTimestamp10字节精确的Sync发送时间戳。关联规则Follow_Up报文的sequenceId必须与对应的Sync报文相同。Delay_Req报文格式字段字节数公共头部34originTimestamp10originTimestamp通常设为0因为从时钟不知道自己的时间是否准确。用途从时钟发送Delay_Req主时钟回复Delay_Resp用于测量路径延迟。Delay_Resp报文格式字段字节数公共头部34receiveTimestamp10requestingPortIdentity10receiveTimestamp10字节主时钟接收Delay_Req的时间。requestingPortIdentity10字节发送Delay_Req的端口标识用于关联。示例从时钟发送Delay_ReqsequenceId 100。主时钟在1000.000001000秒接收Delay_Req。主时钟发送Delay_RespreceiveTimestamp 1000.000001000秒requestingPortIdentity 从时钟的portIdentitysequenceId 100Pdelay_Req报文格式字段字节数公共头部34originTimestamp10reserved10reserved字段保留字段使报文长度与Pdelay_Resp一致避免不对称。用途P2P机制中测量两个端口之间的链路延迟。Pdelay_Resp报文格式字段字节数公共头部34requestReceiptTimestamp10requestingPortIdentity10requestReceiptTimestamp响应者接收Pdelay_Req的时间t2。one-step模式Pdelay_Resp的correctionField携带t3 - t2。two-step模式Pdelay_Resp携带t2Pdelay_Resp_Follow_Up携带t3。Pdelay_Resp_Follow_Up报文格式字段字节数公共头部34responseOriginTimestamp10requestingPortIdentity10responseOriginTimestamp响应者发送Pdelay_Resp的时间t3。Announce报文格式字段字节数公共头部34originTimestamp10currentUtcOffset2reserved1grandmasterPriority11grandmasterClockQuality4grandmasterPriority21grandmasterIdentity8stepsRemoved2timeSource1grandmasterClockQuality4字节1字节clockClass1字节clockAccuracy2字节offsetScaledLogVariancestepsRemoved到Grandmaster的边界时钟跳数。timeSourceGrandmaster的时间源类型如GNSS、原子钟。用途主时钟广播自己的信息用于BMCA决策传播时间属性UTC偏移、闰秒等Signaling报文格式字段字节数公共头部34targetPortIdentity10后缀TLV序列可变用途单播协商路径追踪其他信令功能后缀一个或多个TLVType-Length-Value实体。Management报文格式字段字节数公共头部34targetPortIdentity10startingBoundaryHops1boundaryHops1reserved1actionField1reserved1managementTLV可变actionField0GET读取1SET设置2RESPONSE响应3COMMAND命令4ACKNOWLEDGE确认用途配置PTP设备查询状态故障诊断报文长度汇总报文类型基础长度字节备注Sync44可加TLVDelay_Req44可加TLVFollow_Up44可加TLVDelay_Resp54可加TLVPdelay_Req54含10字节保留Pdelay_Resp54可加TLVPdelay_Resp_Follow_Up54可加TLVAnnounce62可加TLVSignaling44头部TLV序列Management48头部管理TLV一个完整的报文示例Sync报文one-step十六进制表示00 00 00 2C // majorSdoId0, messageType0x0(Sync), version2.1, length44 00 00 00 00 // domainNumber0, minorSdoId0 00 00 // flagField0 00 00 00 00 00 00 00 00 // correctionField0 00 00 00 00 // messageTypeSpecific0 00 1B 19 00 00 00 00 01 00 01 // sourcePortIdentity 00 64 // sequenceId100 00 00 // controlField0, logMessageInterval0 00 00 00 00 00 00 03 E8 // originTimestamp秒1000 00 00 00 00 // originTimestamp纳秒0解读报文类型SyncPTP版本2.1域0发送端口clockIdentity00-1B-19-00-00-00-00-01, portNumber1序列号100发送时间1000.000000000秒Announce报文十六进制表示简化00 0B 00 3E // messageType0xB(Announce), length62 00 00 00 00 // domainNumber0, minorSdoId0, flagField0 ... 00 1B 19 00 00 00 00 01 00 01 // sourcePortIdentity 00 64 // sequenceId100 ... 00 00 00 00 00 00 00 00 // originTimestamp0 00 25 // currentUtcOffset37 00 // reserved 0A // grandmasterPriority110 06 20 00 00 // clockClass6, clockAccuracy0x20, variance0 0A // grandmasterPriority210 00 1B 19 00 00 00 00 01 // grandmasterIdentity 00 00 // stepsRemoved0 20 // timeSource0x20(GNSS)解读报文类型Announce发送端口clockIdentity00-1B-19-00-00-00-00-01, portNumber1Grandmaster信息priority110, priority210clockClass6, clockAccuracy0x20timeSourceGNSSstepsRemoved0发送者自己就是Grandmaster小结PTP报文的核心要点报文分类事件报文需要时间戳Sync、Delay_Req、Pdelay_Req、Pdelay_Resp通用报文不需要时间戳Follow_Up、Delay_Resp、Pdelay_Resp_Follow_Up、Announce、Signaling、Management公共头部34字节包含报文类型、域标识、校正字段、发送端口等关键报文Sync时间同步Announce主时钟公告Delay_Req/RespE2E延迟测量Pdelay系列P2P延迟测量报文关联通过sequenceId关联相关报文通过sourcePortIdentity标识发送者下集预告PTP报文格式是固定的但有时需要扩展功能。下一节我们将讲解TLV扩展机制——如何在固定格式基础上灵活扩展PTP功能。【悬念留给2.13】你可能注意到PTP报文有一个后缀部分可以携带TLV。TLV是什么它能做什么PATH_TRACE TLV记录报文经过的路径CUMULATIVE_RATE_RATIO TLV携带频率信息AUTHENTICATION TLV安全认证下一节我们详细解读TLV扩展机制。本文内容摘自本人的开源书《PTP技术书 - 从思想实验到协议实现》全书从时间本质的思想实验出发深度解析 IEEE 1588 协议、逐章分析 LinuxPTP 源码并带你动手实现一个轻量级 PTP 程序ptp-lite。 在线阅读/下载ptp-bookgitclone https://github.com/Lularible/ptp-book.git⭐ 如果对您有帮助欢迎 Star 支持也欢迎通过 GitHub Issues 交流讨论。