通过抓包分析gPRC协议

news2024/11/17 20:21:58

通过抓包分析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.coloradmin.cn/o/338885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows + vscode + rust

1 安装VSCODE略2 安装rust插件1、说明:第4步本人是一个一个点击状态。上图禁用按钮在没装之前是显示“安装”按钮,应该点击“安装”也可以。2、还需要安装C插件,搜索C即可,装微软的3 创建rust工程由于初次使用,不知道目…

实战项目-课程潜在会员用户预测(朴素贝叶斯&神经网络)

目录1、背景介绍2、朴素贝叶斯2.1 模型介绍2.2 模型实现3、人工神经网络1、背景介绍 目标:将根据用户产生的数据对课程潜在的会员用户(可能产生购买会员的行为)进行预测。 平台的一位注册用户是否购买会员的行为应该是建立在一定背景条件下…

TCP、UDP网络编程面试题

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

linux 进程

文章目录1、进程的状态2、进程的组织3、进程的控制3.1、进程的创建fork 函数fork 拷贝和共享fork 原理fork 的写时复制exec 函数族exec 原理3.2、进程的终止exit 函数* 僵死进程* 孤儿进程3.3、进程的阻塞和唤醒3.4、进程的切换4、进程间通信5、进程调度算法进程是可执行程序的…

特斯拉无人驾驶解读

来源于Tesla AI Day Tesla无人驾驶算法的核心任务就是如何理解我们所看到的一切呢?也就是说,不使用高端的设备,比如激光雷达,仅仅使用摄像头就能够将任务做得很好。Tesla使用环绕型的8个摄像头获得输入。 第一步是特征提取模块Backbone,无论什么任务都离不开特征…

chatgpt怎么安装?国内怎么玩chatgpt?

关于chatgpt的传言最近真的是闹得沸沸扬扬,主要是这个chatgpt人工智能的冲击力实在是太大了,它学习了大量的语言知识,具有很强的语言能力,无论是写作,还是诗歌,甚至是代码都是不在话下,美国大学…

【数据库】 如何对数据库进行操作

目录 一,SQL语句基础 1, SQL简介 (1) SQL语句分类 (2)SQL语句的书写规范 二,数据库操作 1、查看 (1)查看所有数据库 (2)查看有没有指定的数…

ubuntu20下Qt5.14.2+OpenCV(含Contrib)-4.5.0环境搭建

Qt若要能处理图片和视频,就必须安装OpenCV,而OpenCV中很多的高级功能如人脸识别等都包含在Contrib扩展模块中,需要将Contrib与OpenCV一起联合编译,目前所用这两个版本都是4.5.0版。 一、下载OpenCV OpenCV的官方下载地址为http:…

SSM整合SpringSecurity简单使用

一、SpringSecurity 1.1 什么是SpringSecurity Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。(官网地址) Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发…

用网络调试助手测试PLC-Reocrder收听模式的过程

目录 一、测试环境 二、步骤及要点说明 1、PLC-Recorder的通道配置 2、PLC-Recorder启动采集 3、配置网络调试助手 4、启动调试助手的连接,并点击“启动批量发送” 5、停止发送,查看发送和接收的情况 三、小结 一、测试环境 Windows10操作系统&a…

Docker进阶 - 11. Docker Compose 编排服务

注:本文只对一些重要步骤和yml文件进行一些讲解,其他的具体程序没有记录。 目录 1. 原始的微服务工程编排(不使用Compose) 2. 使用Compose编排微服务 2.1 编写 docker-compose.yml 文件 2.2 修改并构建微服务工程镜像 2.3 启动 docker-compose 服务…

数据结构(二):单向链表、双向链表

数据结构(二)一、什么是链表1.数组的缺点2.链表的优点3.链表的缺点4.链表和数组的区别二、封装单向链表1. append方法:向尾部插入节点2. toString方法:链表元素转字符串3. insert方法:在任意位置插入数据4.get获取某个…

RNN神经网络初探

目录1. 神经网络与未来智能2. 回顾数据维度和神经网络1. 神经网络与未来智能 2. 回顾数据维度和神经网络 循环神经网络,主要用来处理时序的数据,它对每个词的顺序是有要求的。 循环神经网络如何保存记忆功能? 当前样本只有 3 个特征&#x…

git基本概念图示【学习】

基本概念工作区(Working Directory)就是你在电脑里能看到的目录,比如名字为 gafish.github.com 的文件夹就是一个工作区本地版本库(Local Repository)工作区有一个隐藏目录 .git,这个不算工作区&#xff0c…

新方案:从错误中学习,点云分割中的自我规范化层次语义表示

前言 LiDAR 语义分割通过直接作用于传感器提供的原始内容来完成细粒度的场景理解而受到关注。最近的解决方案展示了如何使用不同的学习技术来提高模型的性能,而无需更改任何架构或数据集。遵循这一趋势,论文提出了一个从粗到精的设置,该设置从…

查找与排序 练习题

1、下列排序算法中,▁▁B▁▁ 是稳定的。 A.简单选择排序 B.冒泡排序 C.希尔排序 D.快速排序 解析:稳定排序是每次排序得到的结果是唯一的,不稳定排序得到的结果不唯一。 稳定:冒泡排序、归并排序、基数排序 不稳定&#x…

DolphinSchedule基于事件驱动的高性能并发编程

文章目录前言前置知识异步编程基于时间驱动的异步编程模式(EAP Event-based Asynchronous Pattern )实现EAPDolphinSchedule结合Netty实现Master与Worker之间的高性能处理能力的设计方案设计代码实现总结前言 研究DolphinSchedule的内因在于对调度系统并…

内存访问局部性特征

分享一道360的C语言笔试题。x是一个行列均为1000的二维数组,下面代码运行效率最高的是哪个? 二维数组大家都很熟悉,正常人遍历二维数组都是一行一行来的,为什么很少有人按列去遍历? 这道笔试题其实考察的就是遍历效率…

#车载基础软件——AUTOSAR AP技术形态

车载基础软件——AUTOSAR AP技术形态 我是穿拖鞋的汉子! 今天是2023年2月11日,时间好快,疫情解封已好几个月,生活节奏也在逐渐恢复到三年前的节奏。可能是感觉疫情与自己距离变远了,大家也开始慢慢的不再恐惧! 老规矩分享一段喜欢的文字,避免自己成为高知识低文化的工…

【安全】nginx反向代理+负载均衡上传webshell

目录 一、负载均衡反向代理下上传webshell Ⅰ、环境搭建 ①下载蚁剑,于github获取官方版: ②下载docker&docker-compose ③结合前面启动环境 ④验证 负载均衡下webshell上传 一、负载均衡反向代理下上传webshell 什么是反向代理? 通常的代…