在网络运维和故障排查中,能够直接观察线路上传输的原始数据包,往往比查看日志或计数器更有效。Linux 环境下,tcpdump 与 Wireshark 是两件最常用的抓包与协议分析工具。前者轻量、命令行驱动,适合在服务器上快速捕获和过滤流量;后者图形化、解码能力极强,适合对捕获文件进行深度分析。将两者结合使用,可以覆盖从“抓取”到“定位”的完整链路。
一、为什么需要协议分析
很多网络问题无法仅凭 ping、ss 或应用日志定位。例如:
- TCP 连接建立缓慢,但最终能成功;
- 应用偶发超时,日志只显示“connection reset”;
- DNS 解析时快时慢;
- 服务端与客户端对同一请求的响应时间差异巨大。
这些现象背后可能是重传、乱序、窗口为零、MTU 问题、TLS 握手失败或应用层协议异常。只有看到数据包层面的交互,才能判断问题出在网络、系统还是应用。
二、tcpdump:在服务器上精准抓包
2.1 基本用法
tcpdump 通常已预装在多数 Linux 发行版中。最基本的命令是:
tcpdump -i eth0
这会捕获 eth0 上的所有流量并打印摘要。但生产环境中直接这样抓包会产生大量输出,因此必须配合过滤条件。
2.2 常用过滤表达式
tcpdump 使用 BPF 语法,常见过滤方式包括:
- 按主机:
host 192.168.1.10 - 按网段:
net 10.0.0.0/24 - 按端口:
port 443、portrange 8000-9000 - 按协议:
tcp、udp、icmp - 组合条件:
tcp and host 192.168.1.10 and port 80
例如,只抓取与 10.0.0.5 的 3306 端口通信:
tcpdump -i eth0 -nn host 10.0.0.5 and port 3306
-nn 表示不解析主机名和端口名,避免 DNS 反查拖慢输出,在故障排查时非常实用。
2.3 写入文件供 Wireshark 分析
tcpdump 最强大的用法之一是将原始数据包写入 pcap 文件:
tcpdump -i eth0 -nn -s 0 -w /tmp/capture.pcap host 10.0.0.5 and port 443
关键参数:
-s 0:抓取完整数据包,不截断;-w:写入文件而不是打印到终端;-c 1000:限制抓取数量,避免文件过大;-G 60 -W 10:按时间轮转文件,适合长时间抓包。
抓包完成后,将 .pcap 文件下载到本地,用 Wireshark 打开即可。
2.4 实时观察与快速判断
如果只想快速判断问题,可以直接在终端查看:
tcpdump -i eth0 -nn -tttt tcp port 80
-tttt 显示完整时间戳,便于观察时间间隔。若看到大量 [TCP Retransmission] 或 [TCP ZeroWindow],基本可以判断存在网络重传或接收端处理不过来。
三、Wireshark:深度协议解码与故障定位
Wireshark 不仅能打开 tcpdump 生成的 pcap 文件,还提供强大的过滤、统计和追踪功能。
3.1 显示过滤器
Wireshark 的显示过滤器与 tcpdump 的捕获过滤器不同,它作用于已捕获的数据包。常用例子:
ip.addr == 192.168.1.10tcp.port == 443tcp.flags.reset == 1http.response.code >= 500dns.flags.rcode != 0
通过组合过滤器,可以快速缩小问题范围。
3.2 追踪 TCP 流
右键某个 TCP 包,选择 Follow → TCP Stream,Wireshark 会把整条连接的应用层数据按方向拼接展示。这对于查看 HTTP 请求响应、Redis 命令、MySQL 查询等非常直观。如果发现请求已发出但响应异常,可以进一步判断是服务端未处理还是网络丢包。
3.3 专家信息与统计
Wireshark 底部的 Expert Information 会汇总重传、乱序、重复 ACK、零窗口等异常。Statistics → Flow Graph 可以生成时序图,直观展示双方交互过程。Statistics → TCP Stream Graphs → Time Sequence 则能画出序列号随时间的变化,重传和乱序一目了然。
3.4 常见故障模式
- TCP 重传:序列号重复发送,通常由丢包或 ACK 丢失引起;
- TCP 零窗口:接收方通告窗口为 0,说明应用读取速度跟不上;
- RST 异常:连接被强制重置,可能是服务未监听、防火墙拦截或应用崩溃;
- TLS 握手失败:Client Hello 后无 Server Hello,或 Alert 消息指明证书/协议问题;
- DNS 超时:查询发出后无响应,或响应码为 SERVFAIL。
四、联合使用的最佳实践
- 在服务器上用 tcpdump 抓包,在本地用 Wireshark 分析。服务器通常没有图形界面,tcpdump 更合适。
- 抓包前先明确过滤条件,避免捕获无关流量。若不确定,可先抓少量包观察。
- 始终使用
-s 0抓取完整包,否则 Wireshark 可能无法解码应用层协议。 - 注意抓包位置。在客户端抓包看到重传,说明客户端到服务端之间有问题;在服务端抓包看到重传,说明服务端到客户端方向有问题。两端同时抓包对比,可以定位丢包发生在哪一段。
- 结合时间戳分析。Wireshark 默认显示相对时间,可改为绝对时间或 delta 时间,便于计算延迟。
五、总结
tcpdump 与 Wireshark 的组合,是 Linux 下协议分析与故障定位的经典方案。tcpdump 负责在服务器上高效、精准地捕获原始流量,Wireshark 负责对捕获文件进行深度解码和可视化分析。掌握过滤表达式、追踪 TCP 流、查看专家信息这几项核心技能,就能应对大多数网络超时、连接重置、重传和协议异常问题。在实际排查中,先明确假设,再有针对性地抓包,最后用 Wireshark 验证,往往比盲目重启服务更有效。
未经允许不得转载:任鹏个人博客 » Linux 下使用 tcpdump 与 Wireshark 进行协议分析与故障定位


朋友圈点赞图在线生成源码