我的汽车进步之路-UDS诊断-ISO 13400

ISO 13400 是国际标准化组织制定的车载以太网诊断通信标准 ,全称 Road vehicles --- Diagnostic communication over Internet Protocol (DoIP),即 "基于互联网协议的诊断通信"。它将传统的 UDS 诊断服务从 CAN 总线迁移到了 TCP/IP 以太网上,是现代智能网联汽车诊断架构的核心协议。

一、标准体系结构

ISO 13400 由多个部分组成,覆盖从物理接口到协议规范再到一致性测试的完整体系:

标准编号 名称 核心内容
ISO 13400-1 通用信息与用例定义 术语定义、架构概述、应用场景、用例说明
ISO 13400-2 传输协议与网络层服务 核心协议规范:报文格式、消息类型、通信流程、时序参数、TLS 安全
ISO 13400-3 基于 IEEE 802.3 的有线车辆接口 物理层规范、连接器要求、电气特性
ISO 13400-4 以太网诊断连接器 诊断接口的机械与电气规范
ISO 13400-5 一致性测试规范 协议符合性测试用例与验证方法

版本演进 :目前主流版本为 ISO 13400-2:2019(第三版,协议版本号 0x03),2025 年已发布新版修订。早期 2012 版对应协议版本号 0x02,仍有大量量产车在使用。

二、协议栈与分层架构

DoIP 并非独立的完整协议栈,而是运行在标准 TCP/IP 之上的应用层协议,向下承载于车载以太网,向上封装 UDS 诊断服务。

2.1 完整分层模型

OSI 层级 协议 / 标准 说明
应用层 DoIP (ISO 13400-2) + UDS (ISO 14229) 诊断报文封装与解析
传输层 TCP / UDP TCP 用于可靠诊断会话;UDP 用于车辆发现广播
网络层 IPv4 / IPv6 IP 寻址与路由
数据链路层 Ethernet II (IEEE 802.3) MAC 帧封装
物理层 100BASE-T1 / 1000BASE-T 车载以太网物理介质

2.2 关键端口号

  • UDP 端口 13400:车辆发现(Vehicle Discovery)、车辆声明广播
  • TCP 端口 13400:路由激活、诊断数据传输、心跳保活
  • TCP 端口 3496:TLS 加密的安全诊断会话(可选)

三、DoIP 报文格式详解

所有 DoIP 报文都以 8 字节固定通用首部 开头,后续跟随可变长度的负载数据。

3.1 通用首部结构(8 字节,大端序)

字段 长度 (字节) 偏移 说明
Protocol Version 1 0 协议版本号:0x02=2012 版,0x03=2019 版
Inverse Protocol Version 1 1 协议版本按位取反,用于格式校验。例如版本0x02对应0xFD
Payload Type 2 2 负载类型,决定后续数据的语义与格式
Payload Length 4 4 后续负载数据的字节长度(不含首部本身)

设计意图 :反向版本字段是一种简单的完整性校验机制 ------ 接收方若发现 Protocol Version ^ Inverse Protocol Version != 0xFF,则直接丢弃报文并返回首部否定响应,避免解析错乱数据。

3.2 Payload Type 分类与取值

负载类型共分为三大类,高字节体现类别特征:

第一类:节点管理类(0x00xx)

取值 名称 传输层 强制性 功能说明
0x0000 通用首部否定响应 TCP/UDP 强制 首部格式错误时的应答
0x0001 车辆识别请求 UDP 强制 诊断仪广播查询车辆
0x0002 车辆识别响应 UDP 强制 车辆回复自身标识信息
0x0003 带 VIN 的车辆识别请求 UDP 强制 指定 VIN 查询特定车辆
0x0004 带 EID 的车辆识别请求 UDP 可选 指定实体 ID 查询
0x0005 路由激活请求 TCP 强制 申请建立诊断路由通道
0x0006 路由激活响应 TCP 强制 回复激活结果与参数
0x0007 存活检查请求 TCP 强制 心跳保活探测
0x0008 存活检查响应 TCP 强制 心跳应答

第二类:车辆信息类(0x40xx)

