跳转到正文

网络不通怎么办?ping 和 traceroute 背后到底在发什么包? ​

在前面的课程中,我们掌握了 IP 协议如何给每个设备分配地址,以及路由器如何通过路由表把数据包一跳一跳送达目的地。

但是,真实网络环境是极其复杂的:网线可能松动、端口可能被禁用、路由表可能缺少条目、防火墙可能阻断连接。当数据包在半路“死掉”或者被丢弃时,发送方怎么知道发生了什么?网络管理员又是如何排查“故障究竟卡在哪一台设备”的?

这就必须依赖网络层的“信使与医生”——互联网控制报文协议(ICMP),以及基于它构建的两大核心诊断兵器:ping 探测 和 traceroute 路由追踪。


学完本课后,你将能够:

  1. 说明 ICMP 的定位与核心使命:为什么不可靠的 IP 协议必须由 ICMP 来补充“差错通知”与“信息查询”。
  2. 拆解 ping 的工作闭环:掌握 ICMP Type 8(回显请求)与 Type 0(回显应答)的数据往返与 RTT 计算。
  3. 推演 traceroute 探测路由路径的底层机理:如何巧妙利用逐跳递增的 生存时间(TTL) 与 ICMP Type 11 超时报文揭开整条网络转发链条。
  4. 辨识 华为 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 个字节都具有统一的格式:

字节偏移字段名称位宽作用与含义
0Type(类型)8 bit标识 ICMP 报文的大类(例如 8 为回显请求,0 为回显应答,11 为超时)
1Code(代码)8 bit在大类下的具体细分原因(例如目标不可达时,0 代表网络不可达,1 代表主机不可达,3 代表端口不可达)
2 ~ 3Checksum(校验和)16 bit校验整个 ICMP 报文(首部 + 内容)的完整性,一旦出错直接丢弃
4 ~ 7内容因类型而异32 bit根据 Type 的不同填充标识符(Identifier)、序号(Sequence Number)等

整个 ICMP 报文可以清晰地划分为两大阵营:

  1. 差错报告报文(Error-Reporting Messages):网络设备在转发数据遇到致命障碍丢弃数据包时,主动向源主机发送的事故通告。
  2. 查询报文(Query Messages):管理员或主机主动发起探测,向对端索取网络状态的回应。

ICMP ping 与 traceroute 原理图


3. 兵器一:ping 是如何测出延迟与丢包率的? ​

ping 是网络工程师日常使用频率最高的命令行工具,它的底层完全由 ICMP 查询报文驱动:

工作流程全解析 ​

假设我们在客户端 A 执行 ping 192.168.1.1:

  1. 发送 Echo Request(回显请求):
    • 客户端 A 组装一个 ICMP 报文,设置 Type = 8,Code = 0。
    • 报文主体中会填入一个递增的序列号(Sequence Number)以及发送时主机 A 的本地时间戳。
    • IP 首部目的地址为 192.168.1.1,Protocol 为 1,向网线发送出去。
  2. 接收与处理:
    • 目的主机 192.168.1.1 收到该报文,发现协议号是 1,解包发现是 ICMP Type 8。
    • 目的主机立即就地取材,构造一个 Type = 0,Code = 0 的 Echo Reply(回显应答)。
    • 应答报文原封不动地复制请求报文中的序列号和时间戳内容,目的 IP 指向客户端 A。
  3. 计算 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 正是利用了这个规则:

  1. 第一跳探测(TTL = 1):
    • traceroute 发送一个 IP 报文,将 TTL 故意设为 1,目的 IP 设为最终目标。
    • 第一台路由器(默认网关 R1)收到后,将 TTL 减 1 变成 0。
    • R1 丢弃该报文,并生成一个 ICMP Type 11 报文送回源主机。
    • 成果:源主机收到了来自 R1 的报文,成功记录了第一跳路由器的 IP 地址和往返延迟!
  2. 第二跳探测(TTL = 2):
    • traceroute 发送第二批报文,将 TTL 设为 2。
    • R1 收到后将 TTL 减 1 变成 1,正常转发给第二台路由器 R2。
    • R2 收到后将 TTL 减 1 变成 0,丢弃报文并向源主机回送 ICMP Type 11。
    • 成果:源主机成功记录了第二跳路由器 R2 的 IP 地址和延迟!
  3. 终点收尾(到达目标主机):
    • 随着 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 是必背考点:

TypeCode含义触发场景举例
00Echo Reply(回显应答)ping 成功响应
30Network Unreachable(网络不可达)路由器中没有任何能匹配目的 IP 的路由条目(路由黑洞)
31Host Unreachable(主机不可达)路由器到达了目的直连网段,但发 ARP 请求无人回应
33Port Unreachable(端口不可达)UDP 数据包抵达目标主机,但目标系统未监听该端口(traceroute 结束标志)
80Echo Request(回显请求)ping 发起的探测请求包
110Time 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. 课后核心测验 ​

课后巩固 · 练习 · 单选

我们日常使用 ping 192.168.1.1 测试网络连通性时,ping 工具底层使用的是哪一种协议和报文类型?

课后巩固 · 练习 · 单选

traceroute(路由追踪)工具能够探测出数据包跨越网络时经过的沿途每一台路由器的 IP 地址,它主要巧妙利用了 IP 协议中的哪项机制?

8. 下一步学习 ​

恭喜你!你已经掌握了网络管理员手中最锐利的“听诊器与定位仪”——ICMP、ping 与 traceroute。

但你有没有想过:如果发送端发出的数据非常大(比如一次性发 4000 字节),而物理网线的以太网 MTU 最大只有 1500 字节,网络层会发生什么?

在下一课中,我们将深入探索数据包的“碎石重组手术”——第 20 课 · MTU、分片与路径 MTU 发现。