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 InfoWireshark自动标记异常
小技巧:按 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 知识体系:抓包工具核心逻辑

下面这张图是我自己总结的抓包工具选择逻辑,你照着走基本不会错:

抓包工具选择与过滤逻辑 抓包工具选择与过滤逻辑 抓包需求 有图形界面? → Wireshark 无图形界面? → tcpdump 选择过滤类型 捕获过滤器(BPF) 抓之前过滤,内核级,效率高 显示过滤器(Wireshark语法) 抓之后过滤,支持协议字段 建议:先用捕获过滤器缩小范围,再用显示过滤器精确定位重传包

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分析

  1. 打开 retrans.pcap
  2. 在显示过滤器输入:tcp.analysis.retransmission
  3. Wireshark会高亮所有重传包
  4. 右键 → Follow → TCP Stream,看完整会话
  5. 检查重传包的序列号,确认是哪个包丢了
我的经验:看到重传别急着下结论。先看RTT(往返时间),如果RTT突然变大,可能是网络拥塞;如果RTT正常但丢包,可能是中间设备的问题。我遇到过交换机端口协商失败导致丢包的情况,抓包一看,重传间隔非常规律。

2.6 常见问题与避坑

  • 抓包文件太大:用 -C 和 -W 做轮转,或者用 dumpcap 替代 tcpdump
  • 权限不足:tcpdump需要root权限,或者用 setcap 赋予cap_net_raw
  • 时间戳不准:用 -tttt 选项显示人类可读的时间戳
  • 丢包发生在抓包点之前:抓包工具只能看到经过本机的包,如果丢包发生在交换机上,你抓不到
曾经踩过的坑:我在一个高负载服务器上抓包,忘了加 -s 0,结果默认只抓了68字节。重传的载荷数据全被截断了,根本看不出应用层在传什么。后来加了 -s 0 重新抓,问题才定位到是HTTP请求体过大导致的超时重传。