取值 名称 传输层 强制性 功能说明
0x4001 DoIP 实体状态请求 UDP 可选 查询 DoIP 节点状态
0x4002 DoIP 实体状态响应 UDP 可选 返回节点状态信息
0x4003 诊断电源模式请求 UDP 强制 查询车辆诊断电源状态
0x4004 诊断电源模式响应 UDP 强制 返回当前电源模式

第三类:诊断报文类(0x80xx)

取值 名称 传输层 强制性 功能说明
0x8001 诊断消息 TCP 强制 承载 UDS 诊断请求 / 响应数据
0x8002 诊断消息肯定应答 TCP 强制 诊断消息已接收确认
0x8003 诊断消息否定应答 TCP 强制 诊断消息接收失败反馈

3.3 诊断消息(0x8001)负载结构

这是最常用的报文类型,用于封装 UDS 数据:

复制代码
+---------------------+
|  DoIP Header (8B)   |  Payload Type = 0x8001
+---------------------+
|  Source Address (2B)|  源逻辑地址(诊断仪侧)
+---------------------+
|  Target Address (2B)|  目标逻辑地址(ECU侧)
+---------------------+
|                     |
|   UDS Payload (N)   |  ISO 14229 诊断服务数据
|                     |
+---------------------+

逻辑地址 :2 字节的寻址空间,沿用了 ISO 15765 的诊断地址体系。例如物理寻址 0x1716 指向某个 ECU,功能寻址 0x17DF 广播到多个 ECU。

四、核心通信机制与完整流程

一次完整的 DoIP 诊断会话分为三个阶段:车辆发现 → 路由激活 → 诊断数据传输。

4.1 第一阶段:车辆发现(Vehicle Discovery)

目标:诊断仪找到网络中的车辆,获取其 IP 地址、VIN、EID 等标识信息。

两种触发方式

  1. 车辆主动声明:车辆上电 / 网线接入后,通过 UDP 广播连续发送 3 次车辆声明消息(间隔 500ms)
  2. 诊断仪主动查询 :诊断仪发送 UDP 广播请求(0x0001),车辆单播回复

车辆识别响应包含的核心信息

  • VIN 码(17 字节)
  • Logical Address(2 字节,DoIP 网关自身地址)
  • EID(Entity ID,6 字节,通常为 MAC 地址)
  • GID(Group ID,6 字节,用于多 DoIP 节点同步)
  • 进一步动作所需的配置信息

4.2 第二阶段:路由激活(Routing Activation)

目标:在诊断仪与 DoIP 网关之间建立专属 TCP 逻辑连接,申请诊断路由权限。

