网络故障进阶排查与抓包分析

🏷️ L2 📊 intermediate ⏱️ 40分钟 🏷️ 网络,故障排查,Wireshark,TCP/IP,进阶

好的,各位未来的网络专家们,请坐好。我是你们的导师,今天我们要聊点硬核的。你们已经不再是那个只会用 pingtracert 的小白了,对吧?你们在工作中肯定遇到过这样的情况:用户说“网络慢”,老板说“查一下”,然后你看着Wireshark里密密麻麻的数据包,一脸茫然。

今天,这40分钟,我将带你们从“会用Wireshark”进化到“能读Wireshark”,从“会ping”进化到“能诊断”。我们将深入TCP/IP的骨髓,学习如何像一名老道的侦探一样,从数据包的蛛丝马迹中找出网络故障的真凶。

准备好了吗?让我们开始这场网络排障的进阶之旅。

---

一、概述

1. 应用场景与重要性

在复杂的网络环境中,网络故障早已不是简单的“网线没插好”。它可能表现为:

在这些场景下,单纯的网络层工具(如ping、tracert)已经无法提供足够的信息。我们需要深入到传输层和应用层,去观察数据包的“对话”是否正常。这就是 Wireshark抓包分析 的价值所在。

重要性:

2. 适合人群(前置知识)

这份教程是为进阶学员准备的,你至少需要具备以下基础:

如果你对这些概念还比较模糊,建议你先去补一下基础。

---

二、核心知识

1. 核心技术原理讲解:TCP的“慢与重”

网络故障的核心往往与TCP协议的行为有关。TCP是一个可靠的、面向连接的协议,它通过各种机制来保证数据的可靠传输,但这些机制也正是很多“慢”问题的根源。

2. 关键概念与术语

3. 核心知识点与示例

知识点一:识别“TCP重传”与“TCP快速重传”

问题:用户反馈文件上传很慢。 排查:在Wireshark中,直接过滤 tcp.analysis.retransmissiontcp.analysis.fast_retransmit

示例分析:

诊断:使用 ping -t 观察是否有丢包。如果ping不丢包但TCP重传,说明问题可能出在中间设备的策略(如防火墙限速、QoS丢包)或应用层处理能力上。

知识点二:分析TCP握手与挥手

问题:用户访问网页慢,但ping正常。 排查:过滤 tcp.flags.syn == 1tcp.port == 80,观察三次握手。

示例分析:

诊断:结合pingtracert,确认延迟发生在哪一跳。如果在服务器内网,可能是服务器CPU/网卡瓶颈。

知识点三:分析TCP窗口与吞吐量

问题:内网千兆环境,但文件拷贝速度只有10MB/s。 排查:在Wireshark中,添加一个计算列:tcp.window_size。或者使用“统计” -> “流量图” -> “TCP流图” -> “时间/序列(Stevens)”。

示例分析:

知识点四:DNS解析延迟

问题:访问网站第一次慢,以后快。 排查:过滤 dns,找到对应的DNS查询和应答包。

示例分析:

诊断:使用 nslookupdig 命令手动测试不同DNS服务器(如8.8.8.8)的响应时间。

---

三、实操步骤

步骤1:搭建排障环境与抓包准备

1. 确定抓包点

2. 设置过滤

步骤2:复现故障并抓包

1. 启动Wireshark,选择正确的网卡(通常是连接内网的网卡)。 2. 设置捕获过滤器,减少噪音(例如只抓用户IP的流量)。 3. 点击“开始捕获”。 4. 让用户复现故障(例如:访问慢的网页、传输大文件、发起视频会议)。 5. 故障复现后,立即停止捕获。 6. 保存文件文件 -> 导出特定分组,选择“所有分组”并保存为.pcapng格式。文件名要有意义,如 user_A_web_slow_20231027.pcapng

步骤3:分析常见故障场景

场景一:分析“网络慢”问题

1. 观察整体RTT:点击“统计” -> “TCP流图” -> “往返时间”。看RTT的分布。如果RTT稳定在1ms以内,说明网络延迟很低,问题可能在应用层。 2. 检查重传:使用显示过滤器 tcp.analysis.retransmission or tcp.analysis.fast_retransmit。如果出现大量重传,点击“统计” -> “IO图表”,将Y轴设置为“分组”,并添加一个过滤器 tcp.analysis.retransmission。观察重传的分布。 3. 检查零窗口:使用过滤器 tcp.analysis.zero_window。如果出现,说明接收端处理能力是瓶颈。 4. 分析应用层:例如HTTP,看http.time(请求到响应的时间)。如果http.time很大,但网络RTT很小,说明服务器处理请求慢(后端数据库查询慢、应用逻辑复杂等)。

