UDS基础回顾:OSI模型中的诊断层、UDS服务分类、诊断会话与安全访问的简要介绍

在深入探讨功能寻址与物理寻址之前,必须先夯实UDS(Unified Diagnostic Services,统一诊断服务)的基础框架。UDS并非孤立存在的协议,它建立在ISO/OSI七层模型之上,并明确规定了诊断应用层(第7层)的交互规则。同时,UDS服务的分类方式、诊断会话的状态管理以及安全访问的解锁机制,共同构成了理解寻址模式的前提。本章将系统梳理这四个核心基础模块,帮助读者建立完整的知识坐标系,为后续分析功能寻址与物理寻址的差异打下坚实的理论基础。

UDS基础框架总览 OSI七层模型 第7层:应用层(UDS) 第6层:表示层 第5层:会话层 第4层:传输层 第3层:网络层 第2层:数据链路层 第1层:物理层 UDS核心基础模块 UDS服务分类 • 诊断控制类(0x10/0x11/0x28) • 数据读取类(0x22/0x23/0x27) • 数据写入类(0x2E/0x2F/0x31) • 例程控制类(0x31/0x34/0x36) • 上传下载类(0x34/0x36/0x37) 诊断会话管理 • 默认会话(0x01) • 编程会话(0x02) • 扩展会话(0x03) • 安全系统诊断(0x04) • 会话切换条件与超时 安全访问机制 • 请求种子(0x27 01) • 发送密钥(0x27 02) • 安全等级划分(0-7级) • 延时计数与锁定策略 • 密钥算法(AES/自定义) • 会话内有效时间窗口 寻址模式(本章核心) • 物理寻址(点对点) • 功能寻址(一对多) • 请求/响应ID分配 • 寻址与网络拓扑关系 • 诊断仪与ECU交互模型 • 多ECU并行诊断策略 诊断层位于OSI第7层,通过CAN/以太网等传输层承载,服务分类与会话管理是寻址模式的基础 ISO 14229-1 | ISO 15765-2 | 诊断会话与安全访问共同约束寻址行为

2.1 OSI模型中的诊断层定位

核心原理:诊断层在协议栈中的位置

UDS协议(ISO 14229-1)明确将诊断功能定义在OSI模型的应用层(第7层),但实际工程实现中,诊断层并非孤立存在,而是与传输层、网络层、数据链路层紧密耦合。在CAN总线上,UDS报文通过ISO 15765-2(DoCAN)协议进行分段传输和重组;在以太网环境下,则通过DoIP(Diagnostic over IP,基于TCP/IP的汽车诊断协议)承载。诊断层本身只负责定义服务ID(SID)、子功能、参数格式和响应规则,而底层传输的可靠性、时序要求、网络层寻址则由下层协议保证。

从软件架构角度看,诊断层通常被封装为独立的诊断栈(Diagnostic Stack),包含三个核心子模块:诊断服务处理模块(解析请求、执行服务、生成响应)、会话与安全状态管理模块(维护当前会话模式、安全等级、访问权限)、底层传输适配模块(将诊断PDU映射到CAN帧或以太网报文)。这种分层设计使得诊断逻辑与物理传输解耦,便于在不同总线类型间移植。

判断方法:如何识别诊断层与传输层的边界

在实际开发中,工程师常混淆诊断层与传输层的职责。判断标准如下:

  • 诊断层(应用层):关注"做什么"——读取哪个DID、执行哪个例程、写入什么数据。报文格式为SID + Sub-function + 参数。
  • 传输层(网络层/传输层):关注"怎么传"——如何分段、如何重组、如何确认、如何处理超时。CAN上表现为单帧/多帧(FF/CF)、流控帧(FC);以太网上表现为TCP端口号(默认13400)和UDP发现机制。
  • 数据链路层:关注"物理传输"——CAN ID分配、DLC长度、位填充、CRC校验。
经验提醒:在CAN诊断开发中,物理寻址和功能寻址的差异主要体现在网络层(ISO 15765-2)的CAN ID分配上,而非应用层。诊断层只感知"请求发送给谁"和"响应来自谁",而底层通过不同的CAN ID(如物理请求ID 0x7E0、功能请求ID 0x7DF)来实现寻址。理解这一分层关系,是后续掌握寻址模式的关键。

案例拆解:CAN诊断报文的分层解析

以读取ECU软件版本号(DID 0xF190)为例,完整报文链路如下:

