IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> SOME/IP协议详解「2.1.8·序列化:TLV简述|Tag Length Value」 -> 正文阅读

[网络协议]SOME/IP协议详解「2.1.8·序列化:TLV简述|Tag Length Value」

SOME/IP协议详解「2.1.8·序列化:TLV简述|Tag Length Value」

点击返回雪云飞星的SOME/IP协议详解「总目录」



1 什么是TLV

TLV是Tag Length Value的简称,是someip序列化的一种格式,会有部分车厂在使用,但并不是主流。我们简单讲解一下,让大家知道这个干什么的,不对细节做进一步分析。与之前讲过的所有的类型的序列化格式有所区别,tlv还会再加一层标签,对每个数据进行单独标识,方便管理。标签可以在两个地方加:

  • someip服务接口参数
  • 某参数定义的struct里的成员

2 TLV格式

从下图中可以看到,如果光看蓝色部分,就是和前面章节中讲解的序列化方式是一样的,而这个主要加了2 bytes的tag头。一个someip报文里可以有很多这样的数据。可以看出,tag+length+数据的形式就在字节流中将每个数据划分成了一段,形成了一个链表,如果不想要该tag的数据,就可以通过length直接跳过去,甚至不用再反序列化(注意的一点是,这里length无论是静态动态数据类型,只要不是基础数据类型都必须要有长度域,以便能通过长度域找到下一个数据)
在这里插入图片描述
再说一下上面图中的tag头,主要是3部分组成,1bit的res保留,3bits的wire type,和12bits的data ID:

  • wire type: wire type用来指示后续的长度域占用几个bytes,如果是基础数据类型,没有长度域,其余类型都必须有长度域

    wire type数据类型
    08 bit长度的基础数据类型,没有长度域
    116 bit长度的基础数据类型,没有长度域
    232 bit长度的基础数据类型,没有长度域
    364 bit长度的基础数据类型,没有长度域
    4复杂数据类型,length域的字节数根据数据类型定义决定
    5复杂数据类型,length域的字节数固定为1byte
    6复杂数据类型,length域的字节数固定为2byte
    7复杂数据类型,length域的字节数固定为4byte
  • data ID: data ID对于每一层级的数据要唯一,比如有一个2维度嵌套的struct,那么每一维度都可以使用data ID = 1,但是同一维度ID不能相同

    typedef struct {
    	uint8 a; //data ID = 1
    	uint16 b; //data ID = 1 (not ok)
    	struct {
    		uint8 d; //data ID = 1 (ok)
    		uint8 e; //data ID = 2 (ok)
    	} c; //data ID = 2
    } testType;
    

3 服务接口参数的TLV

假如有一个服务接口为:

// data ID: A = 1; B = 2; C = 3
function(uint8 A, uint16 B, struct C);

我们统一使用wire type = 5的方式进行序列话,那么序列化后三个接口参数的效果如图
在这里插入图片描述


4 结构体的TLV

某些参数中会包含到结构体,结构体也可以添加tag,比如在上面例子的基础上进行延伸

typedef struct {
	uint8 a;
	uint16 b;
	struct {
		uint8 d; //data ID = 1
		uint8 e; //data ID = 2
	} c;
} testType;

// data ID: A = 1; B = 2; C = 3
function(uint8 A, uint16 B, testType C);

那么序列化图如下:

在这里插入图片描述
需要注意几点:

  • struct中每一维度可以配置使用tlv或者不使用,如上面的例子中a b c就没有使用tlv,但是c里面的元素d e就使用了tlv
  • struct打上tag后,可以对由应用层指定不需要传输的数据不进行序列化,只序列化部分数据传输出去即可(比如某些数据一直没有变动,可以不进行传输)
  • 服务参数打上tag后,也必须传输,不能跳过,因为接口入参个数是固定的,不能减少
  • 加上tag后,传输参数的顺序就可以变更了,不必要按照定义的顺序进行
  • data ID的值是可以配置的,不必非要是1,2,3;可以是3,19,100这样的随机值,只要不重复即可
  • 使用tlv格式后,默认不对动态数据末尾填充对齐

点击返回雪云飞星的SOME/IP协议详解「总目录」

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:22:00  更:2022-02-04 11:22:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:24:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码