应用层协议设计

协议

  • 什么是协议:协议是一种约定,通过约定,不同的进程可以对一段数据产生相同的理解,可相互协作。进程间的通信一定需要协议。
  • \color{rgb(255,0,0)} {为什么说进程间通信就需要协议?}
  • \color{rgb(255,0,0)} {为什么需要自己设计协议?}

协议设计目标

  • 解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议的CPU成本
  • 编码长度:信息编码后的长度,编码长度决定了使用协议的网络带宽及存储成本
  • 易于实现:互联网业务需要轻量级的协议,而不是大而全
  • 可读性:编码后的数据的可读性决定了使用协议的调试及维护成本(某些情况下需要可读性)
  • 兼容性:互联网的需求具有灵活多变的特点,协议会经常升级,使用协议的双方是否可以独立升级协议、增减协议中的字段是非常重要的
  • 跨平台跨语言:互联网的业务涉及到不同的平台和语言
  • 安全可靠:防止数据被破解

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

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

协议设计进阶问题

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

序列化/反序列化

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

  • 序列化:把对象转换为字节序列的过程称为对象的序列化
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化
    协议.png

序列化方法

  • 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 深圳

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容