SOME/IP 协议介绍(四)RPC协议规范

news2025/2/23 12:38:42

RPC协议规范

本章描述了SOME/IP的RPC协议。

传输协议绑定

为了传输不同传输协议的SOME/IP消息,可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释,而第[SIP_RPC_450页,第36页]节讨论了选择哪种传输协议。

UDP绑定

SOME/IP的UDP绑定通过在UDP数据包中传输SOME/IP消息来实现。SOME/IP消息不应该被分段。因此,应当注意确保SOME/IP消息不要太大,即SOME/IP有效负载最多为1400字节。具有更大负载的消息不应该通过UDP传输,而应该使用TCP等其他方式。
头格式允许在单个UDP数据包中传输多个SOME/IP消息。通过SOME/IP长度字段,SOME/IP实现可以轻松地识别SOME/IP消息的结束。根据UDP长度字段,SOME/IP可以确定UDP数据包中是否存在其他SOME/IP消息。

每个SOME/IP有效负载都应具有自己的SOME/IP头。
作为优化,SOME/IP的UDP绑定可以使用确认消息,特别是用于触发服务器端长时间运行操作的请求/响应通信,在发送结果(传输或处理确认)之前必须完成。确认消息是具有完全相同头字段但更改了消息类型且没有有效负载的SOME/IP消息。这些额外的确认消息的使用应由接口规范进行配置。
另一种方法是设计一种具有返回代码或输出参数的方法,指定“操作仍在进行中”,以便请求的ECU可以在一定时间后再次询问。

AUTOSAR 标准

基于Socket适配器概念,AUTOSAR可以将传入的UDP数据包分割为不同的i-PDU。然而,并非所有的AUTOSAR实现目前都能够将不同的i-PDU组合起来并发送一个包含多个SOME/IP消息的UDP数据包。

TCP绑定

SOME/IP的TCP绑定在很大程度上基于UDP绑定。与UDP绑定不同,TCP绑定允许更大的SOME/IP消息以及连续传输的SOME/IP消息(流水线传输)。
每个SOME/IP有效负载都应具有自己的SOME/IP头。
为了降低延迟和响应时间,应关闭Nagle算法(TCP_NODELAY)。
当TCP连接丢失时,未完成的请求应被处理为超时。由于TCP处理可靠性,不需要额外的可靠性手段。错误处理在[SIP_RPC_364页,第31页]中进行了详细讨论。

使用Magic Cookies允许对TCP流进行重新同步

为了在测试和集成场景中允许对SOME/IP over TCP进行重新同步,应在SOME/IP消息之间使用SOME/IP Magic Cookie消息(图1)。
在第一个在TCP段中传输的SOME/IP消息之前,应包括SOME/IP Magic Cookie消息。
实现应每个TCP段只包含最多一个SOME/IP Magic Cookie消息。

如果实现没有适当的访问消息分段机制,因此无法满足[SIP_RPC_591页26]和[SIP_RPC_592页26]的要求,实现应根据以下启发式规则包括SOME/IP Magic Cookie消息:
只要在该TCP连接上传输消息,每隔10秒向TCP连接添加一次SOME/IP Magic Cookie消息。
Magic Cookie消息的布局基于SOME/IP。字段设置如下:
• 服务ID = 0xFFFF
• 方法ID = 0x0000(客户端到服务器方向)
• 方法ID = 0x8000(服务器到客户端方向)
• 长度 = 0x0000 0008
• 客户端ID = 0xDEAD
• 会话ID = 0xBEEF
• 协议版本如上所述
• 接口版本 = 0x01
• 消息类型 = 0x01(客户端到服务器通信)或0x02(服务器到客户端通信)
• 返回码 = 0x00
Magic Cookie消息的布局如图1所示。

图片

多个服务实例

