【转载】Google Protobuf 协议分析
来源:互联网 发布:微软怎么下载软件 编辑:程序博客网 时间:2024/04/28 05:28
protobuf 是google开源的一个序列化框架,类似xml,json,最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。还可以定义一些可选字段,用于服务端与客户端通信。前面几篇文章说了protobuf的用法,看到网上也没有分析protobuf协议的文章,就利用一些时间写了 protobuf 的协议分析,希望大家喜欢。
protobuf协议核心思想
基于128bits的数值存储方式(Base 128 Varints)
数据表示方式:每块数据由接连的若干个字节表示(小的数据用1个字节就可以表示),每个字节最高位标识本块数据是否结束(1:未结束,0:结束),低7位表示数据内容。(可以看出数据封包后体积至少增大14.2%)
数字1的表示方法为:0000 0001,这个容易理解
数字300的表示方法为:1010 1100 0000 0010
protobuf字节序是小端字节序,所以这个数字实际是0000 0010 1010 1100
基于序号的协议字段映射(类似key-value结构)
所以字段可以乱序,可缺段(记optional)
效果相当于json数据:person = [{1: "john"}, {2: "USA"}, {3: 30}],其中{3: 30} 还可以不传,person还可以传成 [{2: "USA"}, {1: "john"}],对端仍旧可以正常解析。
基于无符号数的带符号数表示(ZigZag 编码)
协议数据结构
protobuf怎么在一长串二进制中表示若干个数据?
做法就是每块数据前加一个数据头,表示数据类型及协议字段序号。
msg1_head + msg1 + msg2_head + msg2 + ...
数据头也是基于128bits的数值存储方式,一般1个字节就可以表示:
以上数据转成十六进制也就是 08 02,其中 8 是怎么得到的?
数据类型的表示如下:
写在最后
protobuf的优缺点
优点前面也提到了,主要有两个:
1、序列化和反序列化效率比 xml 和 json 都高(这个protobuf 自己做了测试,链接要翻墙);
2、字段可以乱序,欠缺,因此可以用来兼容旧的协议,或者是减少协议数据。
但是字段允许乱序欠缺,反过来也是缺点。所以这里总结 protobuf 两个缺点,一个跟这有关:
1、如果字段过多,或者嵌套过深,都会影响反序列化效率,解析每一块数据都要根据序号找到对应的位置然后再插入到已解析好的数据中。
2、数据基于128bits的存储方式,单块数据比较大时效率很受影响。解析数据需要取到所有字节的低7位,然后再拼成一整块数据。
以上两个缺点,特别是对于erlang这类没有指针的语言来说,代价就相当昂贵。
3、协议序号也要占空间,序号越大占空间越大,当序号小于16时无需额外增加字节就可以表示。
protobuf 分析题
最后贴一道分析题,如果看得懂,基本就了解 protobuf 的协议内容了
作者:【没有开花的树】
出处:http://blog.csdn.net/mycwq/article/details/42060641
- 【转载】Google Protobuf 协议分析
- Google Protobuf 协议分析
- Google Protobuf自定义协议
- [转载] google ProtoBuf开发者指南
- Google protobuf 协议的使用
- google protobuf源码分析1
- 谷歌协议google protobuf 内存泄露
- google protobuf
- Google ProtoBuf
- protobuf (GOOGLE)
- google protobuf
- google protobuf
- 【google protobuf】
- google protobuf
- Google protobuf
- Google protoBuf
- Google Protobuf
- Google protobuf
- 建立一个类ARRAY,求一维数组中各元素的最大值、最小值和平均值。具体要求如下:
- 开发工作笔记(一)
- spring boot中使用generator插件自动生成代码
- android应用程序分享,蓝牙文件传输(代码)
- hive创建表格以及加载数据
- 【转载】Google Protobuf 协议分析
- vs下opencv的人脸检测以及qt下dll的封装调用(二、dll的创建)
- 使用IBM ServerGuide安装操作系统
- ThinkPHP5的验证码 NOT FOUND
- Java概述
- 公告
- 【javaEE】【Mybatis】【JDBC】问题
- JavaScript中的this
- android组件ListView之SimpleAdapter简单使用