3. 网络层排查:ping不通怎么办?ICMP报文分析与路由追踪
TCP连接超时,很多时候卡在网络层。说白了,就是数据包根本到不了对端。这时候,ping和traceroute就是我们的“探路先锋”。我个人习惯,遇到连接问题,先ping一下,看看网络层通不通。
3.1 先聊聊ICMP:ping背后的协议
ping工具用的是ICMP协议(Internet Control Message Protocol)。它不传输用户数据,专门用来传递控制信息和错误报告。你想想看,IP协议本身是不可靠的,它只管把包扔出去,至于到没到、出了什么问题,它不管。ICMP就是来补这个缺的。
ICMP报文封装在IP数据报里。结构很简单:
| 类型(8bit) | 代码(8bit) | 校验和(16bit) |
| 内容(取决于类型和代码) |
类型和代码决定了报文的意义。比如:
| 类型 | 代码 | 含义 | 常见场景 |
|---|---|---|---|
| 0 | 0 | Echo Reply | ping回复 |
| 8 | 0 | Echo Request | ping请求 |
| 3 | 0 | Destination Unreachable (Network) | 网络不可达 |
| 3 | 1 | Destination Unreachable (Host) | 主机不可达 |
| 3 | 3 | Destination Unreachable (Port) | 端口不可达 |
| 11 | 0 | Time Exceeded (TTL expired) | 路由追踪用 |
嗯,这里要注意:ping不通,不代表TCP就一定连不上。有些网络设备会直接丢弃ICMP报文,但放行TCP流量。不过,大多数情况下,ping不通意味着网络层有问题。
3.2 ping不通的几种可能
ping不通,原因很多。我按排查顺序列一下:
- 目标主机没开机或宕机 —— 最简单的情况,先确认对端活着。
- 网络不通 —— 物理链路、交换机、路由器有问题。
- 防火墙拦截 —— 中间设备或主机防火墙丢弃了ICMP。
- 路由问题 —— 没有回程路由,或者路由指向错误。
- ARP解析失败 —— 在同一个二层网络里,拿不到对端的MAC地址。
怎么快速定位?我一般用“分段法”:
- 先ping网关,看本地网络通不通。
- 再ping目标IP,看端到端通不通。
- 如果网关通、目标不通,大概率是中间路由或防火墙的问题。
3.3 路由追踪:traceroute的妙用
ping只能告诉你通不通,但通不了的时候,问题出在哪一跳?这时候就要用traceroute(Windows下叫tracert)。
它的原理很简单:利用TTL(Time To Live)字段。每经过一个路由器,TTL减1。当TTL减到0时,路由器会返回一个ICMP Time Exceeded报文。traceroute从TTL=1开始发探测包,逐跳增加,就能拿到每一跳的IP地址。
举个例子:
# Linux/macOS
traceroute -n 8.8.8.8
# Windows
tracert -d 8.8.8.8
输出大概长这样:
1 192.168.1.1 1.234 ms 1.123 ms 1.098 ms
2 10.0.0.1 5.678 ms 5.543 ms 5.432 ms
3 172.16.0.1 10.234 ms 10.123 ms 10.098 ms
4 * * * 请求超时
5 203.0.113.1 30.456 ms 30.321 ms 30.234 ms
看到第4跳超时了吗?这不一定代表那台设备挂了。有些路由器不响应ICMP Time Exceeded,或者配置了限速。我个人习惯,连续3跳都超时,才怀疑有问题。
3.4 实战:用traceroute定位问题
我记得有一次,客户反馈从A地到B地的TCP连接经常超时。我ping了一下,丢包率5%左右。用traceroute一看:
1 10.0.0.1 1ms
2 172.16.1.1 2ms
3 192.168.1.1 50ms 50ms 50ms
4 10.10.10.1 100ms 100ms 100ms
5 203.0.113.1 150ms 150ms 150ms
看到第3跳延迟突然从2ms飙升到50ms,而且后面每一跳都稳定增加。这说明第3跳设备可能负载过高,或者链路质量差。后来联系运营商,发现是那条链路上有光模块故障。
所以,traceroute不仅能看通不通,还能看每一跳的延迟。如果某跳延迟突然飙升,或者出现丢包,那大概率就是瓶颈所在。
3.5 本章知识体系
下面这张图,帮你理清本章的核心逻辑:
3.6 总结一下
网络层排查,说白了就是两板斧:ping和traceroute。ping告诉你通不通,traceroute告诉你在哪不通。ICMP报文里的类型和代码,能帮你进一步缩小范围。
我个人建议,遇到TCP超时,先别急着抓包。花30秒ping一下,再花1分钟traceroute,往往就能定位个七七八八。这比直接上Wireshark高效得多。
mtr 命令,它结合了ping和traceroute的功能,实时显示每一跳的丢包率和延迟。我排查网络问题时,经常开着mtr观察。