虽然不同的服务可以共享相同的端口号,但单个ECU上的多个服务实例应每个实例监听不同的端口。不同ECU上的实例通过不同的实例ID进行识别。这些实例ID用于服务发现,但不包含在SOME/IP头中。

通过服务ID与套接字(即IP地址、传输协议(UDP/TCP)和端口号)的组合可以识别服务实例。建议实例在UDP和TCP上使用相同的端口号。如果一个服务实例使用UDP端口x,则只有该服务的这个实例,而不是同一服务的另一个实例,应该使用准确的TCP端口x提供其服务。

请求/响应通信


请求/响应模式是最常见的通信模式之一。一方(以下称为客户端)发送一个请求消息,由另一方(服务器)进行回答。
ID: SIP_RPC_329
在SOME/IP头中,客户端在请求消息中必须执行以下操作:

  • 构建有效载荷

  • 根据客户端要调用的方法设置消息ID

  • 将长度字段设置为8个字节(用于SOME/IP头的第二部分)+序列化有效载荷的长度

  • 可选地将请求ID设置为唯一的数字(仅对客户端而言应唯一)

  • 根据[SIP_RPC_89页14]设置协议版本。

  • 根据接口定义设置接口版本

  • 将消息类型设置为请求(即0x00)

  • 将返回码设置为0x00

服务器根据客户端的头构建自己的头,并额外执行以下操作:
• 构建有效载荷
• 将长度设置为8个字节 + 新有效载荷的大小
• 将消息类型设置为响应(即0x80)或错误(即0x81)
• 设置返回码。

AUTOSAR 标准

AUTOSAR应通过客户端/服务器功能来实现请求-响应。对于中间实现,可能需要通过发送者/接收者功能来实现ECU间的通信。在这种情况下,PDU的语义和语法不应与本规范有所不同。

Fire&Forget通信

没有响应消息的请求被称为Fire&Forget通信。其实现与请求/响应基本相同,但存在以下差异:

  • 没有响应消息。

  • 消息类型设置为REQUEST_NO_RETURN(即0x01)。

Fire&Forget消息不会返回错误。当需要时,应用程序应实现错误处理和返回代码。

AUTOSAR 标准

Fire&Forget应该使用发送者/接收者功能来实现。

通知

通知描述了一种常见的发布/订阅概念。通常,服务器发布一个服务,客户端订阅该服务。在特定事件发生时,服务器将向客户端发送通知,这可以是更新的值或已发生的事件之一。

SOME/IP仅用于传输更新的值,而不用于发布和订阅机制。这些机制由SOME/IP-SD实现,并在第[SIP_RPC_360页31]节中进行了解释。

当同一ECU上存在多个订阅的客户端时,系统应处理通知的复制,以节省在通信介质上的传输。这在使用组播消息传输通知时尤为重要。

发送通知的策略

对于不同的用例,可以使用不同的发送通知策略,并应在服务接口中定义。以下是常见的示例:

 周期性更新 - 在固定间隔(例如每10毫秒)发送更新后的值。

 改变时更新 - 当“值”发生变化时立即发送更新(例如门打开)。

 Epsilon变化 - 仅在与上一个值的差异大于某个特定的epsilon时发送更新。此概念可能是自适应的,即预测基于历史记录; 因此,仅当预测与当前值之间的差异大于epsilon时才传输更新。

发布/订阅处理

发布/订阅处理应根据第[SIP_SD_137第72页]节进行实现。

AUTOSAR标准

通知使用AUTOSAR发送者/接收者功能进行传输。如果在一个ECU内存在不同的通知接收者,可以在RTE中进行通知消息的复制。这意味着一个事件/通知消息应仅发送一次给具有多个接收者的ECU。

字段(field)

字段应该是可选的getter、可选的setter和可选的通知事件的组合。

字段至少应该有1个getter或1个setter或1个通知事件。

字段的getter应该是一个请求/响应调用,请求消息中应该有一个空负载,响应消息的负载中应该是字段的值。

