【Protobuf】Pb Generation

Connection1.0 - XMPP协议

XMPP

XMPP(Extensible Messaging and Presence Protocol),是一种通信协议,用于即时消息传递和传递在线状态信息。

XMPP 有很好的安全性、可读性高、并且是物联网的标准协议,有更好的开放性可拓展性

XMPP 缺点

  1. 基于 TLS 握手和 SASL challenge,前后台握手交互次数太多(超过 8 次),握手时间太长。
  2. 包体是 xml 文本,虽然可读性高,但是包体比较大,信息载荷比低,带宽占用高。

Connection2.0 - PB

PB

Pb(Protocol Buffers),是谷歌开发的数据描述语言,有更高的拓展性。

优点:

  1. 高效性: Protobuf 是二进制格式,因此它生成的数据通常比 XMPP 小很多,这使得 Protobuf 在网络传输中更加高效。同时,Protobuf 的解析和序列化速度也比 XMPP 快

  2. 体积小且数据结构清晰,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

  1. 安全: 提现在数据结构上。

  2. 向后兼容性,下面消息中,发给 2 中的旧协议,前面三个还是能拿到:

    1
    2
    3
    4
    5
    6
    7
    syntax="proto3";
    message Person{
    string name = 1;
    int32 age = 2;
    string email = 3;
    int32 number = 4;
    }
  3. 易于维护且强类型。

高效编码方法

  1. Varint 编码:对于小整数,用较少字节,大整数才使用更多字节。
  2. 长度限制(Length-delimited)编码:对于字符串/字节数组/嵌套数据结构,会在数据前附加数据长度的 Varint 编码
  3. Packed 编码:repeated 基本类型(类似 vector 可以重复任意次的动态数组),将所有元素连续存储在一个单独的字节数组,减少元数据开销。
  4. 编号代替字段名:在 pb 里只会存 类型+value,压缩了key 名带来的空间,因此他对数据字段的顺序有严格要求(不能变换各个数据字段的顺序,否则无法向后兼容)。
  5. 二进制格式: 没有需要额外存储的分隔符等,纯二进制格式的消息。