资讯动态

第二十三篇技术笔记:郭大侠学DoIP - 扒扒DoIP报文的“底裤”

发布时间:2026/10/19 6:15:19 来源:尧图企业网站定制
写在开篇上回说到郭靖尝到了搞清楚OBD硬件秘密的甜头——16个针脚各司其职Pin 8激活线像门铃一样唤醒车辆。那天回到家郭靖越想越觉得有意思。第二天又跑去找郎中。“郎中您上回说插上网线之后诊断仪和车之间要‘打个招呼’互相认识还说网关会给诊断仪发一张‘名片’。这张‘名片’到底长什么样能不能……能不能拆开看看”郎中笑了“郭大侠您这是要把DoIP的底裤都扒光啊”郭靖挠挠头“底裤啥底裤”郎中拿出一张纸“来来来今天我就带您扒光DoIP报文的底裤看看里面到底藏了啥。”郭靖正要凑过去看黄蓉不知从哪里冒了出来手里举着一串糖葫芦咬了一口慢悠悠地说“靖哥哥你连以太网帧都没学利索就开始扒人家底裤了”郭靖脸一红“蓉儿你别闹……我、我这不是在学嘛。”黄蓉嘻嘻一笑挨着他坐下把糖葫芦往他嘴边一递“行行行你学你的我就在旁边听着。看你今天能学出个什么花来。”郎中捋了捋胡子笑道“黄姑娘别急。降龙十八掌也不是一天练成的让郭大侠慢慢扒。”顿时屋内充满了丝丝尴尬、而又无拘无束的欢声笑语。那靖哥哥想学的到底是啥呢请往下看一、DoIP报文就是一封信郎中用笔在纸上画了一个信封的图“DoIP报文就是这种结构——8字节固定头部 可变长度的负载。头部告诉接收方‘这封信怎么读’负载才是真正要传的数据。”郭靖盯着图看了半天“那这8个字节里到底写了啥这就是您说的‘底裤’”郎中点头“对扒开这8个字节就看到了DoIP最核心的秘密。”黄蓉在一旁插嘴“靖哥哥你扒归扒别把人家信纸撕了。”郭靖憨憨一笑“不会不会我小心着扒。”二、DoIP头部——8字节的“底裤”郎中用笔写下这张表字节偏移012-34-7字段Protocol VersionInverse VersionPayload TypePayload Length长度1字节1字节2字节4字节说明DoIP协议版本号协议版本号按位取反最重要的字段告诉对方这是什么类型的消息后面负载的长度字节数“郭大侠您看这就是DoIP底裤的“标准4件套”——前两个字节用来验明正身中间两个字节告诉对方‘这封信是干啥的’最后四个字节说‘后面跟了多少数据’。”郭靖挠挠头“四个家伙各管一摊这设计还挺讲究。”黄蓉咬了一口糖葫芦含混不清地说“比你的降龙十八掌好学多了那还十八掌呢这才四个。”郭靖被她一激挺了挺胸“蓉儿你别激我我今儿非把这四个家伙搞明白不可”三、第一件Protocol Version——协议版本号“这个字段告诉对方‘我用的是哪个版本的DoIP协议’。”字节偏移0字段Protocol Version说明DoIP协议版本号0x01ISO 13400-2:2010第一版0x02ISO 13400-2:2012第二版0x03ISO 13400-2:2019当前最新版0xFF通配符用于兼容性处理“诊断仪和车辆通信时版本号要匹配。不匹配的话对方可能会拒绝搭理你。”黄蓉嘟囔“这不就跟咱俩吵架一样嘛——你说你的我说我的谁也听不懂谁。”郭靖愣了一下认真地点点头“蓉儿说得对得说同一种话才能聊到一块儿。”四、第二件Inverse Version——反向版本号郭靖挠挠头“这个‘反向版本’又是干啥的脱了裤子放屁”郎中笑了“郭大侠别急这玩意儿有妙用。”字节偏移1字段Inverse Version说明协议版本号按位取反计算方式Inverse Version ~Protocol Version示例Protocol Version 0x030000 0011→ Inverse Version 0xFC1111 1100校验规则前两个字节必须是取反关系如03 FC、02 FD、01 FE否则报文损坏或不是DoIP“这有啥用快速校验。接收方一看前两个字节如果不是取反关系说明这个包要么损坏了要么根本不是DoIP报文。这是一个轻量级的错误检测机制——不需要算复杂的校验看一眼就知道对不对。”郭靖一拍大腿眼睛亮得像铜铃“哦我懂了这不就跟咱们江湖上的‘对暗号’一个理儿吗接头之前先对切口——天王盖地虎宝塔镇河妖。对上号了是自己人对不上就有问题”郎中捋着胡子哈哈大笑“郭大侠这个比喻绝了Inverse Version就是DoIP的‘接头暗号’不用翻山越岭去验身份接头双方一眼就知道——‘嗯是自己人’”郭靖挠挠头意犹未尽地嘀咕“那要是暗号没对上……是不是就要动手了”郎中白了他一眼“对不上就直接扔了还动手以太网帧又不跟您打架。”黄蓉在一边笑得前仰后合“靖哥哥你这是学技术呢还是闯江湖呢”郭靖也是一脸憨憨的傻傻傻陪笑。五、第三件Payload Type——最重要的字段标个黄“这是DoIP头部最关键的字段。它告诉接收方‘这封信是干啥的’。”字节偏移2-3字段Payload Type说明消息类型决定负载的格式和含义Payload Type 速查表类型名称方向一句话说明0x0001车辆识别请求诊断仪→车“谁在”0x0002车辆识别请求带EID诊断仪→车“MAC地址是xxx的设备在吗”0x0003车辆识别请求带VIN诊断仪→车“VIN是xxx的车在吗”0x0004车辆识别响应车→诊断仪“我在这是我的名片”0x0005路由激活请求诊断仪→车“我要进门请开门”0x0006路由激活响应车→诊断仪“门开了请进”或“不行”0x0007在线检测请求双向“还在吗”保活0x0008在线检测响应双向“还在”0x8001诊断消息双向真正承载UDS诊断数据0x8002诊断消息远程双向用于远程诊断场景“注意看0x0001-0x00FF是管理类打招呼、进门、保活0x8000-0xFFFF是诊断类真正修车的数据。最高位是1表示‘这是诊断数据’。”黄蓉凑过来看了一眼眨眨眼“靖哥哥你看0x0004应该就是‘递名片’0x8001应该就是‘修车’。你别一上来就0x8001人家又不是我人家还没认识你呢。”郭靖被她说得一愣憨憨地笑了“蓉儿说得对得先递名片熟了才能修车。”郎中给黄蓉竖了个大拇指点了个大大的赞由衷的佩服郭夫人的聪明才智。六、第四件Payload Length——负载有多长“这个字段告诉对方‘后面跟着的数据有多长’单位是字节。”字节偏移4567字段Payload Length最高字节Payload LengthPayload LengthPayload Length最低字节说明4字节大端序整数表示负载长度Payload Length 取值示例值含义0x00000000没有负载比如车辆识别请求就是空壳0x00000021后面有33字节数据0xFFFFFFFF理论上最大4GB郭靖惊呼“4GB一个报文能发4GB”郎中笑了“理论上可以。但实际受网络限制一个以太网帧也就1500字节左右太大的数据会被自动拆成多个包发。”“那为什么要设计成4字节”“为了以后不后悔。固件刷写场景下几十MB的数据块传输4字节的上限确保未来20年不会被突破。这是设计的远见——给未来子孙留余地。”黄蓉捅了捅郭靖“靖哥哥你学学人家设计协议的降龙十八掌打完就没了人家还想着以后的事呢。”郭靖挠挠头“蓉儿你又取笑我……我这不是也在想着以后嘛以后我还要接着学”七、扒光之后——一个完整的报文长啥样郭靖问“郎中光说理论不过瘾您给我看个扒光了的例子呗。”郎中拿起笔写了一个车辆识别响应Type 0x0004的完整报文DoIP头部8字节字节偏移012-34-7字段Protocol VersionInverse VersionPayload TypePayload Length值0x030xFC0x00040x00000021说明版本3取反正确车辆识别响应33字节DoIP负载33字节字节偏移字段值说明8-24VIN搞车的都熟悉57 56 57 5A 5A 5A 33 43 5A 4A 45 58 58 58 58 58 58“WVWZZZ3CZJEXXXXXX”25-30EID00 11 22 33 44 55网关MAC地址记住31-36GID00 00 00 00 00 00全037Further Action0x00不需要认证38-39逻辑地址0x0E 0x01网关的门牌号一个逻辑地址代表着一个ECU郭靖盯着这堆数字看了半天突然兴奋地说“郎中我会读了”“前两个字节是0x03和0xFC——取反关系暗号对上了Payload Type是0x0004——这是‘车辆识别响应’车在递名片。负载长度是33字节。从第8字节开始是VIN……”郎中竖起大拇指“郭大侠会扒底裤了”黄蓉在一旁拍手“行啊靖哥哥今天没白来。不过你光会读有啥用你知道这VIN是谁的车吗”郭靖一愣“这……不、不知道啊。”郎中笑了“黄姑娘问得好下篇咱们就讲——IP地址和逻辑地址告诉你怎么找到这辆车、找到车上的ECU。”八、常见的Payload TypePayload Type名称备注0x0001车辆识别请求0x0004车辆识别响应0x0005路由激活请求0x0006路由激活响应0x0007在线检测请求0x0008在线检测响应0x8001诊断消息九、这些坑靖哥哥替你先踩了坑1以为“DoIP报文就是UDS诊断数据”。后来才搞明白DoIP有自己的“底裤”8字节头部UDS数据只是装在里面的“信纸”。坑2以为“Inverse Version是多余的”。后来才搞明白这是轻量级的“接头暗号”——接收方看一眼就知道这包是不是自己人。坑3以为“Payload Type可以随便填”。后来才搞明白填错了对方根本不认。就像寄信把“急件”填成“平邮”没人给你加急处理。坑4以为“负载长度最大1500字节”。后来才搞明白DoIP理论上支持4GB设计这么大是为了刷写场景。降龙十八掌也不是一天练成的协议设计也不是一天定死的。坑5以为“0x8001和其他诊断类可以混用”。后来才搞明白0x8001是标准诊断消息0x8002是远程诊断。不能张冠李戴。十、下步目标DoIP报文的“底裤”扒光了——8个字节、4个字段、Payload Type的分类。郭靖点点头“郎中我现在能读懂DoIP报文了。那IP地址又是咋来的诊断仪和车上的网关IP是提前配好的吗”郎中笑了笑“郭大侠问得好这个问题我们下一篇讲——IP地址的分配机制。”黄蓉把糖葫芦棍儿往桌上一扔站起来伸了个懒腰“行啦靖哥哥今天扒了一天的底裤也该给人家穿回去了。明天再学IP地址的事儿。”郭靖憨憨一笑“蓉儿说得对降龙十八掌也不是一天练成的DoIP也不是一天能学完的。明天继续”于是夫妻两开心的开着国产智能网联新车幸福地回家喽十一、写在最后这一篇最大的收获DoIP报文像一封信——8字节的“底裤”头部加上可变长度的“信纸”负载。头部最重要的字段是Payload Type它告诉对方“这封信是干啥的”0x0004是名片、0x0005是进门请求、0x8001是正经诊断数据。Inverse Version就是DoIP的“接头暗号”——不需要复杂计算接头双方看一眼就知道是不是自己人。郭靖感叹原来DoIP的底裤就这么点东西——8字节四字段扒光了也就这么回事。但就是这8个字节撑起了整个DoIP协议的分类和识别但心里似乎终究还是有点明白的不透。黄蓉临走时回头补了一句“靖哥哥明天别忘了——给DoIP穿上衣服讲IP地址。”郭靖挠挠头“蓉儿放心明儿我接着扒……哦不接着穿。”哈哈哈桃花岛上扬起了快乐的笑声。打完收工886。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