OSI层 内容 说明
应用层(UDS) 0x22 0xF1 0x90 SID=0x22(ReadDataByIdentifier),DID=0xF190
网络层(ISO 15765-2) 单帧:0x03 0x22 0xF1 0x90 PCI字节0x03表示后续3字节数据,单帧传输
数据链路层(CAN) CAN ID=0x7E0,DLC=8,数据=0x03 0x22 0xF1 0x90 0x00 0x00 0x00 0x00 物理寻址请求ID 0x7E0(诊断仪→ECU)

响应报文则使用ECU的物理响应ID(如0x7E8),数据为0x06 0x62 0xF1 0x90 0x01 0x02 0x03(表示版本号1.2.3)。整个过程中,诊断层只处理0x22和0x62的语义,而CAN ID的分配和过滤由网络层和数据链路层完成。

常见误区与总结复盘

风险提示:初学者常误以为UDS协议只运行在CAN总线上。实际上,UDS同样支持LIN(ISO 17987)、FlexRay(ISO 10681)、以太网(DoIP)等传输介质。不同传输层对寻址模式的支持能力不同——例如LIN总线通常只支持物理寻址(因为一个LIN网络只有一个主节点和有限从节点),而CAN和以太网天然支持功能寻址。在设计诊断方案时,必须根据总线类型选择合理的寻址策略。

总结:诊断层位于OSI第7层,其核心职责是定义服务语义和交互规则;底层传输负责寻址、分段、可靠性保障。理解分层边界,是掌握UDS寻址模式的第一步。

2.2 UDS服务分类

核心原理:六大服务功能组

ISO 14229-1将UDS服务划分为六大功能组,每个功能组包含若干具体服务ID(SID)。这种分类方式不仅便于协议学习和实现,也直接影响了寻址模式的选择——某些服务天然适合功能寻址(如例程控制、输入输出控制),而另一些服务则必须使用物理寻址(如安全访问、写入数据)。

功能组 服务ID范围 典型服务 适用寻址模式
诊断控制类 0x10-0x3E 0x10(诊断会话控制)、0x11(ECU复位)、0x28(通信控制) 物理+功能
数据读取类 0x22-0x27 0x22(按ID读数据)、0x23(按地址读内存)、0x27(安全访问) 物理为主
数据写入类 0x2E-0x2F 0x2E(按ID写数据)、0x2F(输入输出控制) 物理为主
例程控制类 0x31-0x37 0x31(例程控制)、0x34(请求下载)、0x36(传输数据)、0x37(请求上传) 物理+功能
上传下载类 0x34-0x37 0x34(请求下载)、0x35(请求上传)、0x36(传输数据)、0x37(请求传输退出) 物理为主
其他服务 0x3E-0x85 0x3E(测试仪在线)、0x83(访问时间参数)、0x85(控制DTC设置) 物理+功能

判断方法:根据服务特性选择寻址模式

服务分类对寻址模式选择的指导原则如下:

  1. 广播型服务(如0x10切换会话、0x11复位、0x28通信控制)——适合功能寻址,可同时唤醒/控制多个ECU。
  2. 点对点服务(如0x27安全访问、0x2E写数据、0x34下载请求)——必须使用物理寻址,因为涉及安全校验和独立数据通道。
  3. 混合型服务(如0x22读数据、0x31例程控制)——根据具体场景选择:若需读取多个ECU的相同DID,可用功能寻址;若需读取特定ECU的私有数据,则用物理寻址。
实战要点:在ECU刷写(Flash Programming)场景中,0x34(请求下载)和0x36(传输数据)必须使用物理寻址,因为刷写过程需要独占通道并保证数据完整性。而0x28(通信控制)在整车下线检测时,常使用功能寻址同时关闭所有ECU的通信,以节省时间。

案例拆解:功能寻址在整车下线检测中的应用

某整车厂下线检测工位需要同时读取所有ECU的VIN码(DID 0xF190)进行一致性校验。若使用物理寻址,需逐个发送0x22请求,假设有20个ECU,每个ECU响应时间约20ms,总耗时约400ms。若使用功能寻址(CAN ID 0x7DF),所有ECU同时响应,但总线仲裁会导致响应报文排队,实际耗时约100ms。虽然功能寻址节省了请求发送时间,但响应冲突风险增加。因此,下线检测系统通常采用"功能寻址请求+物理寻址确认"的两阶段策略:先广播请求,再根据响应列表逐个确认。

常见误区与总结复盘

