2. Wireshark部署与高并发采集环境搭建

说实话,很多工程师用 Wireshark 好几年,还停留在「打开软件 → 点开始 → 看颜色」的阶段。我见过不少同事,抓了一堆包,面对几千行数据一脸茫然,最后只能靠猜来定位问题。

这一章,咱们把基础打扎实。我会结合自己踩过的坑,把抓包过滤器、显示过滤器、TCP 流跟踪和时间分析这几个核心功能讲透。你想想看,如果连工具都玩不转,怎么去定位那些棘手的并发问题?

核心要点:Wireshark 的威力不在于「能抓到包」,而在于「能快速从海量数据中找到你要的那几个包」。过滤器和时间分析,就是你的两把手术刀。

2.1 抓包过滤器 vs 显示过滤器:别搞混了

这是新手最容易混淆的地方。我刚开始学的时候也犯过这个错——在抓包过滤器里写了个复杂的表达式,结果啥都没抓到,还以为是网卡坏了。

对比维度 抓包过滤器 (Capture Filter) 显示过滤器 (Display Filter)
作用时机 抓包开始前,决定哪些包进入内存 抓包完成后,从已抓到的包中筛选显示
语法风格 BPF (Berkeley Packet Filter) 语法 Wireshark 专有表达式语法
性能影响 高流量场景下必须使用,否则内存爆炸 只影响显示,不影响已抓到的数据
典型场景 只抓特定 IP 或端口,减少抓包体积 从全量数据中精确过滤出异常报文
示例 host 10.0.0.1 and tcp port 80 ip.addr == 10.0.0.1 and tcp.port == 80

我曾经踩过的坑:有一次在生产环境抓包,我用了显示过滤器的语法写到了抓包过滤器里,结果 Wireshark 直接报语法错误,白白浪费了 10 分钟。记住:抓包过滤器用 host、port、and、or;显示过滤器用 ip.addr、tcp.port、&&、||。

2.1.1 抓包过滤器实战

我个人习惯在抓包前先想清楚:我要关注什么?如果是排查服务并发问题,通常只需要关注目标服务的 IP 和端口。比如我们的后端服务跑在 10.0.0.100:8080:

# 只抓目标服务的流量
host 10.0.0.100 and port 8080

# 排除 SSH 等干扰流量
host 10.0.0.100 and not port 22

# 抓整个网段的 TCP 流量
net 10.0.0.0/24 and tcp

嗯,这里要注意:抓包过滤器不支持「等于」符号,它用的是空格分隔的关键词。我第一次用的时候写了个 ip.addr == 10.0.0.1,结果抓了个寂寞。

2.1.2 显示过滤器实战

显示过滤器才是真正的利器。抓完包之后,几千行数据摆在你面前,怎么快速找到问题?我一般会从这几个维度切入:

  • 按 IP 和端口过滤:ip.addr == 10.0.0.100 and tcp.port == 8080
  • 按 TCP 标志位过滤:tcp.flags.syn == 1 and tcp.flags.ack == 0(只看 SYN 包,排查连接建立问题)
  • 按重传过滤:tcp.analysis.retransmission(这是排查并发问题的黄金过滤器)
  • 按响应时间过滤:tcp.time_delta > 0.5(找出延迟超过 500ms 的包)

小技巧:在 Wireshark 的显示过滤器输入框里,输入 tcp.analysis. 之后按 Tab 键,会弹出所有可用的分析字段。我经常用这个功能来探索 Wireshark 能自动检测哪些异常。

2.2 TCP 流跟踪:把对话串起来看

单看一个个的包,就像看拼图的碎片。TCP 流跟踪功能,能把一次完整的 TCP 会话中的所有包按顺序排列出来。我在排查并发连接泄漏问题时,这个功能帮了大忙。

操作很简单:右键点击任意一个 TCP 包 → Follow → TCP Stream。Wireshark 会自动过滤出这个 TCP 连接的所有包,并按时间顺序展示。

为什么这个功能对并发问题特别重要?我给你举个例子:

  • 你怀疑某个客户端占用了连接不释放。通过 TCP 流跟踪,你能看到这个连接从三次握手开始,到数据传输,再到四次挥手(或者没有挥手)的完整过程。
  • 你怀疑服务端处理请求太慢。通过流跟踪,你能看到客户端发送请求后,服务端过了多久才回复。
  • 你怀疑有半连接状态。通过流跟踪,你能看到 SYN 包发出后,有没有收到 SYN-ACK。

我的经验:在排查并发问题时,我通常会同时打开 3-4 个 TCP 流跟踪窗口,对比不同客户端的行为差异。比如,为什么客户端 A 的连接正常释放,客户端 B 的连接却一直卡在 FIN_WAIT_2?这种对比往往能快速定位问题根因。

2.3 时间列与 Delta 时间分析

时间,是排查并发问题的另一个关键维度。Wireshark 默认显示的是「绝对时间」(包被抓到的时刻),但在分析性能问题时,我们更关心「相对时间」——也就是两个包之间的时间间隔。

2.3.1 添加 Delta 时间列

我个人习惯在 Wireshark 的包列表里添加两列:

  1. Delta time (显示): 当前包与上一个显示出来的包之间的时间差
  2. Delta time (捕获): 当前包与上一个被捕获的包之间的时间差

添加方法:右键点击列标题 → Column Preferences → 添加新列 → 选择 Delta time displayed 或 Delta time captured。

为什么要区分这两种?我遇到过这样的情况:用显示过滤器只显示了重传包,这时候「Delta time (显示)」能告诉我两次重传之间隔了多久;而「Delta time (捕获)」则能告诉我原始捕获顺序中,这个重传包和它前面的正常包之间隔了多久。

2.3.2 用 Delta 时间定位并发问题

在并发场景下,Delta 时间能帮你发现很多隐藏的问题:

Delta 时间特征 可能的问题
请求发出后 Delta > 1s 才收到响应 服务端线程池耗尽,请求在排队
连续多个 SYN 包 Delta 极短(< 1ms) 客户端并发创建大量连接,可能触发连接风暴
重传包的 Delta 呈指数增长(0.2s → 0.4s → 0.8s) TCP 超时重传机制被触发,网络或服务端有瓶颈
FIN 包之后长时间没有 ACK 连接处于 CLOSE_WAIT 状态,服务端未及时关闭

注意:Delta 时间分析要结合具体场景。有一次我看到请求响应 Delta 是 2 秒,以为是服务端慢,结果发现是客户端在发送请求前先做了个 DNS 查询,那 2 秒其实是 DNS 解析时间。所以,一定要看完整的 TCP 流,别被单个 Delta 值误导。

2.4 本章知识体系

下面这张图,把本章的核心知识点串了起来。你可以把它当作一个快速索引,以后遇到问题就知道该用哪个功能。

Wireshark 基础功能知识体系 Wireshark 基础功能知识体系 过滤器 TCP 流跟踪 时间分析 抓包过滤器 显示过滤器 完整会话查看 多流对比 Delta 时间 绝对时间 应用场景:并发连接泄漏 · 请求排队延迟 · 重传风暴 · 半连接检测 三个功能组合使用,才能高效定位并发问题 💡 我的建议:先学会显示过滤器和 Delta 时间,这两个是排查并发问题最高频使用的功能