Proxyman v26.0.0 终于支持 HTTP/2 抓包

Proxyman v26.0.0 终于支持 HTTP/2 抓包 的封面图

阅读约 5 分钟

HTTP/2 终于来了。macOS 版 Proxyman v26.0.0 已在正式版中包含 HTTP/2 支持,无需再单独下载 Beta 版应用。

如果你的应用使用 HTTP/2,现在就可以用 Proxyman 抓取这些流量。查看请求和响应、确认所用的协议,并继续使用你日常熟悉的过滤和调试工具。

此版本还为 PRO 用户带来了 Split View 和全新的类似 Safari 的 Tab View。两者都能让你在繁忙的抓包记录中,更方便地同时查看不同部分的内容。

HTTP/2 的意义

打开一个页面时,应用通常会同时发出多个请求。例如,它可能同时加载个人资料、获取列表并下载图片。这些请求共享连接的方式,会影响你在调试时看到的内容。

HTTP/2 改变了 HTTP 消息的传输方式:

  • 多个请求可以同时共享一个连接,每次请求-响应交换使用各自的流。
  • 头部压缩可以减少通过该连接重复发送的头部数据。
  • 复用连接可以减少新建 TCP 连接和重复进行 TLS 握手的需要。
  • 请求方法、URL、状态码和消息体的含义保持不变,你已经熟悉。

HTTP/2 标准详细说明了这些变化。它们可以降低开销,但并不会让每个请求都变快。服务端处理、网络状况和应用本身依然重要。另外,HTTP/2 基于 TCP,因此丢包可能会影响共享同一连接的请求。

对于调试来说,这一改进很实用。你可以直接检查使用 HTTP/2 的流量,而不必只依赖 HTTP/1.1 的抓包记录。当问题与协议协商或多个请求同时运行有关时,这一点尤其有帮助。

在设置中开启 HTTP/2

HTTP/2 默认关闭。开启方法如下:

  1. 在 Mac 上安装 Proxyman v26.0.0 或更高版本。
  2. 打开 Proxyman → Settings → General。
  3. 在 Proxy 部分,开启 Use HTTP/2。
  4. 如需检查 HTTPS 流量,请在客户端设备上安装并信任 Proxyman 证书。
  5. 为要检查的应用或域名开启 SSL Proxying。
  6. 从应用发起一个新请求,或刷新页面。
在 Proxyman 设置的 General 中开启 Use HTTP/2
在 Proxyman 设置的 General 中开启 Use HTTP/2

开始抓取 HTTP/2 流量

本演示展示了如何在 Proxyman 中开启 HTTP/2,并开始抓取新的请求。

更改 HTTP/2 设置会关闭现有连接,以便新连接使用新设置。正在进行的 WebSocket 和 Server-Sent Events 连接也可能需要重新连接。

如果你已经在使用 Proxyman 抓取 HTTPS 流量,证书和域名的设置无需改动。如果这是你第一次抓包,请参阅 SSL Proxying 指南。远程设备的流量也需要经由你 Mac 上的 Proxyman 转发。

可以检查哪些内容

选择一个已抓取的请求,即可查看该次交换的以下详细信息:

  • 请求方法、URL、查询参数和头部。
  • Cookie 和请求体,例如 JSON、表单数据或二进制内容。
  • 响应状态码、头部和响应体。
  • Trailer 头(当客户端或服务端在消息体之后发送时)。
  • 请求耗时以及记录下来的 HTTP 协议信息。
  • 连接详情,例如服务端协商的协议(如果有记录)。

共享同一 HTTP/2 连接的请求会在请求列表中分别显示为独立的交换记录。你可以逐个选择并检查其内容,无需直接阅读底层的二进制帧。

对于在响应体之后发送最终信息的 API,Trailer 很有用。例如,gRPC 响应可以在 Trailer 中携带 grpc-status 和 grpc-message。仅凭 HTTP 200 响应,无法判断该 RPC 调用是否成功。抓取到这些信息,并不代表每个二进制消息体都会自动变成可读文本。

确认请求实际使用的协议

开启 HTTP/2 只是允许 Proxyman 使用该协议,并不会强制每个连接都使用 HTTP/2。

需要考虑两段连接:

  • 你的应用或浏览器与 Proxyman 之间的连接。
  • Proxyman 与上游服务器之间的连接。

这两段连接可以使用不同的 HTTP 版本。客户端必须支持并协商 HTTP/2;上游服务器也必须支持,该连接才会使用 HTTP/2。Proxyman 允许回退到 HTTP/1.1。

发起一个新请求后:

  • 在请求详情中查看其 HTTP 版本。
  • 在 Request 面板中打开 Connection Log,查看记录下来的上游协议。
  • 查看服务端实际接受的协议。h2 表示 HTTP/2。
  • 请注意,协商时提供 h2 并不能证明服务端选择了它。

在本例中,Proxyman 提供了 h2 和 http/1.1,服务端接受了 h2。

HTTP/2 Connection Log,显示服务端在 Proxyman 中接受了 h2
HTTP/2 Connection Log,显示服务端在 Proxyman 中接受了 h2

较早保存的抓包记录可能不包含上游协议详情。缺少这些信息并不代表该连接使用的是 HTTP/1.1。Connection Log 指南介绍了如何解读记录的各个步骤。

使用 Split View 和标签页对比流量

假设你的应用可以正确加载个人资料,但无法加载活动列表。在复现问题时,可以让两个接口同时可见:

  1. 在侧边栏中右键点击应用或域名,选择 Open as Split View。
  2. 在第一个窗格中过滤出个人资料接口。
  3. 在第二个窗格中过滤出活动列表接口。
  4. 分别在两个窗格中选择一个请求,对比它们的状态码、头部和消息体。

每个窗格都保留各自的过滤条件和选择状态。两者使用同一份抓包记录,因此新请求在任一视图中都可以看到。

如需进行其他排查,请选择 Open as New Tab 或按 ⌘T。在标签页之间切换时无需重新设置过滤条件,还可以拖动标签页调整顺序。Split View 和 Tab View 需要 Proxyman PRO。

如果仍然看到 HTTP/1.1

  • 确认已开启 Use HTTP/2,然后发送一个新请求。
  • 确认客户端和服务端都支持 HTTP/2。回退属于正常情况。
  • 如果 HTTPS 内容仍然是加密的,请检查证书信任和 SSL Proxying。
  • 确认你的应用或设备的流量确实经过 Proxyman。
  • 如果应用拒绝连接,请检查其证书要求,包括 SSL Pinning。

延伸阅读

下载此版本,开启 HTTP/2,然后抓取你想要了解的请求。

Noah Tran
Noah Tran

开始抓取 HTTP/2 流量

下载 macOS 版 Proxyman,在设置中开启 Use HTTP/2,然后检查一个新请求。

下载 macOS 版 Proxyman