通过抓包分析gPRC协议

news/2024/5/17 15:14:05 标签: http2, grpc, tcp, 远程调用, protobuf

通过抓包分析gPRC协议

前言

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底层使用protobuf作为传输协议,wireshark支持对protobuf的解析,不过我们要提前做一些配置。
在这里插入图片描述
在这里插入图片描述

路径那里选择一个路径,可以把所有的proto文件都放在这里,wireshark可以自动扫描。

另外还有一点,我用来演示的demo,是gRPC的官方示例helloworld程序,其中server使用的端口是50051,为了避免数据太多,可以把端口过滤也加下。
在这里插入图片描述

设置好我们就可以开始抓包了,分别启动helloword的server和client,代码的地址是:

https://github.com/grpc/grpc-go/tree/master/examples

我们看下抓到的包

在这里插入图片描述

50051是服务端代码指定的接口,63281客户端随机生成的端口。我们可以看到一次gRPC调用会有多次TCP的通讯,不过这个TCP级别的包没那么容易看懂,前面介绍过gRPC是通过HTTP/2 协议通讯的,我们可以把这个抓的包转为HTTP/2再分析。如下图所示。

在这里插入图片描述

现在可以看到HTTP2和GRPC了,我们直接用http2关键字再过滤下,这样可以直接看http2相关的协议。

在这里插入图片描述

从上面这个图,我们基本上对一次gRPC通讯有个大概的轮廓了:

Magic->Settings(四个)->Headers->Data->Window-update,Ping->Ping->Headers,Data->Window_update,ping->Ping

上面这些东东,在http2里是不同的帧,比如magic帧,settings帧等。

先来看看magic帧,

在这里插入图片描述

magic帧的内容是固定的,如下:

HTTP/2.0\r\n\r\nSM\r\n\r\n

Magic 帧是http2用来建立连接的,之后紧跟着 SETTINGS 帧。settings帧如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

settings帧也算是http2连接的一部分,四次交互,用来传递通讯参数。第一次settings是客户端发给服务端的,服务端回一个settings,带上参数mmax frame size:16384,这是告诉客户端,服务端愿意接受的包体大小为 16364 个字节。然后客户端和服务端各回一个settings进行确认。

接下来是headers帧,如下图:

在这里插入图片描述

可以看到,headers帧里面包含的数据很多,包括

  • method(POST)
  • scheme(http)
  • path(/helloword.Greeter/SayHello)
  • content-type(application/grpc)

等。

这个帧是客户端请求的请求头部分。

然后是data帧,如下图:

在这里插入图片描述

data帧是客户端向服务端发送请求携带的数据,我们可以看到它具体发送的数据是world这个字符串。另外可以看到gRPC 数据由 gRPC 包头(5 字节)+gRPC 包体(7 字节)组成,gRPC 包头的压缩标志为 Not Compressed(未压缩)。

然后是一个window_update帧和ping帧,

在这里插入图片描述

window_update 帧主要用于流量控制,你看上图有个字段叫Window Size Increment,表示流量窗口增量,这个是跟客户端约定的发送窗口大小。

ping帧,客户端向服务端发送ping帧,服务端回复pong,目的是探活。

在这里插入图片描述

接下来是服务端回复 HEADERS 帧+DATA 帧(gRPC)+HEADERS 帧(终止流)

在这里插入图片描述

headers帧里包含http响应码(200),data包含发送的数据信息,最后的headers是终止通讯的。

最后还有一个window_update帧和两个ping帧,前面已经讲过了。

最后用一个流图来总结下gRPC中http2的通讯流程。

在这里插入图片描述

总结

本文通过抓包分析了gRPC通讯的过程,gRPC是基于HTTP2进行网络传输的,所以主要是基于http2的帧进行分析的。希望对你有所帮助。


http://www.niftyadmin.cn/n/56955.html

相关文章

【Java基础】018 -- 面向对象阶段项目下(拼图小游戏扩展)

文章目录切换游戏图片的业务分析:1,所需要的技术点2,分析业务逻辑项目实现步骤:添加组件绑定事件:代码实现登录界面的业务分析:1,所需要的技术点2,分析业务逻辑项目实现步骤:主界面设…

雅思经验(十三)

感觉这篇其实有点小难,我在精听的才发现那是六个实验对象,但是叫做six subjects在精听的时候感觉有些手忙脚乱,像是一团乱麻一样,但是也是没有什么关系。其实这才是查漏补缺,cello player 这是大提琴师violinists 小提…

基于spring boot +opencv 实现车牌识别、人脸识别、证件识别等功能 附完整代码 毕业设计

界面展示: 这是一个基于spring boot + opencv 实现的项目贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点以学习交流为目的&

【数据结构】双向链表的模拟实现(无头)

目录 前言: 1、认识双向链表中的结点 2、认识并创建无头双向链表 3、实现双向链表当中的一些方法 3.1、遍历输出方法(display) 3.2、得到链表的长度(size) 3.3、查找关键字key是否包含在双链表中(contains) 3.…

FyListen——生命周期监听器,告别内存泄漏!(上:使用方法)

快速使用: //一句话让你随心所欲监听生命周期 FyListen.listenTo(this,new LifecycleListener(){...} );0. 依赖导入 step1: 在项目根 build.gradle 中导入 allprojects {repositories {...maven { url https://jitpack.io }} }step2: 添加依赖: dep…

OJ万题详解––[NOIP2004 提高组] 合并果子(C++详解)

目录 题目 分析 参考代码 题目 题目描述 一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的…

【2023】Prometheus-Alertmanager高可用集群

本次实验准备了三个节点,分别为laert-01~03 目录1.安装Alertmanager2.配置启动文件3.验证集群4.关于集群的配置项1.安装Alertmanager 这部分内容在三个节点上都要执行 下载安装包,将安装包解压至/data目录下 wget https://github.com/prometheus/aler…

TCP、UDP网络编程面试题

TCP、UDP、Socket、HTTP网络编程面试题 什么是网络编程 网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式…