网易首页 > 网易号 > 正文 申请入驻

UDS诊断协议三级会话安全体系:默认会话、扩展会话与编程会话详解(附代码实现)

0
分享至

UDS协议通过0x10(诊断会话控制)服务定义了三级会话体系,包括默认会话(Default Session)、扩展会话(Extended Session)和编程会话(Programming Session)。这套安全体系实现了不同权限级别的分层隔离,确保了诊断和刷写流程的安全性。


三级安全体系剖析

会话层级

子功能码

“禁区”类比

核心机制

默认会话 0x01

公共区域

ECU上电后的初始状态。这是权限最低的会话,通常只支持信息读取等基础服务。

扩展会话 0x03

工程师工作区

权限更高,可进行参数写入等操作。进入此模式后,通常需要先通过“安全访问”认证。

编程会话 0x02

手术室

最高权限,用于执行固件更新、内存擦写等敏感操作。


注:这些会话与0x27安全访问服务紧密配合,构成了UDS的核心安全防线。
会话切换与状态管理

会话切换并非随意进行,它遵循一套严谨的逻辑,并由定时器机制进行管理,防止ECU长时间停留在高权限状态。

标准会话切换路径

一个常见的诊断会话切换路径及报文示例通常如下:

graph TD
Default[默认会话 (Default) 0x10 01]

Default -->|诊断请求| Extended[扩展会话 (Extended) 0x10 03
Request: 10 03
Positive: 50 03]
Extended -->|安全访问| SA{安全访问 (27 Service)}

SA -- 验证通过 --> Extended_Ready[扩展会话(已解锁)]
Extended_Ready -->|编程请求| Programming[编程会话 (Programming) 0x10 02
Request: 10 02
Positive: 50 02]

Default -.->|直接请求失败| x((X))
Programming -.->|不可直接返回| Extended

关键切换逻辑:

  1. 路径要求 :必须从 默认会话 切换到 扩展会话 ,再从扩展会话切换到 编程会话 。通常不能从默认会话直接切换到编程会话。

  2. 会话保持 :进入扩展或编程会话后,诊断仪需周期性发送 ** TesterPresent 服务 (ID: 0x3E )**,以维持非默认会话状态,避免因超时而自动退回默认会话。

超时管理

会话超时是UDS协议中重要的安全机制,其核心时间参数有:

  1. S3 Server time : 非默认会话在无诊断请求时,能保持的最大空闲时间。

  2. P2 Server : ECU 处理单帧诊断请求的典型超时时间。

  3. P2 Server *: 在需要更多处理时间 (如下载/擦除) 时,响应超时时间的最大值。

代码实现剖析

以下代码示例展示了如何在嵌入式ECU中实现这些核心逻辑(基于常见UDS协议栈实现)。

0x10 服务:会话切换核心处理

当诊断仪发送一个切换会话的请求时(如 10 03),ECU的Dcm_Dcm_ProcessRequest函数会接收到报文,并根据以下逻辑进行处理:

/* 全局变量:用于存储诊断会话状态和应用计时器 */
static Dcm_DiagnoticSessionType Dcm_CurrDiagSession = DCM_DEFAULT_SESSION; // 当前会话状态
static uint16 Dcm_S3ServerTimer = 0; // S3 Server超时计时器,单位ms
static uint8 Dcm_TimerRunning = 0; // 计时器运行标志

