wireshark分析grpc协议

0 前言

官方的:

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

个人理解的:
grpc是一个在服务端和客户端之间传输的协议,相比于手动写客户端和服务端代码,简化了很多,使用体验也很好。grpc在传输中,使用的数据序列化格式是probutof,这种序列化格式效率很高,比XML和json更为节省空间,但是人眼很难识别。

使用grpc时,在发送数据的一方,会序列化要发送的数据,在接收数据的一方,会反序列化数据,当使用抓包工具wireshark进行抓包时,是可以抓到传输的数据的。

注:使用TLS加密时,是看不到数据的,本文章中的传输,都不使用TLS传输。

1 proto文件

本文要使用的样例demo.proto,内容如下:

demo.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
syntax = "proto3";
package proto;

enum ClassName {
demo = 0;
class1 = 1;
class2 = 2;
class3 = 3;
}

message Student {
string name = 1;
int32 age = 2;
string address = 3;
ClassName cn = 4;
}

message Students {
repeated Student person = 1;
string school = 2;
}

service Hello {
rpc SayHello(Student) returns (Students) {}
}

// protoc -I . --go_out=plugins=grpc:. ./*.proto

2 wireshark配置

2.1 版本要求

wireshark版本要大于3.2.0:

  • Protobuf files (*.proto) can now be configured to enable more precise parsing of serialized Protobuf data (such as gRPC).
  • The message of stream gRPC method can now be parsed with supporting of HTTP2 streaming mode reassembly feature.
  • User can specify protobuf search paths (where has *.proto files).

3.2版本添加了对grpc的支持,只需要设置就行,而以前的版本需要自己写lua插件,很麻烦,不推荐。

2.2 设置——添加proto文件

打开wireshark主面板,编辑-首选项,选择Protocols,在其中找到protobuf选项:
wireshark设置
把箭头指的方框打上勾,在点击edit按钮:
wireshark设置
选择路径,这个路径下存放proto文件,注意把load all选中:
wireshark设置
把用到的所有proto文件都放在这个路径下面,尤其是引用的第三方proto文件,wireshark会自动识别。

注:官方的第三方proto文件,主要是google/protobuf下面的,选择相应的版本,下载之后,解压,里面的bin目录下的proto.exe,是用来生成pb文件的,include目录下面,就是官方的文件,把google目录复制到前面指定的proto路径下。

3 解析

正常的捕获文件,wireshark原本的解析应该是类似这样的:
wireshark设置
右键,选择“解码为”,进行如下设置:
wireshark设置
选择http2协议,OK之后,数据就被解析出来。

4 大致原理

原来的wireshark解析,只把tcp协议解析出来,剩下payload部分,而grpc协议使用的是http2协议,因此下一步手动指定http2协议,之后wireshark就会自动解析grpc和protobuf。
解析protobuf时,会自动的与2.2中读取到的proto文件的message部分匹配,进行字段的解析。如果没有proto文件,wireshark会把简单字段的值解码出来,但是不知道这些值代表的含义,对于复杂字段,直接就是二进制,无法解析。

5 参考

抓包gRPC的细节及分析

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 zhanglonglong
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信