what?
wireshark(前称Ethereal)是一个免费开源的网络数据包分析软件。网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包资料。
在过去,网络数据包分析软件是非常昂贵,或是专门属于营利用的软件,然而Wireshark的出现却改变了这种生态。[原创研究?]在GNU通用公共许可证的保障范围底下,用户可以以免费的代价获取软件与其代码,并拥有针对其源代码修改及定制的权利。Wireshark是目前全世界最广泛的网络数据包分析软件之一。
1997年底,Gerald Combs需要一个能够追踪网络流量的工具软件作为其工作上的辅助。因此他开始撰写Ethereal软件。
2006年6月,因为商标的问题,Ethereal更名为Wireshark。
-- 摘自维基百科
why?
日常开发中,我们经常会遇到需要抓包的场景。通过抓包,我们可以验证接口响应的结果是否与我们预期一致。市面上有非常多的抓包软件,以mac平台为例,charles便是其平台上使用非常广泛的抓包软件。charles非常优秀,界面简洁优美,展示也非常清晰。但是charles能够抓取到的网络包有限,当出现以下情况的时候,charles也许就无能为力了:
- 抓取非HTTP包,比如你想抓包体验TCP三次握手的过程
- 抓取未经设置的flutter应用时,使用charles抓取不到数据包
- ...
为什么flutter的应用发出的请求charles无法抓取到呢?
这跟charles这类软件的工作原理有关系,charles会启动一个代理服务器,当客户端系统配置代理以后,请求包会经由charles的代理服务器到互联网中,因此charles才能够抓取到请求包。但是这种情况有个前提:就是当客户端系统配置代理以后,客户端软件要用客户端系统中的代理进行访问。
但是flutter中的网络库,默认情况下不会使用系统代理。这也就是为什么你配置了系统代理仍然抓取不到flutter包的原因。
为什么wireshark拥有比charles更强的能力呢?
不同于charles,wireshark工作的时候,会借助Winpcap(windows)/Libpcap(linux)/AirPacp(无线网卡驱动)直接与网卡进行数据交换,进出网卡的数据流量都能被wireshark所捕获。因此,就比基于代理原理的抓包工具拥有更强的能力。(这里说网卡也许不那么准确,准确来说是 Network Interface 不过一般来说interface对应实体网卡,但是也可以对应虚拟网卡。关于Network Interface的具体含义可以参考JDK官方文档:https://docs.oracle.com/javase/tutorial/networking/nifs/definition.html)
(正在监听底层数据网卡流量的wireshark)
how?
使用wireshark抓取本机
所谓本机就是运行wireshark的机器,只需要在wireshark启动的时候选择想要捕获的网卡即可。
使用wireshark抓取手机
以iphone为例可以参考:https://www.jianshu.com/p/428503609bc1
使用wireshark抓取虚拟机/模拟器
抓取手机上的网络包时候,还是需要做一些前置配置的,比如上面抓取iphone的包。如果你没有数据线,或是懒得将目光在自己的手机和电脑之间切换。那么在电脑上装上一个安卓虚拟机/模拟器或是ios虚拟机/模拟器应该是个更好的选择。由于虚拟机/模拟器的流量是通过宿主机的网卡发送到互联网上,因此,启动模拟器之后,你只需要像监听宿主机的网卡即可捕获到模拟器中的流量。
wireshark使用界面
1》开始捕获数据包
2》停止捕获数据包
3》停止然后重新捕获数据包
4》捕获过程的设置,比如设置捕获哪些网卡。只有在捕获停止的时候才能进行设置,正在捕获时不能设置。
5》打开自己曾经捕获的数据包文件
6》保存当前捕获的数据包为文件
7》关闭当前打开的数据包文件
8》重载当前打开的数据包文件
9》可以对包中的文本进行搜索
10》选中当前记录的上一条记录
11》选中当前记录的下一条记录
12》跳到指定编号的包记录
13》跳到当前捕获包列表中的第一条记录
14》跳到当前捕获包列表中的最后一条记录
15》抓取过程中,自动定位到最下面一条记录(最新的记录),可以想象成linux中的tail命令
16》使用预定义的颜色规则对捕获的包进行着色
17》放大界面
18》缩小界面
19》重置界面
20》自适应界面
21》捕获的包列表,每个记录为一个包
22》捕获包的具体内容 该内容显示结果对用户不友好,可以借助23来分析包内容
23》包的分层解析结果 以一条http请求包为例,wireshark会解析出该包每层内容
如下图所示1为http协议,2为tcp协议,3为ip协议
24》包搜索框,与9功能不同的是:此处填写的是符合wireshark定义规则的包过滤表达式,可以理解为数据库中的sql语句。
包过滤表达式
当我们想要过滤出来源ip为10.0.0.5的数据包时,我们可以在表达式搜索框24中输入以下表达式语句:
ip.src==10.0.0.5
问题在于:
ip这个名字是怎么来的?
怎么知道ip有src这个属性的?
除了等号运算之外表达式还支持什么逻辑运算?
前两个其实是同一个问题:
可以通过 view->internals->supported protocols 查看wireshark能够支持的协议,以及每个协议的属性。
从上图就可以知道,wireshark支持你过滤http协议的包,并且,你也知道了http协议有很多属性,其中3处http.accept就意味着你可以用这个属性去过滤包了。
最后除了等号以外,wireshark还支持以下运算符,其中,english的写法和c风格的写法是一样的,意味着你在
ip.src == 10.1.1.10 与 ip.src eq 10.1.1.10 的过滤效果是相同的