风险提示:并非所有服务都支持功能寻址。ISO 14229-1明确规定,0x27(安全访问)和0x2E(写数据)等涉及安全或写入操作的服务,禁止使用功能寻址。原因在于:功能寻址的响应是"多对一"的,多个ECU同时响应会导致总线冲突,且无法确认哪个ECU成功执行了写入操作。此外,安全访问的种子/密钥交换必须点对点进行,否则会泄露安全算法。

总结:服务分类是寻址模式选择的第一依据。工程师在设计诊断流程时,应首先判断服务类型,再决定使用物理寻址还是功能寻址,避免因寻址不当导致的安全风险或总线冲突。

2.3 诊断会话与安全访问

核心原理:会话状态机与安全等级

UDS诊断会话(Diagnostic Session)定义了ECU当前可用的诊断服务集合。ISO 14229-1定义了四种标准会话:默认会话(Default Session, 0x01)、编程会话(Programming Session, 0x02)、扩展会话(Extended Session, 0x03)和安全系统诊断会话(Safety System Diagnostic Session, 0x04)。ECU上电后默认进入默认会话,仅支持基础诊断服务(如0x10、0x3E、0x22的部分DID)。通过0x10服务可切换到其他会话,但切换条件受限于ECU状态和安全等级。

安全访问(Security Access)机制通过0x27服务实现,其核心流程为:诊断仪发送0x27 01(请求种子),ECU返回一个随机种子(Seed);诊断仪使用约定的密钥算法(如AES-128或自定义算法)计算密钥(Key),发送0x27 02(发送密钥);ECU比对密钥,若匹配则解锁相应安全等级。安全等级通常分为0-7级,不同等级对应不同的服务权限——例如等级1可解锁DID写入,等级3可解锁例程控制,等级5可解锁内存访问。

操作流程:会话切换与安全解锁的标准步骤

// 会话切换流程(以切换到扩展会话为例)
1. 诊断仪发送:0x10 0x03(请求切换到扩展会话)
2. ECU响应:   0x50 0x03 0x00 0x32 0x01 0xF4(肯定响应,含P2和S3超时参数)
   // 0x32=50ms(P2),0x01F4=500ms(S3)
3. 诊断仪发送:0x3E 0x00(保持在线,防止会话超时)
4. ECU响应:   0x7E 0x00(肯定响应)

// 安全访问流程(以解锁等级1为例)
1. 诊断仪发送:0x27 0x01(请求种子)
2. ECU响应:   0x67 0x01 0x12 0x34 0x56 0x78(返回4字节种子)
3. 诊断仪计算:Key = AES128(Seed, 密钥) = 0x9A 0xBC 0xDE 0xF0
4. 诊断仪发送:0x27 0x02 0x9A 0xBC 0xDE 0xF0(发送密钥)
5. ECU响应:   0x67 0x02(肯定响应,解锁成功)
   // 若密钥错误,ECU返回0x7F 0x27 0x35(错误:无效密钥),并启动延时计数

案例拆解:安全访问失败后的延时锁定策略

某ECU在刷写过程中,诊断仪连续3次发送错误密钥,导致ECU进入延时锁定状态。具体现象:第1次错误后,ECU返回0x7F 0x27 0x35,并启动10秒延时;第2次错误后,延时延长至30秒;第3次错误后,延时延长至60秒,且锁定期间即使发送正确密钥也无法解锁。该策略的目的是防止暴力破解。实际工程中,延时时间通常由ECU制造商自定义,且锁定状态在ECU重新上电后自动清除。因此,刷写工具必须实现密钥重试管理机制,避免因连续失败导致的生产节拍延误。

经验提醒:会话切换和安全访问之间存在依赖关系。某些安全等级(如等级3)要求ECU必须处于扩展会话或编程会话中才能解锁。因此,标准操作顺序为:先切换会话 → 再安全访问 → 最后执行目标服务。此外,S3超时(默认5秒)会重置会话状态,安全解锁状态也会随之失效,诊断仪需周期性发送0x3E保持在线。

常见误区与总结复盘

风险提示:安全访问的种子长度和密钥算法因ECU制造商而异。部分ECU使用4字节种子,部分使用8字节;算法可能是AES-128、CRC16或自定义查表法。诊断仪必须实现可配置的算法库,以适配不同车型。此外,安全访问的解锁状态在会话切换后可能保留或清除,具体行为需查阅ECU的AUTOSAR配置或诊断规范。