ProtoBuff 介绍
【Protobuf】Pb Generation
Connection1.0 - XMPP协议
XMPP
XMPP(Extensible Messaging and Presence Protocol),是一种通信协议,用于即时消息传递和传递在线状态信息。
XMPP 有很好的安全性、可读性高、并且是物联网的标准协议,有更好的开放性和可拓展性。
XMPP 缺点
- 基于 TLS 握手和 SASL challenge,前后台握手交互次数太多(超过 8 次),握手时间太长。
- 包体是 xml 文本,虽然可读性高,但是包体比较大,信息载荷比低,带宽占用高。
Connection2.0 - PB
PB
Pb(Protocol Buffers),是谷歌开发的数据描述语言,有更高的拓展性。
优点:
高效性: Protobuf 是二进制格式,因此它生成的数据通常比 XMPP 小很多,这使得 Protobuf 在网络传输中更加高效。同时,Protobuf 的解析和序列化速度也比 XMPP 快
体积小且数据结构清晰,pb 的消息是二进制协议,无法直接阅读,使用 pb 协议需要预先定义数据结构(.proto 文件):
1
2
3
4
5
6
7
8
9
10
11
12
13
14//input
syntax="proto3"; //指明版本,默认 proto2
message Person{
string name = 1;
int32 age = 2;
string email = 3;
}
//output
syntax="proto3";
message Person{
string+1;
int32+2;
string email+3;
}
具体转换为二进制的规则可以参考:https://developer.aliyun.com/article/1309545
安全: 提现在数据结构上。
向后兼容性,下面消息中,发给 2 中的旧协议,前面三个还是能拿到:
1
2
3
4
5
6
7syntax="proto3";
message Person{
string name = 1;
int32 age = 2;
string email = 3;
int32 number = 4;
}易于维护且强类型。
高效编码方法
- Varint 编码:对于小整数,用较少字节,大整数才使用更多字节。
- 长度限制(Length-delimited)编码:对于字符串/字节数组/嵌套数据结构,会在数据前附加数据长度的 Varint 编码
- Packed 编码:repeated 基本类型(类似 vector 可以重复任意次的动态数组),将所有元素连续存储在一个单独的字节数组,减少元数据开销。
- 编号代替字段名:在 pb 里只会存
类型+value
,压缩了key 名带来的空间,因此他对数据字段的顺序有严格要求(不能变换各个数据字段的顺序,否则无法向后兼容)。 - 二进制格式: 没有需要额外存储的分隔符等,纯二进制格式的消息。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 貳壹肆の博客!
评论