1. 引言

在系统运维中,我们每天都会面对各种各样的错误信息。理解这些信息的含义,是快速定位问题、排除瓶颈的关键。

在现代分布式系统中,有两个常见的错误信息经常出现:“Request Timed Out”“Destination Host Unreachable”。它们看似相似,但背后可能隐藏着截然不同的网络问题。

本文将深入解析这两个错误的本质,并介绍用于排查问题的常用工具,帮助你快速定位网络故障。


2. ICMP 协议简介

ICMP(Internet Control Message Protocol)是与 IP 协议同时设计的控制协议,定义在 RFC792 中。它的主要作用是为 IP 网络提供诊断和控制信息

ICMP 是基于 IP 的协议,与 TCP、UDP 一样运行在 IP 层之上。虽然部分原始功能已被弃用,但 ICMP 仍在现代网络中广泛使用,尤其是在网络连通性检测方面。

常见的 ICMP 控制消息如下(完整列表可参考 维基百科):

Type    Code    Description
-----------------------------------------------------
0       0       Echo Reply(用于 ping)
3       0       Destination network unreachable
3       1       Destination host unreachable
3       2       Destination protocol unreachable
3       3       Destination port unreachable
...
8       0       Echo Request(用于 ping)
11      0       TTL expired in transit

2.1. Destination Host Unreachable

当用户主机或其网关无法找到通往目标主机的路径时,就会返回 “Destination Host Unreachable” 错误。

这通常是因为没有可用的路由路径导致的。虽然不常见,但某些网络配置或防火墙策略也可能引发该错误。

2.2. Request Timeout

“Request Timeout” 并不是 ICMP 的正式控制消息,而是客户端软件在指定时间内未收到响应时的反馈。

造成该问题的原因可能包括:

✅ 网络拥塞
✅ 目标主机宕机或无响应
✅ 数据包丢失

2.3. Time Exceeded

“Time Exceeded” 是 ICMP 的正式控制消息之一,它与时间无关,而是与跳数(hop)有关。

IP 数据包在传输过程中会携带一个 TTL(Time To Live)字段,每经过一个跳点,TTL 值减 1。当 TTL 减到 0 时,路由器会发送一个 Time Exceeded 消息回源主机。

如下图所示,客户端发送一个 TTL=10 的 IP 包,每经过一个跳点,TTL 减 1,最终到达目标服务器:

TTL

IPv6 中 TTL 被重命名为 Hop Limit,功能不变。最大值为 255,表示一个点对点通信中允许的最大跳数。

2.4. Traceroute

虽然 ICMP 中有一个 Traceroute 类型的消息,但它已被弃用。目前,traceroute 工具通过发送 ICMP Echo Request、TCP SYN 或 UDP 探针包,逐步增加 TTL 值来实现路径追踪。

当数据包 TTL 减为 0 时,路由器返回 ICMP 控制消息,traceroute 就记录下该路由器的 IP 地址,从而构建出完整的路径。


3. 网络连通性排查工具

面对 “Request Timed Out” 或 “Destination Host Unreachable” 这类错误时,我们首先要做的就是定位问题根源。以下是一些常用的排查工具:

3.1. Ping

Ping 是最基础、最常用的网络诊断命令。它通过发送 ICMP Echo Request 消息,并等待 Echo Reply 来判断网络连通性。

示例:

# ping -c 10 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=53 time=31.8 ms
...
--- 1.1.1.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9015ms
rtt min/avg/max/mdev = 29.904/64.621/319.028/86.009 ms
  • -c:指定发送的探测包数量
  • 输出中包含丢包率、往返时间(RTT)等关键指标

⚠️ 使用 -f(快速发送)和 -s(设置负载大小)参数时需谨慎,可能被误认为攻击流量。

3.2. Ping 的常见用法

为了测试高负载下的网络表现,可以使用以下命令:

# sudo ping -f -c 579 -s 1460 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 1460(1488) bytes of data.
...
579 packets transmitted, 567 received, 2.07254% packet loss, time 9249ms
rtt min/avg/max/mdev = 148.030/154.707/408.936/25.042 ms
  • -f:以最快频率发送包(需 root 权限)
  • -s:设置包大小
  • ⚠️ 不建议对非自己控制的主机使用 -f,可能被视为恶意行为

3.3. Traceroute

Traceroute 是追踪网络路径的利器,它通过逐步增加 TTL 值来记录每一跳的 IP 地址。

示例:

# traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  10.0.2.1  4.162 ms  3.856 ms  3.705 ms
 2  201.88.63.1  9.591 ms  9.481 ms  9.371 ms
...
 9  8.8.8.8  28.958 ms  32.079 ms  31.915 ms
  • -n:不解析主机名(加快输出)
  • * 表示该跳点未响应探测
  • 每跳的 RTT 可帮助判断网络延迟瓶颈

4. 小结

本文简要介绍了两个常见的网络错误:

  • Destination Host Unreachable:通常是路由问题导致
  • Request Timed Out:多由网络延迟、丢包或目标主机无响应引起

我们还介绍了两个常用排查工具:

  • Ping:测试连通性、延迟和丢包
  • Traceroute:追踪路径、定位中间节点问题

如果你需要更深入地分析网络问题,还可以使用以下工具:

  • Tcpdump / Wireshark:抓包分析数据内容和结构
  • Nmap:扫描主机和服务,检测开放端口
  • tc:模拟网络故障,测试系统容错能力

✅ 最佳实践:在防火墙中限制 ICMP 消息的出入,防止被用于网络扫描或攻击



原始标题:Request Timed Out vs. Destination Host Unreachable