/** @brief UDS 0x10 服务的主处理函数
* @param MsgBuf 指向接收到的UDS请求报文的指针
* @param RespBuf 指向响应报文缓冲区的指针(输出参数)
* @return 函数执行状态(通常是E_OK表示成功,E_NOT_OK表示失败)
*/
Std_ReturnType Dcm_DiagnosticSessionControl (uint8* MsgBuf, uint8* RespBuf)
{
uint8 subFunction = MsgBuf[1]; // 获取请求的子功能 (01/02/03)
uint8 retVal = 0; // 返回值

/* 1. 执行通用条件检查 */
retVal = Dcm_PreconditionsCheck(MsgBuf); // 检查是否支持该服务,格式是否正确

if (retVal != NRC_POS_RESP)
{
RespBuf[0] = 0x7F; // 负响应ID
RespBuf[1] = 0x10; // 被拒绝的服务ID
RespBuf[2] = retVal; // 负响应码
return E_OK;
}

/* 2. 根据请求的子功能,执行特定的会话切换逻辑 */
switch (subFunction)
{
case DCM_DEFAULT_SESSION: // 子功能码 0x01 : 切换到默认会话
if (Dcm_CurrDiagSession != DCM_DEFAULT_SESSION)
{
/* 在退出非默认会话前,调用清理函数 */
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_DEFAULT_SESSION;
}
/* 重新初始化默认会话:重置所有诊断相关的临时配置 */
Dcm_ReinitializeDefaultSession();
break;

case DCM_PROGRAMMING_SESSION: // 子功能码 0x02 : 切换到编程会话
/* 检查切换条件1:是否由扩展会话发起 */
if (Dcm_CurrDiagSession != DCM_EXTENDED_DIAGNOSTIC_SESSION)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_7E; // 服务序列中的子功能不支持(当前会话不支持该切换)
return E_OK;
}
/* 检查切换条件2:安全访问是否已解锁(通常需要高安全级别) */
if (Dcm_SecurityLevel != DCM_SEC_LVL_PROGRAMMING) // 假设DCM_SEC_LVL_PROGRAMMING是编程安全级别
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_33; // 安全访问未解锁
return E_OK;
}
/* 检查切换条件3:车辆状态是否允许(如车速、电压等) */
if (Dcm_CheckVehicleConditions() != E_OK)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_22; // 条件不满足
return E_OK;
}
/* 执行编程会话的清理和准备工作 */
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_PROGRAMMING_SESSION;
/* 重置并重新配置适用于编程会话的计时参数(如超时间隔) */
Dcm_ConfigureTimingParameters(DCM_PROGRAMMING_SESSION);
break;

case DCM_EXTENDED_DIAGNOSTIC_SESSION: // 子功能码 0x03 : 切换到扩展会话
/* 检查切换条件:是否在默认会话下请求切换 */
if (Dcm_CurrDiagSession != DCM_DEFAULT_SESSION)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_7E;
return E_OK;
}
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_EXTENDED_DIAGNOSTIC_SESSION;
break;

default: // 其他不支持的子功能
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_12; // 子功能不支持
return E_OK;
}

/* 3. 构造0x10服务的肯定响应报文 */
RespBuf[0] = 0x50; // 正响应ID
RespBuf[1] = subFunction; // 回声请求的子功能
RespBuf[2] = (uint8)(Dcm_P2Server_Max >> 8); // 时间参数 P2 Server Max 高位字节
RespBuf[3] = (uint8)(Dcm_P2Server_Max & 0xFF); // 时间参数 P2 Server Max 低位字节
RespBuf[4] = (uint8)(Dcm_P2StarServer_Max >> 8); // 时间参数 P2* Server Max 高位字节
RespBuf[5] = (uint8)(Dcm_P2StarServer_Max & 0xFF);// 时间参数 P2* Server Max 低位字节
RespBuf[6] = 0x01; // 可选参数,通常为0x01
RespBuf[7] = 0xF4; // 可选参数,通常为0xF4

/* 4. 重置S3 Server超时计时器 */
Dcm_S3ServerTimer = Dcm_S3ServerMax; // 重新加载定时器初始值
Dcm_TimerRunning = 1; // 启动计时器

return E_OK;
}
会话超时管理

ECU的系统Tick中断或后台主循环中,需要持续处理会话的超时逻辑。其核心思想是:当ECU处于某个非默认会话时,会启动一个计时器(S3 Server),并在计时器到期后将会话切回默认会话。

