第二章 网络抓包工具实战:Wireshark基础使用、tcpdump命令行抓包、过滤表达式编写、抓包文件分析

抓包这件事,说白了就是给网络通信装个「监控摄像头」。我干了十几年网络优化,遇到瓶颈问题第一反应就是——先抓个包看看。很多工程师喜欢靠猜,什么「可能是DNS问题」、「可能是TCP窗口太小」,其实抓包一看,真相就摆在那。

这一章,我带你掌握两个最趁手的工具:Wireshark和tcpdump。一个图形化,一个命令行,各有各的妙用。

2.1 Wireshark基础使用

Wireshark是我个人最常用的图形化抓包工具。它的界面虽然看着复杂,但核心操作就那么几个。

2.1.1 抓包前的准备

第一次用Wireshark,很多人直接点「开始捕获」,结果抓了一堆乱七八糟的包。我建议你先做三件事:

  • 选对网卡:笔记本通常有有线网卡、无线网卡,甚至还有虚拟网卡。抓哪个?看你流量走哪条路。
  • 设置捕获过滤器:别等抓完再过滤,那样数据量太大。比如只抓HTTP流量,就在捕获过滤器里写 tcp port 80。
  • 开启混杂模式:默认情况下,网卡只收发给自己的包。开启混杂模式,才能看到局域网里所有的包。
小技巧:我在项目中遇到过,抓无线网卡时经常丢包。后来发现是Wireshark的缓冲区设太小。去 Edit → Preferences → Capture → Buffer size,改成 100MB 以上,丢包率明显下降。

2.1.2 界面快速上手

Wireshark的界面分三块:

  • 包列表区:最上面,显示每个包的概要信息。编号、时间、源IP、目的IP、协议、长度、Info。
  • 包详情区:中间,展开看协议的每一层。从物理层到应用层,一层层剥开。
  • 包字节区:最下面,原始十六进制数据。一般用不到,但排查底层问题时很有用。

嗯,这里要注意:包列表区的「Info」列特别重要。它用一句话概括了这个包在干什么。比如「SYN」表示TCP连接请求,「ACK」表示确认,「HTTP/1.1 200 OK」表示响应成功。

2.1.3 常用操作

我总结几个高频操作:

  • 停止抓包:红色方块按钮。别一直抓,硬盘会爆。
  • 保存文件:File → Save As,格式选pcapng。这是标准格式,tcpdump也能读。
  • 追踪TCP流:右键一个TCP包 → Follow → TCP Stream。能把整个HTTP请求响应的内容拼出来,特别适合看接口返回了什么。
  • 统计功能:Statistics → Protocol Hierarchy,看看各种协议占了多少流量。我经常用这个快速定位「哪个协议在吃带宽」。
注意:Wireshark默认会解析很多协议,但有些私有协议它不认识。我曾经抓了一个游戏服务器的包,Wireshark显示的全是「Data」,根本看不懂。后来装了对应的Lua解析器才搞定。

2.2 tcpdump命令行抓包

服务器上没图形界面怎么办?tcpdump就是你的救星。它轻量、高效,而且可以远程执行。

2.2.1 基本用法

最简单的抓包命令:

tcpdump -i eth0 -nn -s0 -w capture.pcap

解释一下每个参数:

  • -i eth0:指定网卡。不知道网卡名?用 tcpdump -D 列出所有网卡。
  • -nn:不解析域名和端口名。直接显示IP和端口号,省去DNS查询时间。
  • -s0:抓取完整包。默认只抓前68字节,设成0就是抓全部。
  • -w capture.pcap:写入文件。不写这个的话,直接打印到屏幕,数据量一大就刷屏了。

我个人习惯,抓生产环境时一定加 -nn。为什么?因为DNS解析会发请求出去,万一DNS挂了,tcpdump会卡住。你想想看,排查问题的时候工具先挂了,多尴尬。

2.2.2 实时查看

有时候不想存文件,就想实时看看流量。用这个:

tcpdump -i eth0 -nn -c 100

-c 100 表示抓100个包就自动退出。适合快速看一眼。

如果想看详细内容,加 -X 或 -A:

  • -X:十六进制和ASCII同时显示。
  • -A:只显示ASCII内容。看HTTP请求体特别方便。

2.2.3 后台抓包

生产环境上,我经常用nohup让tcpdump在后台跑:

nohup tcpdump -i eth0 -nn -s0 -w /tmp/capture.pcap &

这样即使SSH断开,抓包也不会停。等抓够了,用 ps aux | grep tcpdump 找到进程ID,然后 kill 掉。

避坑指南:我曾经在线上服务器用tcpdump抓了半小时,结果发现硬盘写满了。从那以后,我每次抓包前都会先 df -h 看看剩余空间,并且用 -C 100 限制每个文件100MB,自动轮转。

2.3 过滤表达式编写

抓包不难,难的是从成千上万个包里找到你要的那几个。过滤表达式就是你的「搜索神器」。

2.3.1 捕获过滤器 vs 显示过滤器

这两个概念容易搞混。我一句话说清楚:

  • 捕获过滤器:抓包之前设,只抓符合条件的包。语法简单,性能好。
  • 显示过滤器:抓完包之后设,从已抓的包里筛选。语法丰富,功能强。

Wireshark里,捕获过滤器写在Capture Options里,显示过滤器写在界面顶部的输入框里。tcpdump只有捕获过滤器,没有显示过滤器——所以tcpdump抓完一般用Wireshark分析。

