当前位置: 首页 > news >正文

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

写在开篇:

上回说到,郭靖尝到了搞清楚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 = 0x03(0000 0011)→ Inverse Version = 0xFC(1111 1100
校验规则前两个字节必须是取反关系(如03 FC02 FD01 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全0
37Further Action0x00不需要认证
38-39逻辑地址0x0E 0x01网关的门牌号(一个逻辑地址代表着一个ECU)

郭靖盯着这堆数字看了半天,突然兴奋地说:“郎中,我会读了!”

“前两个字节是0x030xFC——取反关系,暗号对上了!Payload Type是0x0004——这是‘车辆识别响应’,车在递名片。负载长度是33字节。从第8字节开始是VIN……”

郎中竖起大拇指:“郭大侠会扒底裤了!”

黄蓉在一旁拍手:“行啊靖哥哥,今天没白来。不过你光会读有啥用,你知道这VIN是谁的车吗?”

郭靖一愣:“这……不、不知道啊。”

郎中笑了:“黄姑娘问得好!下篇咱们就讲——IP地址和逻辑地址,告诉你怎么找到这辆车、找到车上的ECU。”

八、常见的Payload Type

Payload 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。

http://www.jsqmd.com/news/710841/

相关文章:

  • EvidenceLoop框架:解决RAG多跳推理难题的创新方案
  • Kettle 9.4 源码编译踩坑记:从JDK版本冲突到成功打包的完整复盘
  • 影刀RPA如何实现店群自动化:告别单体臃肿,构建基于插件化架构与动态热更新的高并发引擎
  • 告别盲猜!用示波器实测福特/通用OBD波形,手把手解析J1850 PWM与VPW协议差异
  • 如何用CATS进行API负向测试?从入门到精通的完整教程
  • WCF webHttpBinding is open for web browser and wpf
  • LLM工具调用面试篇4
  • Box86深度解析:ARM架构上的x86用户空间模拟器技术实现机制
  • 英语单词发音MP3音频批量下载方案:构建海量语音库的技术实现
  • 突破QQ音乐限制:高效QMCFLAC转MP3完整指南
  • HCLA第五次作业
  • 深度解析:如何通过三层架构设计实现Cursor Pro功能的技术实现方案
  • 5分钟解锁Windows桌面新美学:用TranslucentTB打造你的专属透明任务栏
  • 山东大学软件学院项目实训-基于语言大模型的智能居家养老健康守护系统-个人博客(三)
  • 5分钟搞定!魔兽争霸III WarcraftHelper插件完全指南:解锁300帧+宽屏完美体验
  • 告别调参玄学:用PANNs预训练模型搞定音频分类,附AudioSet实战代码
  • 第八届智源大会即将在6月12日-13日正式开启
  • SeanLib系列函数库-W25QXX
  • 从LeetCode到真实项目:DAG(有向无环图)在任务调度和依赖管理中的实战避坑指南
  • 人工海马网络(AHN)架构解析与长序列处理优化
  • 写给Ivy(我自己你信吗:))啊······
  • Bibata Gruvbox Yellow光标主题:Linux桌面美化与视觉统一方案
  • 2026降AI率工具实测:AI占比90%也能稳降到个位数
  • 终极指南:用Ryujinx模拟器在电脑上免费畅玩Switch游戏的完整攻略
  • Java 基础(十一)反射
  • SILENTTRINITY:基于Python异步架构的现代C2渗透测试框架解析
  • Windows电脑终极指南:如何用APK安装器直接运行安卓应用
  • 【Python】错误和异常
  • 亲测5款论文降AI工具:AIGC疑似度从90%降到4%实用指南
  • LycheeMemory:高效处理长上下文任务的创新解决方案