应用层协议设计

2021-08-20  本文已影响0人  besmallw

协议

协议设计目标

协议设计最核心解决的问题

1、序列化/反序列化
2、判断包的完整性

协议设计进阶问题

3、协议升级
4、协议安全
5、数据压缩

序列化/反序列化

什么是序列化和反序列化?

序列化方法

主流序列化协议

主流序列化协议:xml、json、protobuf

类型 通用性 大小 格式
xml 通用 重量级 文本格式
json 通用 轻量级 文本格式(方便调试)
protobuf(编译器,生成对应语言的代码) 独立 轻量级 二进制格式

判断包的完整性

为了能让对端知道如何给包分解,目前一般有以下做法:
1、以固定大小字节数来分界,如每个包100字节,对端每收齐100个字节,就当成一个包来解析
2、以特定符号来分界,如每个包都以特定的字符来结尾(如\r\n),当在字节流中国读取到该字符时,则表明上一个包到此为止
3、固定包头+包体结构,这种结构中一般包头部分是一个固定字节长度的结构,并且包头中会有一个特定的字段指定包体的大小。收包时,先接收固定字节数的头部,解出这个包完整长度,按此长度接收包体。这是目前各种网络应用用的最多的一种包格式
4、在序列化后的buffer前面增加一个字符流的头部,其中有个字段存储包总长度,根据特殊字符(比如\n或者\0)判断头部的完整性。这样通常比3要麻烦一些,http和redis采用的就是这种方式。收包的时候,先判断已收到的数据中是否包含结束符,收到结束符后解析包头,解出这个包完整长度,按此长度接收包体

协议设计参考范例

字段 类型 长度(字节) 说明
STAG unsigned short 2 通信协议数据包的开始标志
version unsigned short 2 通信协议的版本号
checksum unsigned char 1 计算协议数据校验和,如果为加密数据,则计算密文校验和。校验和计算范围:协议头CheckSum字段后数据,协议体全部数据。
type unsigned char 1 0表示协议体是json格式,其它值未定义。设备心跳消息类型的值为0xA0
seqno unsigned int 4 通信数据报文的序列号,应答报文序列号必须与请求报文序列号相同
length unsigned short 2 报文内容长度,即从该字段后报文内容长度
reserve unsigned int 4 预留字节,设备心跳消息类型的值为devid

协议升级

1、通过版本号指明协议版本,即是通过版本号辨别不同类型的协议
2、支持协议头部可扩展,即是在设计协议头部的时候有一个字段用来指明头部的长度

协议安全

1、xxtea 固定 key
2、AES 固定 key
3、openssl
4、signal protocol 端到端的通讯加密协议

数据压缩

1、deflate
2、gzip
3、lzw


2021.8.20 17:28 深圳

上一篇 下一篇

猜你喜欢

热点阅读