/** @brief 定时器服务函数(通常在1ms或10ms中断/循环中被调用) */
void Dcm_MainFunction_Timer (void)
{
/* 1. 会话超时管理 (S3 Server) */
if (Dcm_TimerRunning == 1) // 如果有计时器正在运行
{
if (Dcm_S3ServerTimer != 0U) // 如果计时器未归零
{
Dcm_S3ServerTimer--; // 计时器递减
}

if (Dcm_S3ServerTimer == 0U) // 如果计时器归零,会话超时
{
Dcm_CurrDiagSession = DCM_DEFAULT_SESSION; // 强制切换回默认会话
Dcm_TimerRunning = 0; // 停止计时器
/* 通知系统:会话已因超时而退出,重置任何与之前会话相关的配置 */
Dcm_NotifySessionTimeout();
}
}

/* 2. 其他定时管理,如P2/P2*服务器的超时监控等 */
// ...
}
注意:上述代码为典型设计思路,实际产品级实现通常在AUTOSAR DCM(诊断通信管理)模块的Dcm_DiagnosticSessionControl_SubFnc函数和Dcm_Timer函数中完成。
典型安全刷写流程

一个完整的、安全的ECU软件升级流程,会充分体现这套三级安全体系。通常包括以下步骤:

  1. 进入扩展会话 :诊断仪发送 10 03 ,ECU进入扩展会话,解锁部分功能。

  2. 安全访问认证 :诊断仪通过 27 服务(请求种子->发送密钥)通过ECU的高级别身份验证。成功后,ECU解锁编程相关权限。

  3. 刷写前预检查 :使用 31 例程控制服务检查刷写条件(如电压、车速),确保环境安全。

  4. 进入编程会话 :诊断仪发送 10 02 。ECU验证当前在扩展会话且通过安全认证后切换至编程会话,并 停止应用软件运行 ,准备接收新固件。

  5. 执行固件更新 :通过 34 , 36 , 37 等服务,将新固件数据下载到ECU的特定内存区域(如Flash)。

  6. 复位与退出 :更新完成后,发送 11 01 硬复位ECU,使其重启。此时ECU会 自动回到默认会话 ,新固件开始运行。

这种分级设计有效确保了即使在安全认证失败的情况下,ECU也不会被恶意刷写,保护了核心功能安全。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
差严子怡8米!日本奥运冠军痛哭:不甘心让她一枝独秀 明年要赢她

差严子怡8米!日本奥运冠军痛哭:不甘心让她一枝独秀 明年要赢她

风过乡
2026-09-28 09:06:08
洛夫顿离开上海得不偿失!发文开启勿扰模式,重返大鲨鱼障碍重重

洛夫顿离开上海得不偿失!发文开启勿扰模式,重返大鲨鱼障碍重重

体育见习官
2026-09-28 07:58:50
时隔两年半冲突视频曝光!斯图尔特挥拳尤班克斯 曾因此被禁赛3场

时隔两年半冲突视频曝光!斯图尔特挥拳尤班克斯 曾因此被禁赛3场

罗说NBA
2026-09-28 06:21:57
曼联无意让卡里克下课,重用拉什福德起作用!聘拉爵心仪主帅需1500万

曼联无意让卡里克下课,重用拉什福德起作用!聘拉爵心仪主帅需1500万

罗米的曼联博客
2026-09-28 10:14:03
CBA速递,上海大鲨鱼锁定麦基,六十万美元非常平价,三剑客浮现

CBA速递,上海大鲨鱼锁定麦基,六十万美元非常平价,三剑客浮现

体坛小快灵
2026-09-28 08:43:41
“升糖直接爆了”,家长晒儿子上学早餐,网友:吃完了倒头就睡

“升糖直接爆了”,家长晒儿子上学早餐,网友:吃完了倒头就睡

泽泽先生
2026-09-21 13:37:01
刘欢病逝2天,别墅、版权收入等资产曝光,遗产分配成焦点

刘欢病逝2天,别墅、版权收入等资产曝光,遗产分配成焦点

往史过眼云烟
2026-09-27 16:40:27
儿子作文里写:“我爸爸妈妈从来不吵架,但他们也不怎么说话”

儿子作文里写:“我爸爸妈妈从来不吵架,但他们也不怎么说话”

自由心向往之
2026-09-25 08:30:13
拒绝网红脸!央视秋晚四美火出圈,观众:这才是真审美

