抓包环境搭建: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。
注意权限问题:Linux下非root用户启动Wireshark可能看不到网卡。我曾经踩过这个坑,排查到一半发现抓不到包,结果是权限没给。解决方法:sudo usermod -a -G wireshark $USER,然后重新登录。

2.1.2 基础配置

装好后,先别急着抓包。做几项基础配置,能让你后续分析省不少事。

配置项 推荐设置 说明
时间显示格式 Seconds Since Beginning of Capture 方便看相对时间差,一眼看出重传间隔
自动滚动 关闭 抓大流量时开着会卡死,手动滚动更可控
解析器设置 启用TCP解析、HTTP解析 默认就够,别乱关,否则看不到Seq/Ack
着色规则 保留默认TCP重传着色(浅红色) 一眼定位重传包,非常实用
小技巧:在Wireshark里按 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个包就停。
实战建议:抓TCP重传问题时,我通常这样用:
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 减少噪音
我的习惯:捕获过滤器尽量宽松,只过滤掉明显无关的流量(比如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 本章知识体系

下面这张图帮你理清抓包环境的整体脉络:

抓包环境搭建知识体系 抓包环境搭建 Wireshark 安装Npcap / 权限配置 时间格式 / 着色规则 tcpdump -i / -w / -nn / -s 0 实时查看 / 文件保存 过滤器编写 捕获过滤器(BPF语法) 显示过滤器(Wireshark语法) 目标:快速定位TCP重传