使用 Wireshark 调试 HTTP/2 流量

标签: wireshark 调试 http | 发表时间:2015-10-24 23:21 | 作者:
出处:https://imququ.com

我们知道,HTTP/2 引入了二进制分帧层(Binary Framing),将每个请求和响应分割成为更小的帧,并对它们进行了二进制编码。与此同时,HTTP/2 沿用了之前 HTTP 版本中的绝大部分语义,上层应用基本上感知不到 HTTP/2 的存在,这一点可以通过浏览器的网络调试工具得到验证。以下是使用 Chrome 访问 HTTP/2 网站的截图,网络面板中显示的内容与 HTTP/1 网站相比,只有一些细微的区别(头部字段都是小写,多了一些冒号开头的头部等)。

imququ-network

那么究竟要如何调试 HTTP/2 流量呢?HTTP/2 中的 Server Push、Prioritization 等功能,要如何才能看到并分析呢?Chrome 本身提供了一个非常不错的工具,在 Chrome 地址栏输入 chrome://net-internals/#http2 即可进入。这个工具会列出浏览器当前所有活跃的 HTTP/2 Session,点击具体的 Session ID,可以看到全部帧信息。

但 Chrome 的工具看到的信息毕竟经过了解析和筛选,不如原始信息全面,也没办法在其他浏览器例如 Firefox 中使用。本文介绍一个更为通用的 HTTP/2 调试工具:Wireshark。

Wireshark 是一个无比强大的网络封包分析工具,大家对它应该不陌生。新版 Wireshark 才增加了对 HTTP/2 的支持,首先请从下面这个地址获取最新的安装包:

https://www.wireshark.org/download/automated/

根据自己系统选择合适的安装包后,全新或覆盖安装都可以。我在写本文时用的是「Wireshark 2.1.0-229-g3385c29 Intel 64.dmg」这个安装包。

由于主流浏览器都只支持 HTTP/2 Over TLS,也就是说当前 HTTP/2 网站都使用了 HTTPS,数据传输都经过了 SSL 加密。所以默认情况下,Wireshark 抓到的包是这样的,SSL 层之上的协议细节完全看不到:

wireshark-ssl

另外一个著名的 HTTP 抓包工具 Fiddler 是通过开启本地代理进行抓包的,它能够解密 HTTPS 流量的原理很简单:首先 Fiddler 作为客户端跟服务端建立 TLS 连接,使用服务端的证书,处理请求和响应;然后 Fiddler 又作为服务端跟浏览器建立 TLS 连接,使用 Fiddler 的证书,处理请求和响应。所以 Fiddler 要解密 HTTPS 流量,需要先把它生成的根证书添加到系统受信任的根证书列表之中。

Wireshark 的抓包原理是直接读取并分析网卡数据,要想让它解密 HTTPS 流量,有两个办法:1)如果你拥有 HTTPS 网站的加密私钥,可以用来解密这个网站的加密流量;2)某些浏览器支持将 TLS 会话中使用的对称密钥保存在外部文件中,可供 Wireshark 加密使用。本文重点介绍第二种方法。

Firefox 支持生成上述第二种方式的文件,具体格式见这里: NSS Key Log Format。但 Firefox 只会在系统环境变量中存在 SSLKEYLOGFILE 路径时才会生成它,先来加上这个环境变量(以 OSX 为例):

  mkdir ~/tls && touch ~/tls/sslkeylog.log

#zsh
echo "\nexport SSLKEYLOGFILE=~/tls/sslkeylog.log" >> ~/.zshrc && source ~/.zshrc

#bash
echo "\nexport SSLKEYLOGFILE=~/tls/sslkeylog.log" >> ~/.bash_profile && . ~/.bash_profile

接着,在 Wireshark 的 SSL 配置项里将这个文件选上。如下图:

wireshark-ssl-debug

通过终端启动 Firefox(确保能读取到环境变量):

  open /Applications/Firefox.app

这时候,再访问 HTTPS 网站,Firefox 应该会往 sslkeylog.log 文件中写入一些数据。检查无误后,就可以开启 Wireshark,选择合适的网卡开始抓包了(本文目的是抓取 HTTP/2 数据包,可以将 TCP 端口限定在 443,让抓到的数据少一些):

wireshark-capture