场景二:分析“连接不上”问题

1. 过滤TCP握手tcp.flags.syn == 1。 2. 观察三次握手:客户端是否发了SYN?服务器是否回了SYN,ACK?

3. 检查DNSdns.flags.response == 1。看DNS是否解析成功。

常见配置参数说明

---

四、故障排查

常见问题及解决方法

问题1:大量TCP重传,但Ping不丢包

1. 在Wireshark中统计重传的IP对:统计 -> 端点,按IPv4排序,查看哪个IP对重传最多。 2. 检查重传包的TTL值是否一致。如果不一致,说明数据包走了不同的路径。 3. 检查是否伴随有TCP Window UpdateZero Window。如果是,问题在接收端。 4. 检查重传是否发生在特定时间点,与CPU/内存占用率图表对比。

问题2:TCP连接建立缓慢(握手延迟高)

1. ping 服务器IP,看RTT是否正常。 2. tracert 服务器IP,看哪一跳延迟突然升高。 3. 在服务器端抓包,看服务器收到SYN到发出SYN,ACK的时间。如果服务器很快发出,说明问题在回包链路;如果服务器也延迟了,说明服务器TCP栈或应用层处理慢。

问题3:HTTP请求响应慢,但网络RTT正常

1. Wireshark中过滤 http.request and http.response,计算请求和响应的时间差。 2. 如果时间差很大,说明服务器处理请求慢。进一步分析HTTP请求内容,看是否在查询数据库、调用外部API等。 3. 检查是否有多个TCP连接建立(Keep-Alive失效),导致每次请求都重新握手。

问题4:文件传输速度达不到带宽上限

1. 计算理论最大吞吐量。例如,RTT=10ms,窗口=64KB,理论吞吐量=6.4MB/s。 2. 如果实际速度远低于理论值,检查是否发生了拥塞控制(大量重传、窗口被缩小)。 3. 检查TCP窗口缩放因子是否协商成功(Scale factor)。

问题5:间歇性丢包,难以复现

1. 设置一个循环抓包,只保留最近N分钟的数据(如 -b filesize:100000 -b files:10)。 2. 在Wireshark中,创建一个IO图表,添加两条线:tcp.analysis.lost_segment(丢包)和 tcp.analysis.retransmission(重传)。 3. 观察图表,找出丢包/重传的峰值时间点。 4. 查看该时间点附近的流量,分析是哪个IP/端口导致的。

---

五、最佳实践与总结

行业最佳实践建议

1. 标准化抓包流程:制定团队内部的抓包规范,包括抓包点选择、过滤条件、文件命名规则、分析步骤等。例如,统一使用 .pcapng 格式,文件名包含时间、用户、应用。 2. 建立基线数据:在网络正常时,定期抓包并记录关键指标(如平均RTT、重传率、吞吐量)。当故障发生时,与基线对比,能快速发现问题。 3. 使用Wireshark专家系统:Wireshark的分析 -> 专家信息 窗口会汇总所有错误、警告、备注。这是快速定位问题的起点。 4. 多视角分析:不要只看一个抓包文件。如果条件允许,同时在客户端、服务器和中间交换机上抓包,从三个视角看同一个TCP连接,能快速定位故障点。 5. 善用命令行工具tshark(Wireshark的命令行版本)可以用于自动化分析。例如,tshark -r capture.pcapng -q -z io,stat,1,tcp.analysis.retransmission 可以统计每秒的重传次数。

安全注意事项

扩展学习方向

总结:

各位,今天我们从一个只会“看”Wireshark的工程师,进化成了一个能“读”懂数据包背后故事的侦探。记住,网络排障不是玄学,而是基于证据的科学。Wireshark是你的显微镜,而你对TCP/IP协议的理解是你的智慧。

下次当用户再对你说“网慢”时,不要慌张。打开Wireshark,用我们今天学到的知识去分析:是握手慢了?是重传多了?是窗口堵了?还是应用层卡了?

纸上得来终觉浅,绝知此事要躬行。 回去后,找一台测试机,搭建一个简单的Web服务,然后模拟各种故障(如用 tc 命令模拟丢包、延迟),自己抓包、自己分析。只有亲手操作过,才能真正掌握这门手艺。

好了,下课!有问题随时来找我。

在博海学习网开始学习 →