字段的setter应该是一个请求/响应调用,请求消息的负载中应该包含字段的期望值,响应消息的负载中应该包含被设置到字段的值。

通知器应该是一个事件,在字段发生变化时传输字段的值,并遵循事件的规则。

错误处理

错误处理可以在应用程序中或下面的通信层中完成。因此,存在不同的可能机制。

传输应用程序错误码和异常

对于错误处理,支持两种不同的机制。所有消息都有一个返回代码字段来携带返回代码。但是,只有响应消息(消息类型0x80和0x81)使用此字段将返回代码传递给它们回答的请求消息(消息类型0x00)。所有其他消息将此字段设置为0x00(请参见第2.3.7节)。对于更详细的错误,错误消息的布局(消息类型0x81)可以携带特定的错误处理字段,例如异常字符串。错误消息将被发送而不是响应消息。

这可以用于处理服务器中可能发生的所有不同应用程序错误。此外,可能会出现与通信介质或中间组件(例如交换机)相关的问题,这些问题必须通过可靠传输等方式进行处理。

返回码

错误处理基于AUTOSAR的8位Std_returnType。最高的两个比特位被保留,应设置为0。返回代码的接收者应忽略最高的两个比特位的值。

系统不应为事件/通知返回错误消息。

当前定义了以下返回代码,并应按照描述进行实现:

ID

Name

Description

0x00

E_OK

未发生错误

0x01

E_NOT_OK

发生未指定的错误

0x02

E_UNKNOWN_SERVICE

请求的服务ID未知

0x03

E_UNKNOWN_METHOD

请求的方法ID未知。已知服务ID

0x04

E_NOT_READY

已知服务ID和方法ID。应用程序未运行

0x05

E_NOT_REACHABLE

无法访问运行该服务的系统(仅限内部错误代码)

0x06

E_TIMEOUT

发生超时(仅限内部错误代码)

0x07

E_WRONG_PROTOCOL_VERSION

SOME/IP协议版本不受支持

0x08

E_WRONG_INTERFACE_VERSION

接口版本不匹配

0x09

E_MALFORMED_MESSAGE

反序列化错误(例如,长度或类型不正确)

0x09-0x1f

RESERVED

保留给通用SOME/IP错误。这些错误将在本文档的未来版本中指定

0x20-0x3f

RESERVED

保留给特定服务和方法的错误。这些错误由接口规范指定

生成和处理返回码应该是可配置的。

在过渡期间,某些实现(例如基于AUTOSAR的实现)可能不需要实现返回码的要求。请咨询系统部门。

错误消息格式

为了更灵活的错误处理,SOME/IP允许用户指定一个特定于错误的消息布局,而不是使用响应消息的消息布局。这由接口规范定义,并可用于传输高级编程语言的异常。

建议的异常消息布局如下:

• 特定异常的联合体。至少需要存在一个没有字段的通用异常。

• 动态长度字符串用于异常描述。

联合体提供了以类型安全的方式在将来添加新异常的灵活性。字符串用于传输可读的异常描述,以便于测试和调试。

通信错误和通信错误处理

在考虑RPC消息的传输时,存在不同的可靠性语义:

• 可能性(Maybe)- 消息可能会到达通信伙伴

• 至少一次(At least once)- 消息至少会到达通信伙伴一次

• 确定一次(Exactly once)- 消息确切地到达通信伙伴一次

在涉及请求/响应时,这些术语适用于两个消息(即请求、响应或错误)。

虽然不同的实现可能采用不同的方法,但当前使用UDP绑定时,SOME/IP实现了"可能性"的可靠性,使用TCP绑定时实现了"确定一次"的可靠性。其他错误处理留给应用程序处理。

对于"可能性"的可靠性,当使用UDP作为传输协议的请求/响应通信时,只需要一个超时。图2显示了"可能性"可靠性的状态机。客户端的SOME/IP实现必须等待指定超时时间以获取响应。如果超时发生,SOME/IP应向客户端发出E_TIMEOUT信号。

