1.说明
对通过GRPC协议进行通信的流量进行抓包后,
需要先转换为HTTP2协议,
因为默认解析的HTTP协议和TCP协议无法进行后续的查看操作,
然后再通过加载protobuf文件,
对GRPC内的DATA字段进行解码。
2.抓包
本文为了测试方便,使用了本地启动GRPC客户端和服务端的方式,
可以参考文章[[gRPC创建Java-RPC服务]]。
打开Wireshark工具,对本地的loopback网卡进行抓包:
如果觉得抓包的无关内容过多,
可以设置捕获过滤的tcp端口为50051:
tcp.port == 50051
首先启动服务端,然后调用客户端,
即可抓包到如下内容:
3.查看
gRPC协议栈分层模型如下:
分层 | 说明 |
---|---|
消息内容层 | 业务模块的通信双方需要了解彼此的数据模型,才能正确处理数据 |
Protocol Buffers编码层 | gRPC通过Protocol Buffers编码格式承载数据 |
gRPC层 | 远程过程调用,定义了远程过程调用的协议交互格式 |
HTTP层 | gRPC承载在HTTP/2协议上 |
TCP层 | TCP连接提供面向连接的、可靠的数据链路 |
在查询具体的抓包内容时,可以根据协议栈去看。
3.1.关联HTTP2协议
Wireshark对抓包的内容默认解析为HTTP协议,
需要将协议转换为HTTP2协议,
方法为在抓包数据上面右键,选择Decode As...
将tcp的50051的端口绑定到HTTP2协议:
3.2.查看GRPC协议
正常情况下,转为HTTP2协议后,
可以看到GRPC协议,以及GPRCHTTP2协议了:
3.3.查看Protobuf编码的内容
此处需要在Protobuf协议中配置hello_stream.proto文件,
Wireshark才能解析出具体的DATA字段中的二进制内容,
选中Protobuf的前面四条配置:
然后点击Portobuf search path后面的Edit...,
选择你的proto文件所在的目录:
然后就可以看到请求中的name字段了: