为什么是 Wireshark

网络出问题的时候,“感觉很慢"“连不上"这类描述基本没法排查,真正有用的是抓包看数据到底发生了什么。Wireshark 是这个领域的事实标准——开源、免费、跨平台,协议库覆盖了几乎所有你能遇到的协议,从最基础的 TCP/IP 到 HTTP/2、TLS、DNS,甚至各种私有协议都能解析。

它不只是排障工具。想理解 TCP 三次握手到底长什么样、TLS 握手交换了什么、DNS 查询的完整过程,打开 Wireshark 抓一次包,比看十篇文章都直观。

安装

Windows、macOS、Linux 都有官方安装包,官网下载即可。

Linux 下有个细节:普通用户默认没有抓包权限,需要把自己加入 wireshark 用户组:

sudo usermod -aG wireshark $USER

加完组之后要重新登录才生效,不然会发现列表里的网卡全是灰的,点不动。

界面速览:从打开到抓到第一个包

打开 Wireshark,首页是网络接口列表——有线网卡、WiFi、还有一些虚拟网卡(VPN、虚拟机网卡等)。每个接口旁边有个实时流量的小波形图,大致能看出哪个接口当前有流量。

双击想抓的接口,立刻开始实时捕获,界面会不断刷新滚动。这时候数据包已经在飞了,接下来的重点是怎么从里面找到你要的东西。

主界面分三块:

  • 上方包列表:每一行是一个数据包,显示时间、源地址、目的地址、协议、长度和简要信息
  • 中间包详情:点击某一行,下方展开这个包的分层结构——以太网帧 → IP 层 → TCP/UDP 层 → 应用层协议,逐层可以点开看具体字段
  • 下方十六进制视图:包的原始字节内容,对应详情面板里选中的字段会高亮

刚开始不用管十六进制视图,重点在过滤器和包详情。

过滤器:真正的核心功能

不用过滤器直接看几万个包是没法工作的。顶部的过滤器输入框(display filter)是 Wireshark 最重要的功能,输入表达式后按回车即可筛选。

常用过滤器示例:

ip.addr == 192.168.1.1        # 只看某个 IP 相关的包(双向)
ip.src == 192.168.1.1         # 只看从这个 IP 发出的包
tcp.port == 443                # 只看某端口(不区分源/目的)
http                            # 只看 HTTP 流量
dns                             # 只看 DNS 请求和响应
tcp.flags.syn == 1              # 只看 TCP 握手中的 SYN 包
http.response.code == 404       # 只看 404 响应
tls.handshake.type == 1         # 只看 TLS Client Hello

过滤器支持逻辑组合:

ip.addr == 192.168.1.1 && tcp.port == 443
http || dns

输入过滤条件时框内会有颜色提示——绿色是语法正确,红色是错误,这个反馈很及时,写复杂表达式时不用等按回车才知道对不对。

Follow Stream:还原一次完整会话

排障时经常需要的不是单个包,而是"这次 HTTP 请求到底发生了什么”。右键任意一个包,选择 Follow → TCP Stream(或 HTTP Stream),Wireshark 会把这次会话的所有往来数据拼在一起,按时间顺序展示,客户端发的和服务端回的用不同颜色区分。

这个功能对调试接口问题特别有用——比如怀疑某个请求头没发对,或者想确认服务端返回的响应体内容,Follow Stream 比逐个包翻快得多。

统计功能:宏观视角

单个包看多了容易只见树木不见森林,Statistics 菜单提供了几个有用的宏观视图:

  • Protocol Hierarchy:这次抓包里各协议分别占多少流量,一眼看出主要流量类型
  • Conversations:按 IP 对或端口对聚合,看谁跟谁通信最多
  • I/O Graph:流量随时间变化的图表,判断是持续高流量还是某个时间点突发

实战案例:排查一次"网站打不开”

假设遇到某个网站间歇性打不开,用 Wireshark 排查的大致思路:

  1. 先抓包再复现问题:打开抓包,然后立刻访问那个网站,让 Wireshark 记录完整过程
  2. 过滤 DNS:输入 dns,确认域名解析是否正常返回、有没有超时重试
  3. 过滤目标 IP:解析出 IP 后,用 ip.addr == 目标IP 单独看这次连接
  4. 看 TCP 握手:搜索 tcp.flags.syn == 1,确认 SYN 包发出后有没有收到 SYN-ACK。如果只有 SYN 没有回应,说明是网络层或防火墙问题,跟应用层无关
  5. 看有没有重传:过滤 tcp.analysis.retransmission,如果这里有大量结果,说明链路存在丢包,是"慢"和"偶尔连不上"的常见原因
  6. 看 TLS 握手(如果是 HTTPS):过滤 tls.handshake,确认握手是否顺利完成,有没有在某个阶段卡住或被重置

按这个顺序走一遍,通常能把问题定位到具体哪一层——是 DNS、是网络连通性、是丢包,还是应用层本身的问题。

小结

Wireshark 的学习曲线主要在过滤器语法和协议知识上,但入门门槛不高:先学会几个常用过滤器、学会 Follow Stream,遇到具体问题就够用了。协议细节可以在实际抓包中慢慢积累,不需要一开始就系统学完 TCP/IP。

它也是免费学协议最直观的方式——与其看文字描述三次握手,不如自己抓一次包,亲眼看着 SYN、SYN-ACK、ACK 三个包依次出现。