图片

对于"确定一次"的可靠性,可以使用TCP绑定,因为TCP被定义为允许可靠的通信。

可以在应用程序或SOME/IP实现中实现其他机制以实现更高的可靠性。请记住,通信不必实现这些功能。下一节[SIP_RPC_440第35页]描述了这些可选的可靠性机制。

基于应用程序的错误处理

应用程序可以通过使用幂等操作(即可以多次执行而不会产生副作用的操作)和使用简单的超时机制轻松实现“至少一次”可靠性。图3显示了使用隐式确认的“至少一次”可靠性的状态机。当客户端发送请求时,它会启动一个计时器,计时器的超时时间为特定方法指定的时间。如果在计时器到期之前(在顶部的圆形转换处)未收到响应,则客户端将重试该操作。典型的重试次数为2,因此会发送3个请求。

重试次数、超时值和超时行为(常量或指数回退)不在SOME/IP规范之内,可以添加到接口定义中。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1199349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的停车场管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

[pipe-自写管道] 强网拟态2023-water-ker

程序分析 保护当然都开了, 题目给了一次增加, 释放, 修改一字节堆块的能力, 这里释放堆块后没有将其指针置空从而导致了 UAF. 漏洞利用 这里的堆块大小为 512 字节并是 SLAB_ACCOUNT, 所以可以直接利用管道去构造自写管道从而构造任意读写系统, 详细见大佬博客:【CTF.0x08】D…

如何在Linux服务器上后台持久运行Gunicorn

如何在Linux服务器上后台持久运行Gunicorn **问题概述****解决方案一:使用nohup命令****解决方案二:使用systemd服务****创建systemd服务文件****修改systemd服务文件以使用虚拟环境**日志管理**激活并启动服务:**如何设置用户和组**确认用户…

【博士每天一篇文献-算法】A pseudo-inverse decomposition-based self-organizing modular echo

