跳转到内容

Wireshark 抓包入门指南

Wireshark 是网络协议分析领域的事实标准,开源、免费、跨平台,协议库覆盖 TCP/IP、HTTP、DNS、TLS 等几乎所有你能遇到的协议。排查”网络慢""连不上”这类问题,抓包看数据实际发生了什么,比任何猜测都可靠。

Windows / macOS

wireshark.org 下载对应平台的安装包,按提示安装即可,Windows 版会附带 Npcap 驱动(抓包必需)。

也可以用 Scoop 安装:

Terminal window
scoop install wireshark

Linux(以 Debian/Ubuntu 为例)

Terminal window
sudo apt install wireshark

打开 Wireshark,首页列出所有网络接口(有线网卡、WiFi、VPN 虚拟网卡等),旁边有实时流量小图。双击想抓的接口即可开始实时捕获。

Wireshark 附带的命令行工具,适合无图形界面的服务器:

Terminal window
tshark -i eth0
Terminal window
tshark -i eth0 -w capture.pcap
Terminal window
tshark -i eth0 -c 100 -w capture.pcap
Terminal window
tshark -r capture.pcap

过滤器是 Wireshark 最核心的功能,不用过滤器直接看几万个包基本无法工作。

ip.addr == 192.168.1.1
ip.src == 192.168.1.1
ip.dst == 192.168.1.1
tcp.port == 443
http
dns
tls
tcp.flags.syn == 1
tcp.flags.reset == 1
http.response.code == 404
http.request.method == "POST"
tcp.analysis.retransmission
ip.addr == 192.168.1.1 && tcp.port == 443
http || dns

排障时经常需要的不是单个包,而是一次完整往来。在包列表里右键任意一个包:

Follow → TCP Stream(或 HTTP Stream / TLS Stream)

会把这次会话的所有数据按时间顺序拼接展示,客户端和服务端的数据用不同颜色区分,对确认请求头、响应体内容特别有用。

命令行等价操作(提取某个 TCP 流):

Terminal window
tshark -r capture.pcap -q -z follow,tcp,ascii,0

0 是流编号(stream index),可以先用 tshark -r capture.pcap 看包列表确定编号。


Statistics 菜单提供宏观视角,避免只见树木不见森林:

功能用途
Protocol Hierarchy查看各协议占流量的比例
Conversations按 IP 对/端口对聚合,看谁跟谁通信最多
I/O Graph流量随时间变化的图表
Endpoints列出所有出现过的端点及流量统计

命令行查看协议分布:

Terminal window
tshark -r capture.pcap -q -z io,phs

File → Export Specified Packets,选择 “Displayed” 只导出过滤后可见的包。

Terminal window
tshark -r capture.pcap -Y "http" -w http_only.pcap
Terminal window
tshark -r capture.pcap -T fields -e frame.time -e ip.src -e ip.dst -e tcp.port -E header=y -E separator=, > output.csv

参数/表达式说明
-i指定抓包接口
-w写入文件
-r读取已有抓包文件
-c限制抓包数量
-Y按 display filter 过滤(读取时用)
tcp.analysis.retransmission查找重传(丢包排查)
tcp.flags.syn == 1查找 TCP 握手 SYN 包
tls.handshake.type == 1查找 TLS Client Hello

七、实战案例:排查网站间歇性打不开

Section titled “七、实战案例:排查网站间歇性打不开”
  1. 先抓包再复现问题:开始抓包后立刻访问目标网站
  2. 过滤 DNSdns,确认域名解析是否正常返回、有没有超时重试
  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,确认握手是否顺利完成,有没有卡在某个阶段

按这个顺序走一遍,通常能把问题定位到具体哪一层。


Q:接口列表里网卡是灰色的,选不了?

Linux 下检查是否已加入 wireshark 用户组并重新登录;Windows 下确认 Npcap 是否正确安装。

Q:抓包文件太大怎么办?

抓包时用 -c 限制数量,或者用捕获过滤器(capture filter,抓包前生效,语法与 display filter 不同)只抓需要的流量,比如 tshark -i eth0 -f "port 443"

Q:display filter 和 capture filter 有什么区别?

Capture filter 在抓包时就过滤,减少文件体积,语法类似 tcpdump(如 port 443);display filter 在已抓到的包里筛选显示,语法更丰富(如 tcp.port == 443),两者不能混用。