抓包环境搭建:Wireshark安装与配置、tcpdump基础用法、抓包过滤器的编写
工欲善其事,必先利其器。做TCP重传分析,抓包环境就是你的手术台。我见过不少同行,分析思路没问题,但环境没搭好,抓到的包要么不全,要么被过滤掉了关键信息,折腾半天白忙活。
这一章,咱们就把环境彻底搞定。从Wireshark安装、tcpdump基础,到过滤器编写,一步到位。
2.1 Wireshark安装与基础配置
Wireshark是目前最主流的图形化抓包工具。我个人习惯在Windows上用它做交互分析,在Linux服务器上用tcpdump抓完再拖回本地看。
2.1.1 安装要点
- Windows:从官网下载安装包,一路默认即可。注意安装时会提示安装Npcap(或WinPcap),务必勾选,否则抓不到包。
- Linux(Ubuntu/CentOS):直接用包管理器安装。Ubuntu用
sudo apt install wireshark,CentOS用sudo yum install wireshark。 - macOS:推荐用Homebrew安装:
brew install --cask wireshark。
sudo usermod -a -G wireshark $USER,然后重新登录。
2.1.2 基础配置
装好后,先别急着抓包。做几项基础配置,能让你后续分析省不少事。
| 配置项 | 推荐设置 | 说明 |
|---|---|---|
| 时间显示格式 | Seconds Since Beginning of Capture | 方便看相对时间差,一眼看出重传间隔 |
| 自动滚动 | 关闭 | 抓大流量时开着会卡死,手动滚动更可控 |
| 解析器设置 | 启用TCP解析、HTTP解析 | 默认就够,别乱关,否则看不到Seq/Ack |
| 着色规则 | 保留默认TCP重传着色(浅红色) | 一眼定位重传包,非常实用 |
Ctrl+Shift+P 打开偏好设置,找到 Appearance → Columns,把“Delta time”列加上。这样每个包和前一个包的时间差一目了然,重传间隔对不对,扫一眼就知道。
2.2 tcpdump基础用法
生产环境服务器通常没有图形界面,这时候tcpdump就是你的主力。说实话,我大部分TCP重传问题都是在服务器上用tcpdump抓的,Wireshark只是用来事后分析。
2.2.1 最常用的几个命令
# 抓取eth0网卡所有流量,保存到文件
tcpdump -i eth0 -w capture.pcap
# 抓取指定端口(比如80)的流量
tcpdump -i eth0 port 80 -w http.pcap
# 抓取指定主机的流量
tcpdump -i eth0 host 192.168.1.100 -w host.pcap
# 抓取并实时显示(不保存文件)
tcpdump -i eth0 -nn port 443
参数说明:
-i:指定网卡接口。不知道有哪些网卡?用tcpdump -D列出。-w:写入文件,不写的话默认打印到屏幕。-nn:不解析主机名和端口名,直接显示IP和端口号。我建议永远加上,否则tcpdump会花时间做DNS反向查询,拖慢速度。-c:抓取指定数量的包后自动停止。比如-c 1000抓1000个包就停。
tcpdump -i eth0 -nn -s 0 -w retrans.pcap host 10.0.0.5 and port 8080-s 0 表示抓取完整包(默认只抓前96字节,可能漏掉TCP载荷),host 和 port 缩小范围,避免抓太多无用数据。
2.2.2 实时查看重传标志
有时候你不想等抓完再看,想实时盯着屏幕。tcpdump可以配合 -S 参数显示绝对序列号,方便你肉眼判断重传:
tcpdump -i eth0 -nn -S tcp and host 10.0.0.5
看到同一个Seq号出现两次以上,基本就是重传了。不过说实话,实时看比较累眼睛,我一般还是抓完用Wireshark分析。
2.3 抓包过滤器的编写
过滤器是抓包的核心技能。不会写过滤器,就像拿着渔网捞针——累死也找不到问题。Wireshark和tcpdump都支持两种过滤器:捕获过滤器(抓的时候过滤)和显示过滤器(抓完后过滤)。
2.3.1 捕获过滤器(BPF语法)
捕获过滤器基于伯克利包过滤(BPF)语法,在抓包时就丢弃不相关的包。好处是节省磁盘和CPU,坏处是一旦过滤掉,后面就找不回来了。
| 场景 | 过滤器表达式 | 说明 |
|---|---|---|
| 只抓TCP | tcp |
排除UDP、ICMP等 |
| 指定源/目标IP | host 192.168.1.1 |
双向匹配 |
| 指定端口范围 | portrange 8000-9000 |
适合微服务多端口场景 |
| 组合条件 | tcp and host 10.0.0.5 and port 443 |
用and/or/not连接 |
| 排除ARP | not arp |
减少噪音 |
2.3.2 显示过滤器(Wireshark语法)
显示过滤器是Wireshark的强项。抓完包后,在过滤栏输入表达式,立刻筛选出你想要的包。语法比BPF更丰富,支持协议字段级过滤。
常用显示过滤器示例:
# 只看TCP重传包
tcp.analysis.retransmission
# 只看快速重传
tcp.analysis.fast_retransmission
# 只看重复ACK(DupAck)
tcp.analysis.duplicate_ack
# 只看零窗口
tcp.analysis.zero_window
# 只看某个流(Stream Index)
tcp.stream eq 0
# 只看Seq号在某个范围的包
tcp.seq ge 1000 and tcp.seq le 2000
为什么这些过滤器重要?因为TCP重传问题,Wireshark已经帮你标记好了。你只需要输入 tcp.analysis.retransmission,所有重传包就会高亮显示。我排查问题时,第一步永远是先看这个过滤结果。
2.3.3 过滤器编写避坑指南
tcp port 80,结果抓了半天没发现问题。后来才发现,客户端用了随机端口连接,服务端回包端口是80,但客户端源端口不是80。捕获过滤器只匹配了目标端口80,漏掉了客户端的包。正确的做法是用 host 或 port 80(双向匹配)。
几个容易踩的坑:
- 捕获过滤器不支持协议字段:比如你不能在捕获过滤器里写
tcp.analysis.retransmission,那是显示过滤器才有的。 - 大小写敏感:BPF语法里
tcp和TCP都行,但Wireshark显示过滤器里字段名是大小写敏感的,比如tcp.analysis.retransmission不能写成TCP.Analysis.Retransmission。 - 括号优先级:组合条件时,用括号明确优先级。比如
tcp and (host 10.0.0.5 or host 10.0.0.6),不加括号可能逻辑混乱。
2.4 本章知识体系
下面这张图帮你理清抓包环境的整体脉络: