外观
网络不通怎么办?ping 和 traceroute 背后到底在发什么包?
在前面的课程中,我们掌握了 IP 协议如何给每个设备分配地址,以及路由器如何通过路由表把数据包一跳一跳送达目的地。
但是,真实网络环境是极其复杂的:网线可能松动、端口可能被禁用、路由表可能缺少条目、防火墙可能阻断连接。当数据包在半路“死掉”或者被丢弃时,发送方怎么知道发生了什么?网络管理员又是如何排查“故障究竟卡在哪一台设备”的?
这就必须依赖网络层的“信使与医生”——互联网控制报文协议(ICMP),以及基于它构建的两大核心诊断兵器:ping 探测 和 traceroute 路由追踪。
学完本课后,你将能够:
- 说明 ICMP 的定位与核心使命:为什么不可靠的 IP 协议必须由 ICMP 来补充“差错通知”与“信息查询”。
- 拆解 ping 的工作闭环:掌握 ICMP Type 8(回显请求)与 Type 0(回显应答)的数据往返与 RTT 计算。
- 推演 traceroute 探测路由路径的底层机理:如何巧妙利用逐跳递增的 生存时间(TTL) 与 ICMP Type 11 超时报文揭开整条网络转发链条。
- 辨识 华为 ICT 大赛与实际网络排障中常见的 ICMP 状态码含义(如网络不可达、主机不可达、端口不可达)。
1. 为什么网络层必须有 ICMP?
我们在第 16 课 · IPv4 报文格式中讲过,IP 协议是一个**“尽力而为(Best-effort)”且“无连接不可靠”**的协议:
- IP 报文在传输过程中如果遇到差错(例如目的网络不存在、TTL 减到 0、路由器缓冲区溢出),IP 协议本身只会默默把数据包直接丢弃。
- IP 协议自己没有任何差错通知机制,也不会向源主机发出任何叹息或报错。
如果网络层只有单纯的 IP,发送端主机就会变成“瞎子和聋子”——发出去的数据包石沉大海,却根本不知道是哪里的路由器出了问题。
为了解决这个问题,互联网工程任务组设计了 互联网控制报文协议(ICMP)(Internet Control Message Protocol,互联网控制报文协议):
- 位置归属:ICMP 虽然在功能上服务于网络层,但它的报文并不是直接走物理层,而是直接封装在 IP 数据报的数据载荷(Payload)中!
- 协议号标识:当 IP 报文头部中的
Protocol字段取值为1时,就表示这个 IP 报文里面装的是 ICMP 报文(TCP 是 6,UDP 是 17)。
+-----------------------------------------------------------+
| 以太网帧头 (14B) | IPv4 首部 (20B, 协议号=1) | ICMP 报文主体 | FCS (4B) |
+-----------------------------------------------------------+2. ICMP 报文通用格式与两大类别
所有 ICMP 报文的前 4 个字节都具有统一的格式:
| 字节偏移 | 字段名称 | 位宽 | 作用与含义 |
|---|---|---|---|
| 0 | Type(类型) | 8 bit | 标识 ICMP 报文的大类(例如 8 为回显请求,0 为回显应答,11 为超时) |
| 1 | Code(代码) | 8 bit | 在大类下的具体细分原因(例如目标不可达时,0 代表网络不可达,1 代表主机不可达,3 代表端口不可达) |
| 2 ~ 3 | Checksum(校验和) | 16 bit | 校验整个 ICMP 报文(首部 + 内容)的完整性,一旦出错直接丢弃 |
| 4 ~ 7 | 内容因类型而异 | 32 bit | 根据 Type 的不同填充标识符(Identifier)、序号(Sequence Number)等 |
整个 ICMP 报文可以清晰地划分为两大阵营:
- 差错报告报文(Error-Reporting Messages):网络设备在转发数据遇到致命障碍丢弃数据包时,主动向源主机发送的事故通告。
- 查询报文(Query Messages):管理员或主机主动发起探测,向对端索取网络状态的回应。
3. 兵器一:ping 是如何测出延迟与丢包率的?
ping 是网络工程师日常使用频率最高的命令行工具,它的底层完全由 ICMP 查询报文驱动:
工作流程全解析
假设我们在客户端 A 执行 ping 192.168.1.1:
- 发送 Echo Request(回显请求):
- 客户端 A 组装一个 ICMP 报文,设置
Type = 8,Code = 0。 - 报文主体中会填入一个递增的序列号(Sequence Number)以及发送时主机 A 的本地时间戳。
- IP 首部目的地址为
192.168.1.1,Protocol 为1,向网线发送出去。
- 客户端 A 组装一个 ICMP 报文,设置
- 接收与处理:
- 目的主机
192.168.1.1收到该报文,发现协议号是 1,解包发现是 ICMP Type 8。 - 目的主机立即就地取材,构造一个
Type = 0,Code = 0的 Echo Reply(回显应答)。 - 应答报文原封不动地复制请求报文中的序列号和时间戳内容,目的 IP 指向客户端 A。
- 目的主机
- 计算 RTT 与丢包:
- 客户端 A 收到 Echo Reply,用当前时间减去报文里原样带回的时间戳,得到一次完整的往返时延(Round-Trip Time, RTT)。
- 如果发送了 4 个 Request,但只收到了 3 个 Reply,说明丢包率为 25%。
真实场景:为什么很多服务器 ping 不通却能正常打开网页?
这是因为不少企业的防火墙策略为了防止恶意扫描或拒绝服务攻击,在入口处配置了规则直接丢弃所有入站的 ICMP Type 8 报文。ping 不通并不代表网络断开,HTTP/HTTPS(TCP 80/443)依旧可以正常通信。
4. 兵器二:traceroute 如何逐跳揪出沿途路由器?
当我们从北京访问深圳的服务器时,数据包可能要穿过 10 多台路由器。如果某一跳出现拥堵或断网,我们如何知道“具体是在第几跳断开的”?
这就轮到 traceroute 路由追踪(路由追踪,Windows 下命令为 tracert) 登场了。它的设计思路堪称计算机网络中最精妙的“借刀杀人”机制:利用故意设小的 生存时间(TTL),逼迫沿途路由器向源端发 ICMP 差错报文!
逐跳探路三步推演
回顾第 16 课:IP 报文中的 TTL 每过一台路由器减 1,减到 0 时,路由器必须丢弃该报文,并向源 IP 发送一个 ICMP Type 11, Code 0(TTL 超时,Time Exceeded) 报文。
traceroute 正是利用了这个规则:
- 第一跳探测(TTL = 1):
- traceroute 发送一个 IP 报文,将
TTL故意设为1,目的 IP 设为最终目标。 - 第一台路由器(默认网关 R1)收到后,将 TTL 减 1 变成 0。
- R1 丢弃该报文,并生成一个 ICMP Type 11 报文送回源主机。
- 成果:源主机收到了来自 R1 的报文,成功记录了第一跳路由器的 IP 地址和往返延迟!
- traceroute 发送一个 IP 报文,将
- 第二跳探测(TTL = 2):
- traceroute 发送第二批报文,将
TTL设为2。 - R1 收到后将 TTL 减 1 变成 1,正常转发给第二台路由器 R2。
- R2 收到后将 TTL 减 1 变成 0,丢弃报文并向源主机回送 ICMP Type 11。
- 成果:源主机成功记录了第二跳路由器 R2 的 IP 地址和延迟!
- traceroute 发送第二批报文,将
- 终点收尾(到达目标主机):
- 随着 TTL 逐次递增为 3、4、5... 沿途路由器被依次揪出。
- 当报文终于抵达目标主机时,目标主机不会再减 TTL,那源端怎么知道到头了呢?
- Linux / 华为实现:traceroute 默认发送的是 UDP 报文,目的端口故意选一个不可能被监听的高端口(如 33434)。目标主机收到后发现没有服务监听该端口,于是向源主机发送 ICMP Type 3, Code 3(目标不可达 · 端口不可达) 报文!源主机收到端口不可达,便知道已经成功抵达终点,探测结束。
- Windows 实现(tracert):直接发送 ICMP Echo Request,目标主机收到后回应正常的 ICMP Echo Reply,源主机收到后停止探测。
5. 华为 ICT 大赛与排障高频 ICMP 状态速查表
在华为 ICT 大赛及日常抓包分析中,以下 Type 和 Code 是必背考点:
| Type | Code | 含义 | 触发场景举例 |
|---|---|---|---|
| 0 | 0 | Echo Reply(回显应答) | ping 成功响应 |
| 3 | 0 | Network Unreachable(网络不可达) | 路由器中没有任何能匹配目的 IP 的路由条目(路由黑洞) |
| 3 | 1 | Host Unreachable(主机不可达) | 路由器到达了目的直连网段,但发 ARP 请求无人回应 |
| 3 | 3 | Port Unreachable(端口不可达) | UDP 数据包抵达目标主机,但目标系统未监听该端口(traceroute 结束标志) |
| 8 | 0 | Echo Request(回显请求) | ping 发起的探测请求包 |
| 11 | 0 | Time Exceeded(TTL 传输中超时) | 数据包在路由环路中死循环耗尽 TTL,或 traceroute 探针故意触发 |
6. 华为 VRP 设备实战命令
在华为路由器或交换机上进行网络连通性排查时:
text
<Huawei> ping 10.1.1.1
PING 10.1.1.1: 56 data bytes, press CTRL_C to break
Reply from 10.1.1.1: bytes=56 Sequence=1 ttl=255 time=2 ms
Reply from 10.1.1.1: bytes=56 Sequence=2 ttl=255 time=1 ms
--- 10.1.1.1 ping statistics ---
2 packet(s) transmitted
2 packet(s) received
0.00% packet loss
round-trip min/avg/max = 1/1/2 ms
<Huawei> tracert 10.1.1.1
traceroute to 10.1.1.1(10.1.1.1), max hops: 30 ,packet length: 40,press CTRL_C to break
1 192.168.1.254 3 ms 2 ms 2 ms
2 10.1.1.1 5 ms 4 ms 3 ms- 若某跳显示
* * *,说明该跳路由器配置了防火墙策略禁发 ICMP 超时包,或者回包路径发生丢包。
7. 课后核心测验
8. 下一步学习
恭喜你!你已经掌握了网络管理员手中最锐利的“听诊器与定位仪”——ICMP、ping 与 traceroute。
但你有没有想过:如果发送端发出的数据非常大(比如一次性发 4000 字节),而物理网线的以太网 MTU 最大只有 1500 字节,网络层会发生什么?
在下一课中,我们将深入探索数据包的“碎石重组手术”——第 20 课 · MTU、分片与路径 MTU 发现。