2.3.2 捕获过滤器语法(BPF)

BPF(Berkeley Packet Filter)是底层语法,tcpdump和Wireshark都支持。常用写法:

需求 表达式
只抓HTTP流量 tcp port 80
只抓某个IP的流量 host 192.168.1.100
只抓某个网段的流量 net 192.168.1.0/24
排除某个端口 not port 22
组合条件 host 192.168.1.100 and tcp port 443

举个例子,我想抓数据库的查询流量,但排除SSH干扰:

tcpdump -i eth0 -nn host 10.0.0.5 and port 3306 and not port 22

2.3.3 显示过滤器语法(Wireshark)

显示过滤器更强大,可以直接过滤协议字段。常用写法:

需求 表达式
只看HTTP GET请求 http.request.method == "GET"
只看TCP重传 tcp.analysis.retransmission
只看某个IP的通信 ip.addr == 192.168.1.100
只看某个端口的流量 tcp.port == 443
只看DNS查询 dns.flags.response == 0

显示过滤器支持逻辑运算:and、or、not。比如:

http.response.code == 500 and ip.src == 10.0.0.1

这个表达式能帮你快速找到「来自10.0.0.1的500错误响应」。我在排查API故障时经常用。

小技巧:Wireshark的显示过滤器输入框会变颜色。绿色表示语法正确,黄色表示可能有问题,红色就是写错了。我刚开始学的时候,经常看着红色发呆。后来发现,点输入框旁边的「Expression...」按钮,可以可视化选择字段,不用死记硬背。

2.4 抓包文件分析

抓完包只是第一步,分析才是重头戏。我见过太多人抓了一堆包,然后对着屏幕发呆——不知道看什么。

2.4.1 分析TCP三次握手

TCP连接慢不慢,看三次握手就知道。在Wireshark里过滤 tcp.flags.syn == 1,找到第一个SYN包。然后看时间差:

  • SYN → SYN-ACK:这个时间差是服务器响应时间。如果超过100ms,说明网络延迟大或者服务器负载高。
  • SYN-ACK → ACK:这个时间差是客户端确认时间。一般很快,几毫秒。

我记得有一次,客户说「网页打开要5秒」。我抓包一看,三次握手就花了3秒——SYN发出去,等了3秒才收到SYN-ACK。后来查出来是防火墙策略导致丢包,重试机制把时间拖长了。

2.4.2 分析TCP重传

重传是网络性能的「杀手」。在Wireshark里,直接过滤 tcp.analysis.retransmission,所有重传包就列出来了。

重点关注:

  • 重传次数:同一个包重传了3次以上,基本可以断定网络有问题。
  • 重传间隔:正常重传间隔会指数增长(1s、2s、4s...)。如果间隔很短,可能是配置问题。
  • 重传的包大小:如果重传的都是小包,可能是TCP窗口太小。如果重传的是大包,可能是MTU问题。
注意:别看到重传就紧张。TCP本身就有重传机制,偶尔丢一两个包是正常的。我一般看「重传率」——重传包数量占总包数量的比例。超过1%才需要关注。

2.4.3 分析HTTP性能

HTTP请求慢,通常有几种情况:

  • DNS解析慢:过滤 dns,看查询响应时间。超过100ms就该换DNS了。
  • TCP连接慢:看三次握手时间。超过200ms说明网络延迟大。
  • TLS握手慢:过滤 tls.handshake.type == 1,看Client Hello到Server Hello的时间差。证书链太长、密钥交换算法太复杂都会导致慢。
  • 服务器处理慢:看HTTP请求发出到收到第一个响应包的时间差。这个时间就是服务器处理时间。

我常用的一个技巧:在Wireshark里用「IO Graph」功能(Statistics → IO Graph),把时间轴画出来。一眼就能看出哪个时间段流量异常,哪个请求响应时间特别长。

2.4.4 分析丢包

丢包不一定会触发重传。有时候包丢了,但上层应用没发现。怎么判断?看TCP序列号:

  • 如果Wireshark显示「TCP Previous segment not captured」,说明中间有包丢了。
  • 如果显示「TCP ACKed unseen segment」,说明对端收到了一个你没抓到的包。

这两种情况都意味着网络存在丢包。我曾经在无线网络环境下抓包,发现每隔几十个包就有一个「Previous segment not captured」。后来把无线网卡驱动更新了一下,问题就解决了。

2.5 本章知识体系

下面这张图,帮你把本章的核心逻辑串起来:

网络抓包工具实战知识体系 抓包工具实战 Wireshark基础使用 tcpdump命令行抓包 过滤表达式编写 抓包文件分析 网卡选择 捕获过滤器 界面操作 基本参数 实时查看 后台抓包 BPF语法 显示过滤器 逻辑组合 TCP握手分析 重传分析 HTTP性能分析 丢包分析 核心思路:先抓对包 → 再过滤准 → 最后分析透

这张图把本章内容分成了四个模块。你从左上角开始,先学会Wireshark怎么用,再掌握tcpdump的命令行操作,然后精通过滤表达式,最后才是真正的分析实战。顺序别搞反了——很多人一上来就想分析,结果连过滤都不会写,那效率太低了。

好了,这一章的内容就到这里。抓包工具是网络工程师的「听诊器」,用好了,网络问题在你面前就是透明的。下一章我们聊聊更具体的性能指标分析,到时候你会用上今天学的这些技能。

可可精品资料库