Linux编程:--项目应用层协议设计和序列化与反序列

一、协议简述
什么协议:协议是1种约定,通过约定,各不相同的进程能对一段数据信息形成同样的理解,从而能相互协作,普遍存在进程间通信的程序就一定需要协议
为何说进程间通信就需要协议?而不是说客户端和服务器端之前?
协议设计的目标
解析效率:互联网技术工作具有高并发的特点,解析效率决定了采用协议的CPU成本;编码长度:信息编码出来的长度,编码长度决定了采用协议的网络带宽及存储成本
易于实现:互联网技术工作需要一个轻量级的协议,而不是大而全的
可读性:编码后的数据信息的可读性决定了采用协议的调试及维护成本(各不相同的序列化协议是有各不相同的应用的场景)
兼容性:互联网技术的需求具有灵活多变的特点,协议会经常升级,采用协议的双方是否能独立升级协议、增减协议中的字段是非常重要的
跨平台跨语言:互联网技术的的工作涉及到各不相同的平台和语言,比如Windows用C++,Android用Java,Web用Js,IOS用object-c
安全可靠:防止数据信息被破解
协议设计最核心的问题(文章下面会详细介绍)
1. 序列化/反序列化
2. 判断包的完整性
3. 协议升级
4. 协议安全
5. 数据压缩
二、序列化与反序列
序列化和反序列化概念:
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化

Linux编程:--项目应用层协议设计和序列化与反序列


数据格式存储一般有两种:
一种为文本存储(例如JSON、XML等),另一种为二进制存储(例如Protobuf)
二进制可读性差,文本存储可读性高
用二进制存储比用本文存储占用的空间更少(如下图所示,12345678用文本存储需要8字节,用十六进制存储只需要6字节)。


序列化方法
①TLV编码及其变体(TLV是tag, length和value的缩写):比如Protobuf(Protobuf详情参阅:https://blog.csdn.net/qq_41453285/article/details/106731318)
②文本流编码:比如XML/JSON
③固定结构编码: 基本原理是,协议约定了传输字段类型和字段含义,和TLV的方式类似, 但是没有了tag和len,只有value。比如TCP头部,其头部已经是固定的了
④内存dump:
基本原理是,把内存中的数据直接输出,不做任何序列化操作。反序列化的时候,直接还原内存
如果消息结构是嵌套类型的,例如JSON那样的,那么内存dump就不容易处理了。一般在单片机、嵌入式中使用,普遍不使用
例如两端在通信的时候,数据用结构体表示,直接将结构体发送出去,不做任何序列化

struct Data
{
//...
};

struct Data d;
send(fd, &d, sizeof(d), 0);

主流序列化协议
主流序列化协议:
XML 指可扩展标记语言(eXtensible Markup Language)。是一 种通用和重量级的数据交换格式。以文本方式存储
JSON(JavaScript Object Notation,JS对象简谱)是一种通用和轻量 级的数据交换格式。以文本结构进行存储
protocol buffer是Google的一种独立和轻量级的数据交换格式。以二进制结构进行存储

相关推荐