新版 Wireshark 在配置了 TLS 加密后,会自动识别并解析 HTTP/2 流量。通过 Firefox 访问想要抓包的 HTTP/2 网站,根据 IP 和协议过滤一下,就可以轻松看到想要的 HTTP/2 数据包了。如下图:

wireshark-http2

这种方法也可以用在解密使用 HTTP/1 的 HTTPS 网站上,大家可以自己动手试一试。

本文链接: https://imququ.com/post/http2-traffic-in-wireshark.html参与讨论

推荐: 领略前端技术 阅读奇舞周刊

相关 [wireshark 调试 http] 推荐:

使用 Wireshark 调试 HTTP/2 流量

- - JerryQu 的小站
我们知道,HTTP/2 引入了二进制分帧层(Binary Framing),将每个请求和响应分割成为更小的帧,并对它们进行了二进制编码. 与此同时,HTTP/2 沿用了之前 HTTP 版本中的绝大部分语义,上层应用基本上感知不到 HTTP/2 的存在,这一点可以通过浏览器的网络调试工具得到验证. 以下是使用 Chrome 访问 HTTP/2 网站的截图,网络面板中显示的内容与 HTTP/1 网站相比,只有一些细微的区别(头部字段都是小写,多了一些冒号开头的头部等).

wireshark过滤规则

- - CSDN博客推荐文章
WireShark 过滤 语法  . 过 滤 IP,如来源IP或者目标IP等于某个IP. ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP. tcp.port eq 80 // 不管端口是来源的还是目标的都显示. tcp.dstport == 80 // 只显tcp协议的目标端口80.

Wireshark 入门详解

- - 运维生存时间
一、 background 二、 how it works 三、包抓取方式 四、 filter in Wireshark.   Capture filter例子. 抓取所有本主机发送的报文,本机为2.2.2.2. 抓取与主机1.1.1.1.的1033端口的所有通信. 五、 Wireshark的安装 六、 Wireshark的实用功能.

wireshark使用教程

- - 互联网 - ITeye博客
 wireshark是一款抓包软件,比较易用,在平常可以利用它抓包,分析协议或者监控网络,是一个比较好的工具,因为最近在研究这个,所以就写一下教程,方便大家学习.        这里先说Wireshark的启动界面和抓包界面.        启动界面:. 这个是网卡的显示,因为我有虚拟机所以会显示虚拟网卡,我们现在抓的是真实网卡上的包所以在以太网卡右边点击start 开始抓包.

HTTP协议调试工具汇总,你心目中应该是什么样的?

- - FreeBuf互联网安全新媒体平台
本文收集了大量抓包工具,近40款,涵盖了各种开发语言(Java,C#,Delphi,C,C++,Objective-C,Node.js,Go,Python)、各类前端(GUI,TUI,CUI,Web UI,Browser Addon),请大家赏析. 英国PortSwigger团队开发,用起来很顺手,安全行业占有率很高,闭源、收费.

Wireshark 抓远程主机的包

- - 依云's Blog
本文来自 依云's Blog,转载请注明. 通常,我在本地用图形界面的 Wireshark 来抓包及解析,而对于远程服务器,因为没有图形界面,只好使用 tcpdump 抓包到文件然后复制到本地拿 Wireshark 看了,这样就不能实时查看抓到的包了. 当然 tcpdump 也可以实时输出,但是信息太少、难以阅读,功能也过于简单,比如我要跟踪流啊、不同的流用不同的颜色高亮啊、添加注释啊、时序分析啊,tcpdump 完全没办法做到.

Wireshark 过滤器语法 - 粪球

- - 博客园_首页
 wireshark有两种过滤器:.  捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中. 显示过滤器(DisplayFilters):用于在捕捉结果中进行详细查找. 捕捉过滤器 (此过滤器不需要比较运算符,查询关键字请全部小写). 捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件.

用 Wireshark 分析 TCP 吞吐瓶颈

- - 卡瓦邦噶!
Debug 网络质量的时候,我们一般会关注两个因素:延迟和吞吐量(带宽). 延迟比较好验证,Ping 一下或者 mtr 一下就能看出来. 这篇文章分享一个 debug 吞吐量的办法. 看重吞吐量的场景一般是所谓的长肥管道(Long Fat Networks, LFN, rfc7323). 吞吐量没有达到网络的上限,主要可能受 3 个方面的影响:.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.