包头企业网站制作,电子商务工资多少钱一个月,青海省建设网站价格低,免费搭建网站教程昨天在本地执行 grpc 的 quick start#xff08;python版本的#xff09;#xff0c;我了解 grpc 内部使用的是 HTTP2#xff0c;所以我就想着抓包来试试#xff0c;下面就来记录一下这个过程中的探索。
注意#xff1a;我的电脑上面安装了 Fiddler Classic#xff0c;…昨天在本地执行 grpc 的 quick startpython版本的我了解 grpc 内部使用的是 HTTP2所以我就想着抓包来试试下面就来记录一下这个过程中的探索。
注意我的电脑上面安装了 Fiddler Classic不过它并不支持 HTTP2最新的 Fiddler Everything 支持不过这个是收费版本的我就去下载了 mitmproxy 这个开源的软件。
一、网络代理回顾 代理软件的工作原理是你想要抓包的软件自动检测到了代理或者你手动设置了代理然后你的数据不是直接发送给服务端而是它发送给代理代理帮你发送给服务端。例如常见的浏览器或者安卓程序并不是你开启了代理流量就会自动被代理捕获虽然看起来像是这样但是实际上还是有区别的。 所以实质是软件内部是有两种上网方式一个是直连服务器一个是通过代理连接服务器。这里以 Python 的 requests 包为例来举例:
代理上网requests.get(http://ip:port, proxiesproxies)
正常上网requests.get(http://ip:port) 所以因为代理上网是一个常见的需求所以大部分的软件是支持网络代理的。这里我说软件而不是程序因为软件是要给更大的概念它包括了程序。grpc 本身是支持代理的不过需要手动来指定代理服务器的配置。
二、启动 mitmweb 且设置系统代理 三、本地环境抓包
首先尝试在本地环境进行抓包测试这里按照 grpc 的 quickstart 步骤做就行了。
1.启动 grpc demo 服务端 2.启动 grpc demo 客户端
我使用默认的 cmd 执行失败而且 powershell 也不支持这个语法真是令人头疼 然后我就换成了 Git Bash 了它就可以了。 成功抓到了数据包不过这个默认的样式太丑了识别成了 TCP数据也有乱码。 注意Windows 本身的终端各种语法都不一样而且总是有奇怪的问题出现。因为现在大多数开发环境都是 Linux所以命令肯定也是要以 Linux 上的为准。以后还是尽量用 Git Bash 了用起来舒服一些。
三、容器环境抓包
在 Windows 上面使用它的终端总感觉不得劲因为我是 WSL2所以我直接用 WSL2 的终端了。但是我发现一个问题我在容器内部访问 localhost它居然指向的是我的Windows不知道为什么在 Windows 上面的开发环境感觉总是有奇怪问题所以我还是转向虚拟机吧。
这是我构建测试镜像的 Dockerfile 文件
FROM python:3.12
RUN python3 -m pip install --upgrade pip \ python3 -m pip install grpcio \ python3 -m pip install grpcio-tools
CMD [/bin/bash]构建镜像的命令docker build -t rpc_py:0.1 .
注意mitmproxy 代理还是在本地运行的。
1.启动 grpc demo 服务端
docker run -it -v $(pwd)/grpc:/home/grpc -p 50051:50051 -e http_proxyhttp://192.168.8.162:8080 rpc_py:0.1
我的 grpc 代码是拉取到了本地然后挂载到镜像中的同时做了一个端口映射把服务端的端口暴露出来了指定了 http_proxy 这个环境变量。 2.启动 grpc demo 客户端
首先先修改 greeter_client.py 文件中的访问地址原先是 localhost把它改成虚拟机的 ip 地址。 在新的终端中使用 docker exec 打开交互式终端然后直接指向 python greeter_client.py 既可观察到抓包的信息了不过这里的信息只是可以看到显示是有问题的这个之后有机会再研究吧。 3.网络图
上面这样做看起来有些奇怪这里我放一张图片来解释一下吧。我的虚拟机是在局域网的另一台机器上的我的代理软件 mitmproxy 是在 Windows 上面运行的。我在容器中将服务的端口暴露出去然后客户端请求的地址是虚拟机的 ip暴露端口。也就是说客户端虽然和服务器都在同一个容器中但是它不是直接访问的而是先出去容器经过代理服务器然后进入容器主打的就是一个舍近求远。 PS: 在 WSL2 中遇到了奇怪的网络问题这里也提一下吧。
在 WSL 中的容器内抓包有一个问题就是这个正确结果不是一定返回的会莫名出现错误的结果。一开始全是错误的结果我也不知道哪里的问题。但是之后尝试发现是有的有结果有的报错真是奇怪了。 正确的结果和错误的结果都可以在 mitmproxy 中看到