Linux下用tlv协议封包

本文介绍了TLV协议的结构及其在Linux下的应用。通过添加帧头和CRC校验和来确保数据传输的准确性,防止错误解读和数据丢失。文中还提到了tlv封包的实现细节,并提供了相关参考博客链接。
摘要由CSDN通过智能技术生成

什么是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报文最后的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值