协议
- 什么是协议:协议是一种约定,通过约定,不同的进程可以对一段数据产生相同的理解,可相互协作。进程间的通信一定需要协议。
协议设计目标
- 解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议的CPU成本
- 编码长度:信息编码后的长度,编码长度决定了使用协议的网络带宽及存储成本
- 易于实现:互联网业务需要轻量级的协议,而不是大而全
- 可读性:编码后的数据的可读性决定了使用协议的调试及维护成本(某些情况下需要可读性)
- 兼容性:互联网的需求具有灵活多变的特点,协议会经常升级,使用协议的双方是否可以独立升级协议、增减协议中的字段是非常重要的
- 跨平台跨语言:互联网的业务涉及到不同的平台和语言
- 安全可靠:防止数据被破解
协议设计最核心解决的问题
1、序列化/反序列化
2、判断包的完整性
协议设计进阶问题
3、协议升级
4、协议安全
5、数据压缩
序列化/反序列化
什么是序列化和反序列化?
- 序列化:把对象转换为字节序列的过程称为对象的序列化
-
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
序列化方法
- TLV编码及其变体(TLV是tag, length和value的缩写):比如protobuf
- 文本流编码:比如xml json
- 固定结构编码:协议约定了传输字段类型和字段含义,和TLV的方式类似,但是没有了tag和length,只有value,比如tcp
- 内存dump:把内存中的数据直接输出,不做任何序列化操作。反序列化的时候,直接还原内存(不建议在互联网使用,在嵌入式方面可以使用)
主流序列化协议
主流序列化协议:xml、json、protobuf
- xml 指可扩展标记语言(eXtensible Markup Language)。是一种通用和重量级的数据交换格式,以文本方式存储
- json (JavaScript Object Notation,JS 对象简谱) 是一种通用和轻量级的数据交换格式,以文本结构进行存储
- protocol buffer是Google的一种独立和轻量级的数据交换格式,以二进制结构进行存储。
类型 | 通用性 | 大小 | 格式 |
---|---|---|---|
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 深圳