阅读时间:2023-11-6 1 介绍 年份:2022 作者:王雷,北京信息科技大学自动化学院 期刊: Applied Soft Computing 引用量:12 提出了一种基于伪逆分解的自组织模块化回声状态(PDSM-ESN&#xff09…

基于python+django的美食餐厅点餐订餐网站

运行环境 开发语言:Python python框架:django 软件版本:python3.7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:PyCharm/vscode 前端框架:vue.js 项目介绍 本论文主要论述了如何使用python语言开发…

asp.net员工管理系统VS开发sqlserver数据库web结构c#编程包括出差、请假、考勤

一、源码特点 asp.net员工管理系统是一套完善的web设计管理系统(主要包括出差、请假、考勤基础业务管理),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010 ,数据库为sqlserver2008&a…

Http状态码502常见原因及排错思路(实战)

Http状态码502常见原因及排错思路 502表示Bad Gateway。当Nginx返回502错误时,通常表示Nginx作为代理服务器无法从上游服务器(如:我们的后端服务器地址)获取有效的响应。导致这种情况的原因有很多: 后端服务器故障ngin…

在 WSL 上启用 NVIDIA CUDA

环境要求 Windows 11 或 Windows 10 版本 21H2特定版本的GPU驱动: 安装支持 NVIDIA CUDA 的 WSL 驱动程序: https://www.nvidia.com/download/index.aspx具体安装哪个版本,查阅:https://docs.nvidia.com/cuda/wsl-user-guide/in…

从虚拟机下载开始的kubeSphere安装

目录 一、虚拟机安装 二、镜像下载安装 1、镜像下载 2、虚拟机创建 3、虚拟机系统安装 三、虚拟机配置 1、IP固定 2、配置yum阿里源 3、关闭防火墙 4、 关闭selinux 5、 禁止swap交换 6、内核参数修改 7、设置kubernetes源 四、docker安装 五、虚拟机分组 六、…

Linux之IPC通信共享内存(一次拷贝)与消息队列、管道、信号量、socket(两次拷贝)总结(六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

【蓝桥杯选拔赛真题18】C++病毒繁殖 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++病毒繁殖 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

微信小程序入门及开发准备,申请测试号以及小程序开发的两种方式,目录结构说明

目录 1. 介绍 1.1 优点 1.2 开发方式 2. 开发准备 2.1 申请 2.2 申请测试号 2.2 小程序开发的两种方式 2.3 开发工具 3. 开发一个demo 3.1 创建项目 3.2 配置 3.3 常用框架 3.3 目录结构说明 3.4 新建组件 1. 介绍 1.1 优点 是一种不需要下载安装即可使用的应用…

【LeetCode】每日一题 2023_11_12 每日一题 Range 模块

文章目录 刷题前唠嗑题目&#xff1a;Range 模块题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 嗯&#xff1f;怎么是 hard&#xff0c;好长&#xff0c;可恶&#xff0c;看不懂&#xff0c;怎么办 题目&#xff1a;Range 模块 题…

邻接矩阵储存图实现深度优先遍历(C++)

目录 基本要求&#xff1a; 图的结构体&#xff1a; 图的构造&#xff1a; 图的深度优先&#xff08;DFS&#xff09;&#xff1a; 图的打印输出&#xff1a; 完整代码&#xff1a; 测试数据&#xff1a; 运行结果&#xff1a; 通过给出的图的顶点和边的信息&#xff0c…

Apache和Nginx实现虚拟主机的3种方式

目录 首先介绍一下Apache和nginx&#xff1a; Nginx和Apache的不同之处&#xff1a; 虚拟主机 准备工作 Apache实现&#xff1a; 方法1&#xff1a;使用不同的ip来实现 方法2&#xff1a;使用相同的ip&#xff0c;不同的端口来实现 方法3&#xff1a;使用相同的ip&…

【C++基础 】类和对象(上)

C基础 类和对象&#xff08;上&#xff09; 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小7.2 类对象的存储方式猜测7.3 结构体内存对齐规则 8.this指针8.1 t…

人工智能领域200例教程专栏—学习人工智能的指南宝典

&#x1f389;&#x1f38a;&#x1f389; 你的技术旅程将在这里启航&#xff01; &#x1f680; 本专栏&#xff1a;人工智能领域200例教程专栏 从基础到实践&#xff0c;深入学习。无论你是初学者还是经验丰富的老手&#xff0c;对于本专栏案例和项目实践都有参考学习意义。 …

2023 年最新 Alipay 支付包商户接入实现 Java 网站在线支付功能(详细指南教程)

支付宝商户注册申请 若您的材料在电脑端&#xff0c;或企业/单位要求在电脑端操作。您的材料在手机端且方便在支付宝App中管理企业信息&#xff0c;可参阅《手机端开通企业支付宝-操作手册》开通企业支付宝。电脑端准备材料并使用个人支付宝扫码验证身份后开始注册。

二叉树的遍历(先序,中序,后序,层序)

目录 1.先序遍历1.代码实现 2.中序遍历1.代码实现 3.后序遍历1.代码实现 4.遍历算法的应用5.层序遍历1.算法思想2.代码实现 6.由遍历序列构造二叉树 1.先序遍历 根左右。 1.代码实现 若二叉树为空&#xff0c;则什么也不做; 若二叉树非空: ①访问根结点; ②先序遍历左子树; ③先…

Rt-Thread 移植6--多线程(KF32)

6.1 就绪列表 6.1.1 线程就绪优先级组 线程优先级表的索引对应的线程的优先级。 为了快速的找到线程在线程优先级表的插入和移出的位置&#xff0c;RT-Thread专门设计了一个线程就绪优先级组。线程就绪优先组是一个32位的整型数&#xff0c;每一个位对应一个优先级&#xff…