拒绝网红脸!央视秋晚四美火出圈,观众:这才是真审美

阿废冷眼观察所
2026-09-27 12:56:52
国家统计局:2026年1—8月份全国规模以上工业企业利润增长15.7%

国家统计局:2026年1—8月份全国规模以上工业企业利润增长15.7%

界面新闻
2026-09-28 09:31:49
台湾提出和统条件:一国三制,“外交权”和拥有军队?是痴心妄想

台湾提出和统条件:一国三制,“外交权”和拥有军队?是痴心妄想

老头的传奇色彩
2026-08-06 17:59:31
广州一工人误踩8层自建房楼顶绿色帆布坠入电梯井,连破两道安全网跌至一楼,调查报告披露:承包人无资质冒用他人名义,未设警示标志

广州一工人误踩8层自建房楼顶绿色帆布坠入电梯井,连破两道安全网跌至一楼,调查报告披露:承包人无资质冒用他人名义,未设警示标志

扬子晚报
2026-09-28 10:35:00
红薯正大量上市!研究发现:糖尿病吃一次红薯,等于给血糖添堵?

红薯正大量上市!研究发现:糖尿病吃一次红薯,等于给血糖添堵?

老李讲健康
2026-09-28 07:30:07
“磨膝大户”被揪出,是跑步的20倍,医生:不想软骨磨光,早扔掉

“磨膝大户”被揪出,是跑步的20倍,医生:不想软骨磨光,早扔掉

看世界的人
2026-09-20 22:04:47
王思聪坐香奈儿VIP贵宾室,懒懒旁边试包,消费降级传闻又被打脸

王思聪坐香奈儿VIP贵宾室,懒懒旁边试包,消费降级传闻又被打脸

梦醉为红颜一笑
2026-09-27 14:27:39
骁龙8EE6+11000mAh!荣耀新机官宣,9月28日发布

骁龙8EE6+11000mAh!荣耀新机官宣,9月28日发布

科技堡垒
2026-09-28 10:19:38
“抱歉,我们不喜欢肥头大耳的”,女孩公开追求体制内男,面相输了

“抱歉,我们不喜欢肥头大耳的”,女孩公开追求体制内男,面相输了

世界圈
2026-08-15 10:29:14
新央企首任董事长,未公布被调查就直接“双开”

新央企首任董事长,未公布被调查就直接“双开”

评论员岳连
2026-09-27 20:54:46
一个国家能蠢到什么程度?看看法国就明白了:法国黑人接近800万,巴黎新生儿里70%是黑人

一个国家能蠢到什么程度?看看法国就明白了:法国黑人接近800万,巴黎新生儿里70%是黑人

怪味历史连连看
2026-09-08 01:55:32
越老越妖,梅西30岁后罚进43粒直接任意球,比30岁前多10粒

越老越妖,梅西30岁后罚进43粒直接任意球,比30岁前多10粒

懂球帝
2026-09-28 10:05:05
2026-09-28 11:35:00
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

科技要闻

智能体惹了多少祸,OpenAI自己没查清!

头条要闻

牛弹琴:内塔尼亚胡有大麻烦了 不是命硬就能扛过去的

头条要闻

牛弹琴:内塔尼亚胡有大麻烦了 不是命硬就能扛过去的

体育要闻

114项指控成立,曼城已经完蛋了吗?

娱乐要闻

好汉刘欢:一副好嗓子,一颗赤子心

财经要闻

标价298元核桃油, 实为大豆油冒充

汽车要闻

MAZDA EZ-60激光版上市 焕新全系11.39万元起

态度原创

教育
家居
时尚
旅游
军事航空

教育要闻

欧洲名校也缺钱修楼?柏林高校开始发愁“楼太破”!

家居要闻

2026建博会(广州) 公装联探展交流活动

女人过了三四十岁,一定要准备一件小西装,大方得体又显瘦

旅游要闻

一组AI动态海报,解锁四川文旅融合鲜活场景|2026四川文旅大会特别策划

军事要闻

特朗普"罕见"提二战中美同盟 日本慌了

无障碍浏览 进入关怀版