早之前就用过Google的Protobuf做数据编码,一直没有深入理解其中的原理,最近做了一次通讯抓包,发现其中很多Protobuf编码的数据包,于是决定分析一下其中的数据包及其编码。 一、Protobuf的使用首先来简单介绍一下Protobuf的使用,这里以windows下Java开发为例,几个步骤:编写*.proto ->使用google提供的protoc.exe生成*.java->项目中导入protobuf的.jar包进行开发即可。先看这里的*.proto文件:
使用protoc.exe生成java文件,命令如下: 将生成的Msg.java及protobuf-java-2.3.0.jar导入项目中进行开发,这里写一个服务器端ProtobufServer及客户端ProtobufClient
运行结果: 二、抓包分析在上面socket通信过程中我使用了wireshark对其进行抓包,结果分析如下图 由上图我们可以很清楚的看到,protobuf编码其实类似tlv(tag length value)编码,其内部就是(tag, length, value)的组合,其中tag由(field_number<<3)|wire_type计算得出,field_number由我们在proto文件中定义,wire_type由protobuf根据proto中定义的字段类型决定,length长度采用一种叫做Varint 的数字表示方法,它是一种紧凑的表示数字的方法,用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数,具体细节可以谷歌Varint。总之Protobuf 序列化后所生成的二进制消息非常紧凑,这得益于 Protobuf 采用了上面的 Encoding 方法。 参考文献:http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 源码下载:http://download.csdn.net/detail/wangqiuyun/8294015 转载请注明:http://blog.csdn.net/wangqiuyun/article/details/42119835 |
|
来自: 阿修罗之狮猿授 > 《Unity网络通信》