1. 定义 TLV(Type-Length-Value)
TLV 是一种常用的用于通信的结构体格式。
T表示 tag (类型)
L表示 length (value的长度)
V表示 value。
其中T和L是固定大小的,V是可变大小,L表示的是V的长度。
2. TLV的历史来源
-
紧凑模式 写死的模式
紧凑模式,意思是除了数据本身外,没有一点额外冗余信息,可以看成是Raw Data例子是A和B通信,获取或设置基本资料,一般开发人员第一步就是定义一个协议结构:
struct userbase
{
unsigned short cmd;//1-get, 2-set
unsigned char gender; //1 – man , 2-woman, 3 - ??
char name[8]; //当然这里可以定义为 string name;
} -
可扩展性
有一天,A在基本资料里面加一个生日字段,然后告诉B
struct userbase
{
unsigned short cmd;
unsigned char gender;
unsigned int birthday;
char name[8];
}
这是B就犯愁了,收到A的数据包,不知道第3个字段到底是旧协议中的name字段,还是新协议中birthday。
这是后A,和B终于从教训中认识到一个协议重要特性——兼容性和可扩展性。
于是乎,A和B决定废掉旧的协议,从新开始,制定一个以后每个版本兼容的协议。
方法很简单,就是加一个version字段。
struct userbase
{
unsigned short version;
unsigned short cmd;
unsigned char gender;
unsigned int birthday;
char name[8];
} -
更好的可扩展性 TLV
于是A和B寻找各方资料,找到了ANS.1编码规范,好东西啊… ASN.1是一种ISO/ITU-T 标准。
其中一种编码BER(Basic Encoding Rules)简单好用,它使用三元组编码,简称TLV编码。
每个字段编码后内存组织如下
3. TLV优缺点
- 优点
TLV具备了很好可扩展性,很简单易学。 - 缺点
(1)因为其增加了2个额外的冗余信息,tag 和len,特别是如果协议大部分是基本数据类型int ,short, byte. 会浪费几倍存储空间。
(2)另外Value具体是什么含义,需要通信双方事先得到描述文档,即TLV不具备结构化和自解释特性。
参考
https://blog.csdn.net/shaobingj126/article/details/47169173
https://blog.csdn.net/qq_43296898/article/details/88822938