2. 抓包工具实战:Wireshark基础操作、tcpdump命令详解、抓包过滤规则
做TCP重传排查,说白了就是跟数据包打交道。你连包都抓不对、抓不全,后面分析得再漂亮也是白搭。这一章我带你过一遍两个最常用的抓包工具——Wireshark和tcpdump。嗯,都是实战里天天用的东西。
核心观点:抓包不是瞎抓,要有目的、有过滤、有策略。否则在千兆链路上,几秒钟就能撑爆你的磁盘。
2.1 Wireshark 基础操作
Wireshark是图形化工具,上手快,适合交互式分析。我个人习惯在排查初期先用它快速看一眼流量特征。
2.1.1 抓包前的准备
- 选择正确的网卡:别抓到环回口上去。我见过有人排查了半天,发现抓的是 lo 接口的包。
- 设置捕获过滤器:提前过滤掉无关流量,减少干扰。
- 启用巨型帧支持:如果你的网络用了 jumbo frame,记得在 Wireshark 里开启。
2.1.2 常用界面操作
| 功能 | 操作 | 说明 |
|---|---|---|
| 开始/停止抓包 | 工具栏鲨鱼鳍图标 | 蓝色开始,红色停止 |
| 显示过滤器 | 顶部输入框 | 实时过滤已捕获的包 |
| 追踪流 | 右键 → Follow → TCP Stream | 重组TCP会话,看应用层数据 |
| 统计摘要 | Statistics → Summary | 快速看丢包率、吞吐量 |
| 专家信息 | Analyze → Expert Info | Wireshark自动标记异常 |
小技巧:按
Ctrl+Alt+Shift+T 可以快速打开 TCP 流追踪窗口。我在排查重传时,几乎每步都要看这个。
2.1.3 着色规则
Wireshark默认会给不同协议上色。但TCP重传相关的颜色你得记住:
- 浅红背景:TCP Retransmission(重传)
- 浅黄背景:TCP Dup ACK(重复确认)
- 浅紫背景:TCP Fast Retransmission(快速重传)
- 浅绿背景:正常TCP数据包
我曾经在排查一个慢速应用时,发现满屏都是浅红和浅黄——不用看具体数据就知道,重传率已经爆了。
2.2 tcpdump 命令详解
服务器上没有图形界面怎么办?tcpdump就是你的救星。说实话,我90%的线上排查都是用tcpdump完成的。它轻量、灵活、可脚本化。
2.2.1 基础语法
tcpdump [选项] [过滤表达式]
最常用的几个选项:
| 选项 | 作用 | 示例 |
|---|---|---|
-i | 指定网卡 | -i eth0 |
-n | 不解析域名 | 加快速度,减少DNS干扰 |
-nn | 不解析域名+端口 | 显示纯数字 |
-s 0 | 抓取完整包 | 默认只抓前68字节 |
-w | 写入文件 | -w dump.pcap |
-r | 读取文件 | -r dump.pcap |
-c | 抓取指定数量后停止 | -c 1000 |
注意:线上环境抓包,一定要用
-s 0 抓完整包。我曾经只抓了默认长度,结果重传的载荷数据全丢了,排查了三天才发现是应用层的问题。
2.2.2 实战命令组合
下面这几个是我在项目中反复用的组合拳:
# 抓取特定端口的TCP流量,保存到文件
tcpdump -i eth0 -nn -s 0 -w http.pcap port 80
# 抓取特定主机的流量,实时查看
tcpdump -i eth0 -nn host 192.168.1.100
# 抓取TCP重传包(需要较新版本tcpdump)
tcpdump -i eth0 -nn "tcp[tcpflags] & (tcp-retrans) != 0"
# 抓取SYN包
tcpdump -i eth0 -nn "tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0"
# 后台抓包,轮转保存
nohup tcpdump -i eth0 -nn -s 0 -w /data/capture.pcap -C 100 -W 10 &
最后那个后台轮转命令,我建议每个运维都记下来。它能按100MB一个文件轮转,保留10个文件,非常适合长时间抓包。
2.3 抓包过滤规则
过滤规则分两种:捕获过滤器(抓之前过滤)和显示过滤器(抓之后过滤)。搞混了会出大问题。
2.3.1 捕获过滤器(BPF语法)
Wireshark和tcpdump都支持Berkeley Packet Filter语法。它在内核层面就过滤掉了,效率极高。
| 类型 | 表达式 | 说明 |
|---|---|---|
| 主机 | host 10.0.0.1 | 只抓该主机的流量 |
| 端口 | port 443 | 只抓443端口 |
| 协议 | tcp / udp | 只抓TCP或UDP |
| 网段 | net 192.168.1.0/24 | 只抓该网段 |
| 组合 | tcp and port 80 and host 10.0.0.1 | 逻辑与/或/非 |
避坑指南:捕获过滤器不支持按TCP标志位过滤。我曾经想用
tcp[tcpflags] & tcp-syn != 0 做捕获过滤器,结果tcpdump直接报错。这个语法只能用在显示过滤器里。
2.3.2 显示过滤器(Wireshark语法)
显示过滤器更强大,支持协议字段级过滤。这是Wireshark的强项。
# 只看重传包
tcp.analysis.retransmission
# 只看快速重传
tcp.analysis.fast_retransmission
# 只看重复确认
tcp.analysis.duplicate_ack
# 只看零窗口
tcp.analysis.zero_window
# 只看特定序列号范围的包
tcp.seq >= 1000 and tcp.seq <= 2000
# 只看RST包
tcp.flags.reset == 1
# 组合过滤:重传且源端口是80
tcp.analysis.retransmission and tcp.srcport == 80
嗯,这里要注意。显示过滤器是在内存里过滤的,如果你抓了10GB的包再过滤,机器可能会卡死。我建议先估算流量,用捕获过滤器缩小范围。
2.4 知识体系:抓包工具核心逻辑
下面这张图是我自己总结的抓包工具选择逻辑,你照着走基本不会错:
2.5 实战案例:抓取一次TCP重传
光说不练假把式。我们模拟一个场景:客户端访问服务器,出现重传。看看怎么用tcpdump和Wireshark抓到它。
2.5.1 服务端抓包
# 在服务器上执行
tcpdump -i eth0 -nn -s 0 -w /tmp/retrans.pcap \
"tcp and host 192.168.1.100 and port 8080"
2.5.2 客户端触发
# 在客户端执行
curl http://192.168.1.200:8080/api/data
2.5.3 Wireshark分析
- 打开
retrans.pcap - 在显示过滤器输入:
tcp.analysis.retransmission - Wireshark会高亮所有重传包
- 右键 → Follow → TCP Stream,看完整会话
- 检查重传包的序列号,确认是哪个包丢了
我的经验:看到重传别急着下结论。先看RTT(往返时间),如果RTT突然变大,可能是网络拥塞;如果RTT正常但丢包,可能是中间设备的问题。我遇到过交换机端口协商失败导致丢包的情况,抓包一看,重传间隔非常规律。
2.6 常见问题与避坑
- 抓包文件太大:用
-C和-W做轮转,或者用dumpcap替代 tcpdump - 权限不足:tcpdump需要root权限,或者用
setcap赋予cap_net_raw - 时间戳不准:用
-tttt选项显示人类可读的时间戳 - 丢包发生在抓包点之前:抓包工具只能看到经过本机的包,如果丢包发生在交换机上,你抓不到
曾经踩过的坑:我在一个高负载服务器上抓包,忘了加
-s 0,结果默认只抓了68字节。重传的载荷数据全被截断了,根本看不出应用层在传什么。后来加了 -s 0 重新抓,问题才定位到是HTTP请求体过大导致的超时重传。