交互流程

  1. 诊断仪向车辆 TCP 13400 端口发起连接
  2. 诊断仪发送 路由激活请求(0x0005) ,携带:
    • 源逻辑地址(诊断仪地址,通常 0x0E80 / 0x0F00
    • 激活类型(0x00= 默认诊断,0x01=WWH-OBD 等)
    • 可选:ISO/SAE 预留字段、厂商自定义字段
  3. 网关校验地址权限与当前状态,回复 路由激活响应(0x0006) ,包含:
    • 目标逻辑地址(网关地址)
    • 响应码(0x00= 成功,其他为错误码)
    • 通信参数(最大数据长度等)

为什么需要路由激活? 这是 DoIP 的安全闸门 ------ 不是连上 TCP 就能发诊断。网关通过逻辑地址识别客户端身份,控制并发连接数(通常最多同时支持 2-3 个诊断会话),并为该会话分配车内总线路由资源。

4.3 第三阶段:诊断数据传输

路由激活成功后,即可通过 0x8001 诊断消息报文传输 UDS 服务数据:

复制代码
诊断仪 → DoIP网关 → 车内CAN/LIN总线 → 目标ECU

关键特点

  • DoIP 本身只负责 "运输",不解析 UDS 内容
  • 网关完成协议转换:DoIP ↔ CAN TP (ISO 15765)
  • 支持长报文传输,无需像 CAN 那样多帧拆包(DoIP 单帧最大可达约 4GB)
  • 诊断消息应答(0x8002/0x8003)是 DoIP 层的确认,不等同于 UDS 响应

4.4 连接保活:Alive Check 机制

  • 诊断仪定期发送 存活检查请求(0x0007)
  • 网关立即回复 存活检查响应(0x0008)
  • 超时时间:通常 5 秒无通信则触发检查,超时未响应视为连接断开
  • 作用:检测 TCP 半连接状态,释放无效会话资源

五、逻辑地址寻址体系

DoIP 继承了车载诊断领域成熟的逻辑地址(Logical Address)体系,与 CAN 诊断的 N_AI 寻址概念对应:

5.1 地址分配规则

  • 2 字节长度,共 65536 个地址空间
  • 高字节通常代表域 / 系统,低字节代表具体 ECU
  • 例如:0x17xx 动力域,0x18xx 车身域,0x19xx 底盘域

5.2 特殊地址

地址范围 含义 说明
0x0000 无效地址 保留
0x0E80 / 0x0F00 外部诊断设备 诊断仪常用源地址
0x17DF / 0x18DF 功能寻址 广播到域内所有 ECU
0xFFFF 全局功能寻址 全车广播

六、DoIP vs CAN 诊断:核心差异

维度 UDS over CAN (ISO 15765) UDS over DoIP (ISO 13400)
物理介质 CAN 总线双绞线 以太网双绞线
传输速率 500Kbps / 2Mbps (CAN FD) 100Mbps / 1Gbps
寻址方式 CAN ID 寻址 IP 地址 + 逻辑地址
连接模型 总线式,无连接 点对点 TCP 有连接
单帧数据量 8 字节 (CAN) / 64 字节 (CAN FD) 理论最大 4GB
传输层流控 ISO 15765-2 TP 层流控 TCP 原生滑动窗口
网络拓扑 总线型 星型 / 交换型
典型耗时 (刷写 1MB) 约 10~30 秒 约 1~3 秒
远程诊断 需专用网关转换 原生支持 IP 路由

七、安全机制:TLS 安全会话

ISO 13400-2:2019 正式纳入了 TLS 1.2+ 安全传输规范:

7.1 两种会话模式

  1. 非安全会话:TCP 13400 端口,明文传输,用于产线、售后等受控环境
  2. 安全会话:TCP 3496 端口,TLS 加密,用于远程诊断、云端连接

7.2 安全特性

  • 基于 X.509 证书的双向身份认证
  • 数据加密与完整性校验
  • 防止中间人攻击与报文篡改
  • 符合 UNECE R155 网络安全法规要求

八、典型应用场景

  1. EOL 下线检测:产线末端快速全车扫描与标定,高带宽提升节拍
  2. 售后诊断:4S 店诊断仪通过 OBD 以太网接口连接车辆
  3. OTA 升级:大流量固件刷写,DoIP 是车内以太网刷写的标准通道
  4. 远程诊断:通过 T-BOX/5G 网关实现云端远程故障读取
  5. 多 ECU 并行诊断:以太网交换架构支持同时与多个 ECU 建立诊断会话

九、报文实例解析

以一条典型的 UDS 诊断请求为例,完整报文十六进制如下:

复制代码
02 FD 80 01 00 00 00 07  0E 80 17 16 22 F1 13

逐字段拆解:
02 --- Protocol Version = 0x02(2012 版)
FD --- Inverse Version = 0xFD(0x02 取反)
80 01 --- Payload Type = 0x8001(诊断消息)
00 00 00 07 --- Payload Length = 7 字节
0E 80 --- 源地址 = 0x0E80(诊断仪)
17 16 --- 目标地址 = 0x1716(某动力域 ECU)
22 F1 13 --- UDS 服务:22 服务(读取数据标识符),DID = F113

补充:

一、路由激活:状态机与全量响应码

路由激活是 DoIP 的核心准入机制,本质是一个有状态的连接授权流程,而非简单的一问一答。

1.1 网关侧连接状态机

DoIP 网关对每一条 TCP 连接维护独立的状态机,共 5 种核心状态:

状态 说明 允许的操作
S0: 初始监听态 TCP 端口 13400 处于监听,尚未建立连接 接受 TCP 三次握手
S1: 连接已建立 TCP 连接成功,但未发送路由激活请求 仅接收路由激活请求;其他 DoIP 报文直接丢弃
S2: 激活验证中 已收到激活请求,网关正在校验权限与资源 不接收新的诊断报文
S3: 会话已激活 路由激活成功,会话正式生效 可传输诊断消息、心跳保活
S4: 连接断开 会话超时 / 主动关闭 / 异常中断 释放资源,回到 S0
状态流转规则
  1. TCP 三次握手成功 → S0 → S1
  2. 收到路由激活请求 → S1 → S2
  3. 校验通过返回成功响应 → S2 → S3
  4. 校验失败返回否定响应 → S2 → S4(网关主动断开 TCP)
  5. S1 状态下 TCP_Initial_Timeout(默认 5s)内未收到激活请求 → 网关主动断开 → S0
  6. S3 状态下 TCP_General_Timeout(默认 5s)无任何报文 → 触发存活检查;再超时则断开 → S0

1.2 路由激活响应码全解

路由激活响应(0x0006)中的 1 字节响应码,是排查连接问题的核心依据:

响应码 名称 含义 后续行为
0x00 激活成功 源地址合法、资源充足,会话建立 进入激活态,可传输诊断数据
0x01 不支持的激活类型 请求的激活类型(如 WWH-OBD)本网关不支持 拒绝激活,断开连接
0x02 未知源地址 请求中的源逻辑地址不在网关授权列表内 拒绝激活,断开连接
0x03 源地址已占用 该源地址已被另一条 TCP 会话占用 拒绝激活,断开连接
0x04 激活认证失败 需要身份认证的场景下校验未通过 拒绝激活,断开连接
0x05 要求 TLS 安全会话 该诊断权限必须通过 TLS 加密通道访问 拒绝激活,提示客户端切换到 3496 端口
0x06 达到最大并发数 网关同时支持的诊断会话数已达上限 拒绝激活,断开连接
0x07 源地址不匹配 已建立会话的源地址与请求地址冲突 拒绝激活,断开连接
0x08 ~ 0xFF 保留 / 厂商自定义 预留扩展空间 依厂商定义处理

关键规则 :一条 TCP 连接只能对应一个源逻辑地址 ;一个源逻辑地址不能同时存在于多条 TCP 连接中。这是 DoIP 会话隔离与权限控制的核心设计。

1.3 并发会话管理

量产车载 DoIP 网关通常支持 2~4 条并发激活会话,遵循以下规则:

  • 不同源地址的会话相互隔离,诊断数据互不干扰
  • 同一条 TCP 连接上不允许多次路由激活
  • 会话断开后,源地址资源立即释放,可被新连接复用
  • 厂商可配置高优先级地址(如产线设备)具备抢占权限

二、全量错误码与否定响应体系

DoIP 定义了三层否定响应机制,分别对应首部校验、节点管理、诊断传输三个层级。

2.1 通用首部否定响应(0x0000

这是最底层的格式校验失败响应。只要 8 字节首部本身不合法,网关就会直接回复此报文,不解析后续负载。

触发场景与对应错误码

响应报文中包含 1 字节否定代码,共 6 种标准错误:

错误码 名称 触发条件
0x00 不正确的报文模式 反向版本号校验失败(版本与反版本异或不为 0xFF)
0x01 不支持的协议版本 收到的协议版本号(如 0x04)本节点不支持
0x02 无法识别的负载类型 Payload Type 取值不在标准 / 厂商支持范围内
0x03 消息长度过大 Payload Length 超过节点最大接收缓冲区长度
0x04 接收缓冲区溢出 接收速率过快,缓冲区已满,丢弃当前报文
0x05 无效的源地址 诊断消息中的源地址与已激活的会话地址不匹配

设计细节 :首部否定响应本身也包含 8 字节标准首部 + 1 字节错误码,接收方可以通过解析首部反向确认错误类型。

2.2 诊断消息层否定应答(0x8003

当首部校验通过、会话也已激活,但诊断消息本身无法转发 时,网关回复 0x8003 诊断消息否定应答。

否定码 含义
0x00 无效的目标地址
0x01 目标地址不可达(ECU 未上电 / 总线休眠)
0x02 车内总线发送超时
0x03 超出最大数据长度
0x04 超出当前会话的报文发送配额

注意:0x8002 肯定应答只代表网关已经收到并准备转发,不代表目标 ECU 已经收到并执行;最终的执行结果仍由 UDS 响应体现。

三、TLS 安全会话:握手流程与车载落地

ISO 13400-2:2019 正式将 TLS 纳入强制可选规范,是满足 UN R155 网络安全法规的核心技术手段。

3.1 安全会话基础架构

  • 监听端口:TCP 3496(安全诊断端口)
  • TLS 版本:最低 TLS 1.2,推荐 TLS 1.3
  • 认证模式 :强制双向证书认证(客户端与服务端互相验证身份)
  • 加密套件:仅允许使用车载安全规范批准的算法(如 ECDHE-ECDSA-AES128-GCM-SHA256)

3.2 完整安全诊断会话建立流程

复制代码
1. TCP 三次握手(端口 3496)
        ↓
2. TLS 握手阶段
   ├─ Client Hello:客户端支持的密码套件、TLS版本
   ├─ Server Hello:选定密码套件、发送服务器证书
   ├─ Server Certificate:网关侧X.509证书(由车厂根证书签发)
   ├─ Server Hello Done
   ├─ Client Certificate:诊断仪侧证书(由OEM授权签发)
   ├─ Client Key Exchange:协商会话密钥
   ├─ Change Cipher Spec:双方切换到加密模式
   └─ Finished:握手完成
        ↓
3. DoIP 路由激活(加密通道内传输)
        ↓
4. 加密的 UDS 诊断数据传输
        ↓
5. 会话断开:TLS Close Notify → TCP FIN

3.3 车载场景的特殊设计

  1. 证书链管理

    • 网关内置车厂根证书,用于验证诊断仪证书的合法性
    • 诊断仪证书与源逻辑地址绑定,防止地址冒用
    • 支持证书吊销列表(CRL)与在线证书状态查询(OCSP)
  2. 与路由激活的联动

    • 若客户端在明文端口(13400)请求高权限诊断,网关可返回 0x05 错误码,强制引导至 TLS 端口
    • TLS 握手失败不允许发送任何 DoIP 报文
  3. 性能优化

    • 支持 TLS 会话复用(Session Resumption),二次连接跳过完整握手
    • 产线等高频场景可配置会话 Ticket,提升连接效率

四、DoIP 网关内部架构与报文转发全链路

DoIP 网关是车内诊断网络的核心枢纽,对外连接以太网诊断接口,对内连接 CAN/CAN FD/LIN 等车内总线。

4.1 分层软件架构

复制代码
┌─────────────────────────────────┐
│   诊断应用层(UDS 路由策略)      │  寻址映射、权限控制、会话管理
├─────────────────────────────────┤
│   DoIP 协议层                    │  首部解析、状态机、心跳、TLS
├─────────────────────────────────┤
│   TCP/IP 协议栈                  │  TCP/UDP/IP、Socket 连接管理
├─────────────────────────────────┤
│   以太网 MAC/PHY                 │  100BASE-T1 物理层驱动
└─────────────────────────────────┘
          ↓↑  协议转换
┌─────────────────────────────────┐
│   CAN TP / LIN TP 传输层         │  ISO 15765-2 多帧传输
├─────────────────────────────────┤
│   CAN/LIN 控制器驱动              │  总线收发、中断处理
└─────────────────────────────────┘

4.2 入站转发全流程(诊断仪 → 车内 ECU)

  1. 以太网接收:PHY 接收以太网帧,MAC 层校验后上交 TCP/IP 栈
  2. DoIP 首部校验:检查版本、反版本、负载类型、长度合法性;不合法则回复首部 NACK
  3. 会话状态校验:确认 TCP 连接已完成路由激活,源地址匹配
  4. 逻辑地址解析:根据目标逻辑地址查询路由表,映射到对应的车内总线通道与 CAN ID
  5. UDS 数据提取:剥离 DoIP 首部,取出纯 UDS 载荷
  6. CAN TP 封装:将 UDS 数据按 ISO 15765-2 拆分为单帧 / 多帧 CAN 报文
  7. 总线发送:通过 CAN 控制器发送到目标总线,同时启动超时计时
  8. DoIP 应答回复 :网关成功入队后,立即向诊断仪回复 0x8002 诊断肯定应答

4.3 出站转发全流程(车内 ECU → 诊断仪)

  1. 总线接收:CAN 控制器收到诊断响应报文,提交 CAN TP 层
  2. CAN TP 重组:将多帧 CAN 报文重组为完整的 UDS 响应数据
  3. 会话匹配:根据源地址查找对应的 DoIP 会话与 TCP 连接
  4. DoIP 封装 :添加 8 字节 DoIP 首部,填充源 / 目标地址,设置 0x8001 类型
  5. TCP 发送:通过已建立的 TCP 连接发送给诊断仪

4.4 网关核心内部表项

  • 逻辑地址路由表:逻辑地址 ↔ 总线通道 + 目标 CAN ID
  • 会话管理表:TCP 连接句柄 ↔ 源地址 ↔ 激活状态 ↔ 超时计时器
  • 权限配置表:源地址 ↔ 允许访问的目标地址范围、允许的服务等级
  • 电源状态表:各域 / ECU 的电源状态,决定目标地址是否可达

五、核心时序参数与保活机制

ISO 13400-2 定义了严格的时序要求,量产实现必须合规:

参数名称 默认值 作用
TCP_Initial_Timeout 5 s TCP 连接建立后,未收到路由激活的超时断开时间
TCP_General_Timeout 5 s 激活会话中,无任何报文交互的超时阈值
DoIP_Control_Timeout 2 s 控制类报文(如路由激活请求)的响应超时时间
Vehicle_Discovery_Interval 500 ms 车辆上电后连续广播车辆声明的间隔
Vehicle_Discovery_Count 3 次 上电后连续发送车辆声明的次数
Diagnostic_Message_Timeout 5 s 诊断消息转发的最大等待超时

存活检查(Alive Check)工作机制

  1. TCP_General_Timeout 内无数据交互,诊断仪主动发送 0x0007 存活检查请求
  2. 网关必须在 DoIP_Control_Timeout 内回复 0x0008 存活检查响应
  3. 若连续多次无响应,诊断仪判定连接中断,关闭 TCP 套接字
  4. 该机制用于检测 TCP 半连接(网线被拔出、对方异常断电)场景

六、车辆发现与诊断电源模式深层逻辑

6.1 车辆发现的两种工作模式

模式 A:车辆主动声明(Vehicle Announcement)
  • 触发条件:车辆上电、以太网链路激活、DoIP 节点初始化完成
  • 行为:向 UDP 13400 端口广播 3 次车辆识别响应报文
  • 目的:让网络上的诊断仪快速感知车辆上线
模式 B:诊断仪主动探测(Vehicle Identification Request)
  • 触发条件:诊断仪上线,需要查找网络中的车辆
  • 行为:向 UDP 13400 发送广播查询(0x0001
  • 细分类型:
    • 通用查询:所有 DoIP 节点都回复
    • 按 VIN 查询:仅匹配 VIN 的车辆回复
    • 按 EID 查询:仅匹配实体 ID 的节点回复

EID 与 GID 的作用

  • EID(Entity ID):6 字节,DoIP 节点的唯一标识,通常使用 MAC 地址
  • GID(Group ID):6 字节,同一车辆内多个 DoIP 节点的分组标识,用于多网关协同

6.2 诊断电源模式

DoIP 定义了独立的电源模式查询机制(0x4003/0x4004),诊断仪在建立连接前可先查询车辆是否处于可诊断状态:

电源模式码 含义
0x00 未就绪,诊断电源未接通
0x01 就绪,可进行诊断
0x02 仅支持 DoIP 节点本身诊断,车内总线未激活