什么是tlv
通信协议可以理解两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。常 见的有tcp,udo,http,sip等常见协议。协议有流程规范和编码规范。流程如呼叫流程等信令流程,编码规范规定所有信令和数据如何打包/解包。
tlv的结构
TLV是指由数据的类型Tag,数据的长度Length,数据的值Value组成的结构体,几乎可以描任意数据类型,TLV的Value也可以是一个TLV结构,正因为这种嵌套的特性,可以让我们用来包装协议的实现,如图:
一般来说数据传输的方式分为字符流传输和字节流传输,
字符流一般是以字符串的形式传输和储存,如:hello world
字节流一般是以字节的形式传输和储存,如0x00,0xff
tlv协议是以字节流的形式传输的
tlv封包
我们直接发送tlv数据,如0x01(T) 0x03(L) 0x03(V),就很容易出现错误,比如0x01(T) 0x03(L) 0x03(V)数据之前如果有个0x01的废数据,变成0x01 0x01(T) 0x03(L) 0x03(V),服务器在读的时候会误把废数据0x01当作tlv数据的开头0x01(T)解读,这样就得不到准确的数据,一般我们会在tlv协议之前加一个帧头(Head),这个帧头用一个不常用到字节来做,比如0xFF,0xFD之类的,报文:0xFF(H) 0x01(T) 0x04(L) 0x03(V);如果是需要更加严谨(比如航空之类的)的数据发送,可以用两个(或以上)字节做帧头,如0xFF 0xFF (H) 0x01(T) 0x05(L) 0x03(V)
同时传输过程中可能会出现数据丢失的情况,为了检测出数据是否有丢失的情况,我们常在tlv协议后加上一个crc校验和,crc校验和是由tlv的数据计算出的结果,感兴趣的朋友可以深究。
crc校验和参考博客:https://blog.csdn.net/d_leo/article/details/73572373
最后发来的数据就是[帧头] [Tag] [Length] [Value] [CRC校验和],用前面[帧头] [Tag] [Length] [Value]可以算出一个CRC的值,用来跟TLV报文最后的