3. TRDP协议头深度解析

TRDP(Train Real-time Data Protocol)的报文分析,第一步永远是“把头部读对”。TRDP 报文头固定为 40 字节(不含应用数据),它决定了这帧数据是谁发的、发给谁、属于哪类通信、携带多少有效载荷,以及是否允许丢包。抓包工具默认只把 TRDP 当作普通 UDP 展示,若不逐字段对照协议规范,很容易把 ComId 当成端口号、把序列号当成时间戳。本节先建立字段语义,再用一帧真实结构的示例报文做逐字节标注。

一、40 字节头部到底装了什么

TRDP 头部按大端序(网络字节序)编码,可划分为三个逻辑区:通信标识区(版本号、消息类型、ComId)、路由与生命周期区(源/目的 IP、序列号、时间戳、生存时间)、数据集描述区(数据集长度、保留字段、数据集标识)。理解这个分区比死记偏移量更重要,因为抓包时我们通常先看消息类型和 ComId 定位业务,再看序列号和数据集长度判断数据是否连续、长度是否异常。

各字段的偏移与含义如下表所示(偏移从 TRDP 头首字节起算):

偏移长度字段含义与判读要点
02 B版本号 Version高字节主版本、低字节次版本,常见 0x0100 表示 1.0
22 B消息类型 MsgType区分过程数据 PD、消息数据 MD、报警等,决定后续解析路径
44 BComId通信标识,业务层面的“数据通道号”,不是 UDP 端口
84 B序列号 SeqNo发送端递增计数,用于检测丢帧与乱序
124 B时间戳 TimeStamp发送时刻,单位通常为 1 μs 或 10 μs,取决于实现
164 B数据集长度 DatasetLength应用数据字节数,不含 40 字节头
204 B数据集标识 DatasetId标识数据集结构模板,用于校验载荷布局
244 B源 IP / 目的 IP冗余与路由判断依据,与 UDP 层地址应一致
324 B生存时间 / 保留PD 通信的时效约束,超时即视为无效数据

需要强调:ComId 与 UDP 端口是两个维度。同一端口上可以承载多个 ComId,抓包过滤时应先按端口缩小范围,再按 ComId 区分业务流。序列号则是判断“数据是否新鲜”的关键——PD 数据周期性发送,若序列号长时间不递增,说明发送端卡死或链路中断,而不是数据没变。

TRDP 报文头逐字段标注(示例帧,40 字节) 字节偏移 0 2 4 8 12 16 20 24… 版本号 0x0100 消息类型 PD=0x5064 ComId 0x01020304 序列号 0x0000001A 时间戳 0x0001E240 数据集长度 0x00000020 数据集标识 0x00000064 源 IP / 目的 IP 192.168.10.11 → .20 生存时间 / 保留 TTL = 100 ms 应用数据(DatasetLength = 32 字节) 载荷内容由 DatasetId 对应的结构模板解释 抓包现场的三条判读主线 ① 定位业务 消息类型 + ComId 先分清 PD / MD,再对业务表 ② 判断连续性 序列号递增 + 时间戳 跳变即丢帧,停滞即断流 ③ 校验载荷 数据集长度 + 数据集标识 长度不符即结构错位 常见误判提醒 · ComId 不是 UDP 端口,不能拿端口号直接当 ComId 过滤业务 · 序列号不递增不等于数据没变,可能是发送端停发;需结合时间戳与 TTL 一起看

二、抓一帧真实报文并逐字段对照

假设在车载网络中抓取一帧过程数据(PD),Wireshark 显示 UDP 目的端口 17224,载荷十六进制前若干字节如下(示例数据,用于讲解字段位置,非实测抓包):

01 00 50 64 01 02 03 04 00 00 00 1A
00 01 E2 40 00 00 00 20 00 00 00 64
C0 A8 0A 0B C0 A8 0A 14 00 00 00 64
...

逐段读:前两字节 01 00 是版本号 1.0;50 64 是消息类型,PD 过程数据的典型取值;01 02 03 04 是 ComId,说明这帧属于编号 0x01020304 的数据通道;00 00 00 1A 是序列号 26,下一帧应为 27;00 01 E2 40 是时间戳;00 00 00 20 是数据集长度 32 字节,意味着头部之后还有 32 字节应用数据;00 00 00 64 是数据集标识 100,用来对照数据集结构定义;随后 8 字节是源/目的 IP,与 UDP 层地址应一致;最后 00 00 00 64 是生存时间,示例中为 100(单位依实现,常为 ms)。

这里有一个非常实用的校验动作:用 UDP 长度反推数据集长度。若 UDP 载荷总长为 72 字节,减去 40 字节头,应得 32 字节,与头部 DatasetLength 一致;若不一致,说明抓到了分片、头部被截断,或发送端长度字段填错。这个交叉验证能在几秒内排除大部分“看起来像 TRDP 但解析错位”的问题。

三、字段之间的联动关系

单看一个字段往往得不出结论,真正有价值的是字段组合。消息类型决定了解析路径:PD 数据周期性强,重点看序列号与 TTL;MD 消息数据是请求/应答式,重点看 ComId 配对与数据集长度是否随请求变化。ComId 与数据集标识共同锁定“这帧数据是什么结构”,前者是业务通道,后者是结构模板,二者对不上就说明配置表与实际上线版本不一致。

序列号与时间戳的组合用于判断链路健康:正常情况下序列号逐帧加一、时间戳单调递增;若序列号跳变而时间戳连续,多为中间节点丢帧;若两者同时停滞,则是发送端停止发布。TTL 则给出时效边界,接收端在 TTL 内未收到新帧就应判定数据失效,而不是继续沿用旧值——这一点在制动、门控等安全相关业务上尤其关键。

抓包实操建议:在 Wireshark 中为 TRDP 载荷添加自定义列,分别提取偏移 2 的消息类型、偏移 4 的 ComId、偏移 8 的序列号和偏移 16 的数据集长度。这样一屏就能同时看到“哪条业务、第几帧、多长”,比逐帧点开详情效率高得多。

四、把字段读成结论

头部解析的终点不是“认全字段”,而是能对一帧报文下判断。看到 ComId 属于某车门控制通道、消息类型为 PD、序列号连续、数据集长度与结构定义吻合、TTL 未超时,就可以判定这帧数据有效可用;反之,任何一项异常都应记录为待排查点,并回到发送端配置、网络链路或数据集定义中定位。掌握这套“字段—联动—结论”的读法,后续的丢帧分析、冗余切换判断和故障复现才有可靠的数据基础。