第二章 网络抓包工具实战:Wireshark基础使用、tcpdump命令行抓包、过滤表达式编写、抓包文件分析
抓包这件事,说白了就是给网络通信装个「监控摄像头」。我干了十几年网络优化,遇到瓶颈问题第一反应就是——先抓个包看看。很多工程师喜欢靠猜,什么「可能是DNS问题」、「可能是TCP窗口太小」,其实抓包一看,真相就摆在那。
这一章,我带你掌握两个最趁手的工具:Wireshark和tcpdump。一个图形化,一个命令行,各有各的妙用。
2.1 Wireshark基础使用
Wireshark是我个人最常用的图形化抓包工具。它的界面虽然看着复杂,但核心操作就那么几个。
2.1.1 抓包前的准备
第一次用Wireshark,很多人直接点「开始捕获」,结果抓了一堆乱七八糟的包。我建议你先做三件事:
- 选对网卡:笔记本通常有有线网卡、无线网卡,甚至还有虚拟网卡。抓哪个?看你流量走哪条路。
- 设置捕获过滤器:别等抓完再过滤,那样数据量太大。比如只抓HTTP流量,就在捕获过滤器里写
tcp port 80。 - 开启混杂模式:默认情况下,网卡只收发给自己的包。开启混杂模式,才能看到局域网里所有的包。
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,看看各种协议占了多少流量。我经常用这个快速定位「哪个协议在吃带宽」。
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 掉。
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故障时经常用。
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问题。
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的命令行操作,然后精通过滤表达式,最后才是真正的分析实战。顺序别搞反了——很多人一上来就想分析,结果连过滤都不会写,那效率太低了。
好了,这一章的内容就到这里。抓包工具是网络工程师的「听诊器」,用好了,网络问题在你面前就是透明的。下一章我们聊聊更具体的性能指标分析,到时候你会用上今天学的这些技能。