深入解析 ICMP 报错代码:从 3+0、3+1 到端口不可达的网络故障排查全指南
本文系统梳理 ICMP 目的不可达(Type 3)系列报错的成因、原理与排查方法,重点解析"缺路由(3+0)"、"缺 ARP(3+1)"与"端口不可达"三类经典故障,帮助网络工程师建立完整的故障定位思维框架。
目录
- 前言:为什么一条 ICMP 报错能救命
- ICMP 协议基础回顾
- ICMP 目的不可达(Type 3)全家族解析
- 报错 3+0:网络不可达 —— 缺路由故障深度剖析
- 报错 3+1:主机不可达 —— 缺 ARP 故障深度剖析
- 端口不可达:传输层的"闭门羹"
- 三类不可达报错横向对比
- 完整故障排查方法论与工具箱
- 实战案例:三个典型故障的定位全过程
- 常见误区与 FAQ
- 总结
一、前言
在日常网络运维和故障排查中,我们几乎每天都会与ping、tracert打交道。当你执行ping 192.168.10.100时,屏幕上可能出现的并不总是令人安心的Reply from ...,而是各种各样的报错:
Destination host unreachable. Destination net unreachable. Request timeout.很多初学者面对这些报错时,往往只能得出一个模糊的结论——“网络不通”。但经验丰富的网络工程师却能够从这短短一行字中,精确地判断出故障发生的层级、位置甚至根因。这背后的关键,就是 ICMP(Internet Control Message Protocol,互联网控制报文协议)的报错代码机制。
本文将围绕三类最经典、最容易混淆的 ICMP 目的不可达报错展开:
- 报错代码 3+0(网络不可达):设备转发报文时查找不到目标网段的路由条目,即"缺路由"故障;
- 报错代码 3+1(主机不可达):设备存在到达目标的路由,但 ARP 解析失败,无法获得目标主机的 MAC 地址,即"缺 ARP"故障;
- 端口不可达(3+3):报文成功送达目标主机,但目标主机上没有应用程序监听对应的端口。
这三种报错分别对应了报文转发旅程中的三个不同阶段:路由查找 → ARP 解析 → 端口交付。理解了它们,你就掌握了一把解剖网络故障的手术刀。
二、ICMP 协议基础回顾
2.1 ICMP 是什么?
ICMP 是 TCP/IP 协议族中的一个子协议,用于在 IP 主机、路由器之间传递控制消息。它不传输用户数据,而是负责报告差错、交换网络状态信息。我们最常用的ping命令基于 ICMP Echo Request/Reply(类型 8/0),而各种报错信息则来自 ICMP 差错报告报文。
需要特别强调:ICMP 报文是封装在 IP 报文内部传输的,它并没有独立的传输层端口。其封装结构如下:
+-------------------+------------------+---------------------------+ | IP 首部 (20B) | ICMP 首部 (8B) | ICMP 数据(含原报文头) | | 协议号字段 = 1 | Type | Code ... | 原始 IP 头 + 前 8 字节数据 | +-------------------+------------------+---------------------------+2.2 ICMP 报文格式
所有 ICMP 报文的前 8 个字节格式统一:
| 字段 | 长度 | 说明 |
|---|---|---|
| Type(类型) | 1 字节 | 标识报文大类,如 0=Echo 应答、3=目的不可达、8=Echo 请求、11=超时 |
| Code(代码) | 1 字节 | 在 Type 之内进一步细分具体原因 |
| Checksum | 2 字节 | 校验和 |
| 其余 4 字节 | 4 字节 | 视类型而定(如 Echo 中为标识符+序号;不可达报文中通常为 0) |
Type + Code 的组合,就是网络故障的"病历编码"。本文讨论的所有内容都围绕Type=3下的不同 Code 展开。
2.3 差错报文的重要特性:携带"案发现场"
ICMP 差错报文有一个非常关键的设计:数据部分会携带触发差错的原始 IP 报文的首部及其前 8 个字节的数据。前 8 字节恰好包含了 TCP/UDP 的源端口和目的端口字段。这样,发送方收到差错报文后,就能明确知道是"哪个应用、哪个连接"出了问题。这也是 Wireshark 抓包时能够直接展示 “ICMP error for …” 关联信息的原因。
2.4 ICMP 差错报文不会嵌套发送
为防止报文风暴,RFC 规定:ICMP 差错报文本身出错时,不会再触发新的 ICMP 差错报文。此外,目的地址为广播/组播地址、源地址非法(如 0.0.0.0、环回地址)的报文也不会触发差错报告。这在排查"为什么有的报错没有回显"时非常重要。
三、ICMP 目的不可达(Type 3)全家族解析
Type 3(Destination Unreachable)是最庞大的一个 ICMP 家族,RFC 792 及后续 RFC 1122、RFC 4443 共定义了 16 个 Code。下表列出了工程实践中最常见的几个:
| Type | Code | 名称 | 含义 | 触发者 |
|---|---|---|---|---|
| 3 | 0 | Net Unreachable | 网络(网段)不可达 | 中间路由器或本机 |
| 3 | 1 | Host Unreachable | 主机不可达 | 最后一跳路由器或本机 |
| 3 | 2 | Protocol Unreachable | 协议不可达 | 目标主机 |
| 3 | 3 | Port Unreachable | 端口不可达 | 目标主机 |
| 3 | 4 | Fragmentation Needed and DF Set | 需要分片但 DF 位置位 | 中间路由器 |
| 3 | 5 | Source Route Failed | 源站路由失败 | 中间路由器 |
| 3 | 9/10 | Network/Administratively Prohibited | 网络/管理策略禁止 | 中间设备(ACL/防火墙) |
| 3 | 13 | Communication Administratively Prohibited | 通信被管理策略禁止 | 中间设备 |
3+4(需要分片但 DF 置位)虽然不在本文三大主角之列,但它极其重要——它是 PMTUD(路径 MTU 发现)机制的核心,是"ping 得通但网页打不开、SSH 卡死"这类经典疑难杂症的元凶,值得单独关注。
下面我们逐一深入分析 3+0、3+1 和 3+3。
四、报错 3+0:网络不可达 —— 缺路由故障深度剖析
4.1 报文转发前发生了什么?
要理解 3+0,必须先搞清楚路由器转发一个 IP 报文的完整决策流程。当一台三层设备(路由器、三层交换机或主机自身)收到需要转发的 IP 报文时,它会执行以下步骤:
┌─────────────────────────────────────────────┐ │ ① 提取报文的目的 IP 地址 │ │ ② 查询路由表(FIB): │ │ - 精确匹配最长前缀 │ │ - 是否有匹配的路由条目? │ │ │ │ │ ┌────┴─────┐ │ │ 有 没有 │ │ │ │ │ │ ③ 确定出接口 └──► 返回 ICMP Type3 Code0 │ │ 和下一跳 (网络不可达) │ │ │ │ │ ④ 下一跳是直连? │ │ │ │ │ ⑤ ARP 解析下一跳/目的主机 MAC │ │ │ │ │ 成功 ──► 封装二层帧,转发 │ │ 失败 ──► 返回 ICMP Type3 Code1(主机不可达) │ └─────────────────────────────────────────────┘ICMP 3+0 发生在流程的第②步:设备在路由表中做最长匹配查找后,发现没有任何一条路由(包括默认路由)能够匹配报文的目的网段,于是丢弃报文,并向源端返回Type=3, Code=0的目的不可达报文。
4.2 3+0 的判定要点
触发 3+0 的核心条件可以概括为一句话:
“我不知道去往这个网段的路。”
注意,这里的判断粒度是网段(网络)而非具体主机。设备根本不关心目标主机是否存活,因为它连"从哪个接口把报文丢出去"都无法确定。
典型场景包括:
中间路由器缺少回程路由或去程路由
网络 A(192.168.1.0/24)中的 PC 访问网络 B(172.16.1.0/24),若 R1 上没有到 172.16.1.0/24 的路由条目且没有配置默认路由,R1 会直接向 PC 返回 3+0。主机本机路由表缺失
Windows/Linux 主机自身也维护路由表。如果主机要去往一个非直连网段,而本机既无明细路由也无默认网关(网关未配置或配置错误),主机会在本地直接返回 “Destination net unreachable”,此时抓包会发现该 ICMP 报文的源 IP 就是本机。路由协议邻居中断导致路由撤销
原本通过 OSPF/BGP 学到的路由因邻居 Down 被撤销后,转发该网段流量的设备开始回送 3+0。这种故障往往具有"突发性"和"大面积"特征。路由策略(Policy-Based Routing)或 ACL 显式拒绝
某些设备配置了策略路由,匹配到 “deny/丢弃” 动作时,也可能返回不可达报文(视厂商实现,也可能返回 3+9/3+13)。
4.3 命令行上的表现
在 Windows 上 ping 一个不可达网段:
C:\> ping 10.99.99.1 正在 Ping 10.99.99.1 具有 32 字节的数据: 来自 192.168.1.254 的回复: 无法访问目标网。 (Destination net unreachable) 来自 192.168.1.254 的回复: 无法访问目标网。关键线索:注意"来自 X.X.X.X 的回复"中的地址!
- 如果这个地址是你自己的 IP(如本例中的 192.168.1.1 是本机),说明本机路由表有问题;
- 如果这个地址是网关或某台中间路由器,说明是链路上某台设备缺路由。
在 Linux 上:
$ping10.99.99.1 From192.168.1.254icmp_seq=1Destination Net Unreachable在 Wireshark 中,该报文的解码为:
Internet Control Message Protocol Type: 3 (Destination unreachable) Code: 0 (Net unreachable)4.4 3+0 故障的系统化排查步骤
第一步:确认报错来源设备
根据 ping 回显中"来自"的 IP,定位是哪台设备发出的不可达报文。这是区分"本机问题"还是"网络问题"的分水岭。
第二步:检查本机路由表
# Windowsroute print# 重点看 0.0.0.0 默认路由是否存在、网关是否正确# Linuxiproute show# 或route-n检查项:
- 是否存在到达目标网段的明细路由?
- 是否存在默认路由(0.0.0.0/0)?
- 默认网关是否可达(ping 网关试试)?
第三步:逐跳排查中间设备路由表
登录报错设备,执行:
# 华为/H3C display ip routing-table 10.99.99.1 verbose display ip routing-table protocol ospf # Cisco show ip route 10.99.99.1如果确实无路由,进一步分析原因:
# 检查路由协议邻居状态 display ospf peer brief # 华为/H3C show ip ospf neighbor # Cisco # 检查接口状态 display interface brief第四步:验证修复
补配静态路由或修复动态路由协议后:
# 华为设备示例 ip route-static 10.99.99.0 255.255.255.0 192.168.2.1再次 ping 测试确认。
4.5 一个细节:3+0 与"请求超时"的区别
很多初学者混淆“无法访问目标网”(3+0)和“请求超时”(Request Timeout)。两者本质区别在于:
| 现象 | 本质 | 说明 |
|---|---|---|
| 无法访问目标网(3+0) | 有设备明确告诉你"没路" | 收到了 ICMP 差错报文 |
| 请求超时 | 没有任何人回应你 | 报文被静默丢弃(防火墙拦截、目标宕机、路由黑洞等) |
因此,收到 3+0 报错其实是"幸运的"——至少链路上有设备愿意告诉你故障原因。而超时则信息量极少,排查难度更大。
五、报错 3+1:主机不可达 —— 缺 ARP 故障深度剖析
5.1 什么是"有路由,但找不到主机"?
如果说 3+0 是"路都不认识",那么3+1 就是"路认识,走到最后一跳却发现门牌号对不上人"。
触发 3+1 的条件:
设备已经通过路由查找确定了出接口和下一跳(或目的地就是直连网段内的主机),但在ARP 解析阶段,无法获得目标主机(或下一跳)的 MAC 地址,报文无法完成二层封装,最终被丢弃,设备向源端返回
Type=3, Code=1报文。
回顾第一节的转发流程图:3+1 发生在第⑤步——ARP 解析失败之后。
5.2 ARP 解析的完整过程与失败点
当设备需要将报文发往直连网段内的目标主机时:
① 设备广播 ARP Request: "谁是 192.168.1.100?请告诉 192.168.1.1" │ ② 等待 ARP Reply(通常重试 3~5 次,每次间隔约 1 秒) │ ┌────┴─────────────────────┐ 收到回复 无人应答 │ │ ③ 学习到 MAC,写入 ARP 表 ③ ARP 表项老化/删除, 完成封装,转发报文 返回 ICMP 3+1(主机不可达)ARP 解析失败的常见原因:
- 目标主机已关机、宕机或网卡禁用——物理上不存在,自然无人应答 ARP;
- 目标主机 IP 地址配置错误(如实际配的是 192.168.1.101,你却访问 .100);
- VLAN 划分错误:目标主机与网关不在同一个二层广播域,ARP 广播根本到不了目标;
- 二层链路故障:交换机端口 Down、网线故障、STP 阻塞异常;
- ARP 安全机制拦截:如 DAI(动态 ARP 检测)、ARP 防攻击策略丢弃了 ARP 报文;
- 主机防火墙丢弃 ARP(少见但存在,某些主机安全软件会限制 ARP 响应);
- 免费 ARP/ARP 代理配置问题导致的解析异常;
- IP 地址冲突:ARP 响应异常,MAC 表项抖动。
5.3 3+1 与 3+0 的核心区分
这是本文最重要的知识点之一,用一张表说清楚:
| 对比维度 | 3+0 网络不可达 | 3+1 主机不可达 |
|---|---|---|
| 故障发生阶段 | 路由查找阶段(三层查表) | ARP 解析阶段(三层→二层映射) |
| 路由表状态 | 没有到目标网段的路由 | 有到目标网段的路由 |
| 故障性质 | 路由层面缺失(缺路由) | 地址解析层面缺失(缺 ARP) |
| 目标主机状态 | 设备不关心/不知道 | 大概率目标主机不存在或不响应 |
| 排查方向 | 查路由表、路由协议、静态路由、默认网关 | 查主机存活、二层连通性、VLAN、ARP 表 |
| 典型 CLI 表现 | Destination net unreachable | Destination host unreachable |
一句话记忆:先查路,路通了再查人。3+0 是没路,3+1 是有路没人。
5.4 命令行与抓包表现
Windows ping 直连网段内一台已关机的主机:
C:\> ping 192.168.1.100 正在 Ping 192.168.1.100 具有 32 字节的数据: 来自 192.168.1.1 的回复: 无法访问目标主机。 (Destination host unreachable) 来自 192.168.1.1 的回复: 无法访问目标主机。注意:这里返回 3+1 的是网关 192.168.1.1——因为网关有直连路由(有路),但 ARP 解析不到关机主机的 MAC(没人)。
如果目标主机就是本机同网段的邻居,且本机自己做 ARP 失败,那么"来自"的会是本机自己的 IP。
Wireshark 抓包会看到如下报文序列(非常典型,建议牢记):
No. Source Destination Info 1 192.168.1.1 192.168.1.100 ARP Who has 192.168.1.100? Tell 192.168.1.1 2 192.168.1.1 192.168.1.100 ARP Who has 192.168.1.100? Tell 192.168.1.1 (重传) 3 192.168.1.1 192.168.1.100 ARP Who has 192.168.1.100? Tell 192.168.1.1 (重传) 4 192.168.1.2 192.168.1.1 ICMP Host unreachable (Type 3, Code 1)“三次 ARP 请求无应答 + 一记 ICMP 主机不可达”——看到这个组合,即可100%确诊为 ARP 解析失败。
5.5 3+1 故障的系统化排查步骤
第一步:确认目标主机是否存活
- 现场检查主机电源、网线、网卡指示灯;
- 请用户在目标主机上执行
ipconfig/ip addr确认 IP 配置无误; - 在目标主机同网段的其他机器上
arp -a查看是否能学到目标 MAC。
第二步:在网关上检查 ARP 表
# 华为/H3C display arp interface gigabitethernet 0/0/1 display arp | include 192.168.1.100 # Cisco show arp | include 192.168.1.100 # Linux arp -n ip neigh show若 ARP 表中无该条目或状态为INCOMPLETE(Linux)/Failed,说明确实解析失败。
第三步:在网关上手工发起 ARP 探测并抓包
# Linux 网关上可用 arping 主动探测 arping -I eth0 192.168.1.100同时在网关和接入交换机上抓包:
- 网关发出了 ARP Request,但交换机上抓不到 → 二层链路/端口问题;
- ARP Request 到达目标主机端口但无 Reply → 主机侧问题(防火墙、网卡驱动、系统故障)。
第四步:检查二层配置
# 检查 VLAN 配置是否一致 display vlan display port vlan # 检查接口状态与错误计数 display interface gigabitethernet 0/0/1 # 关注 CRC 错误、input/output errors、端口是否 err-disable # 检查 MAC 地址表 display mac-address第五步:排查安全策略
- 检查是否配置了 ARP 报文限速、DAI、IPSG(IP Source Guard)导致 ARP 被丢弃;
- 检查主机防火墙/安全软件设置。
六、端口不可达:传输层的"闭门羹"
6.1 与前两者的本质不同
前两种报错(3+0、3+1)都发生在报文到达目标主机之前——是路径上的问题。而端口不可达(Type 3, Code 3)发生在报文成功抵达目标主机之后——网络层、数据链路层全部正常,问题出在传输层交付环节。
触发条件:
目标主机收到一个UDP 报文,但其协议栈发现没有任何应用程序绑定(监听)该报文的目的端口,于是丢弃该报文,并向源端返回 ICMP 端口不可达报文。
打一个比方:
- 3+0 = 快递公司说"没有通往这个城市的路线";
- 3+1 = 快递到了小区门口,但查不到这个门牌号住的是谁;
- 3+3 = 快递准确送到了某户人家门口,但这户人家拒收——“我没订这个货”。
6.2 为什么只有 UDP 会触发端口不可达?
这是一个高频考点和面试点:
- UDP 是无连接协议。发送方直接投递数据报,目标主机协议栈收到后发现端口无人监听,只能借助 ICMP 端口不可达来"通知"源端。
- TCP 是面向连接的协议。当客户端向一个未监听的 TCP 端口发起 SYN 时,目标主机协议栈会直接回复一个RST(复位)报文,而不是 ICMP 端口不可达。
因此:
- 向关闭的 TCP 端口发起连接 → 收到TCP RST,表现为 “Connection refused”;
- 向关闭的 UDP 端口发送数据 → 收到ICMP 3+3,表现为 “Port unreachable”。
6.3 经典应用:traceroute 的原理基石
ICMP 端口不可达最著名的"正经用途"就是 Unix/Linux 下的traceroute工具(Windows 的tracert使用 ICMP Echo,原理略有不同):
- traceroute 向目标发送目的端口为一个极大值(如 33434 起,几乎不可能有应用监听)的 UDP 报文,TTL 从 1 开始逐跳递增;
- TTL 减到 0 的路由器返回ICMP 超时(Type 11),从而暴露出中间每一跳的地址;
- 当报文最终到达目标主机时,因端口无人监听,目标返回ICMP 端口不可达(Type 3 Code 3);
- traceroute 收到 3+3 即判定"到达终点",探测结束。
所以说,端口不可达报文是 traceroute 的"终点哨"。理解这一点,你就能看懂 traceroute 输出中最后一跳的!X、!P等标记含义。
6.4 排查方法
当应用报 “port unreachable” 时,排查非常直接——问题一定在目标主机上:
Linux:
# 查看端口监听情况ss-tulnp|grep53# 检查 UDP 53(DNS)netstat-tulnp|grep161# 检查 UDP 161(SNMP)# 若服务未启动,启动之systemctl status named systemctl start snmpdWindows:
netstat -ano | findstr "53"常见根因:
- 目标服务进程未启动(最常见);
- 服务启动但绑定地址错误(如只监听了 127.0.0.1,未监听业务网卡地址);
- 客户端访问了错误的端口号;
- 协议不匹配:服务监听的是 TCP 端口,客户端却用 UDP 去访问(典型如 DNS 查询发到了只提供 TCP 服务的端口)。
七、三类不可达报错横向对比
现在,我们把全文的核心内容汇总为一张总表:
| 报错标识 | ICMP Type+Code | 触发层级/阶段 | 故障根因 | 报错发出者 | 目标主机是否"背锅" |
|---|---|---|---|---|---|
| 30(代码 3+0) | Type 3, Code 0 | 网络层——路由查找阶段 | 缺少目标网段路由 | 缺路由的路由器,或本机(无默认网关) | 否,报文根本没到主机 |
| 31(代码 3+1) | Type 3, Code 1 | ARP 解析阶段(二层映射) | 有目标路由,但无法解析到目标主机 MAC 地址 | 最后一跳网关/路由器,或本机 | 是(大概率主机关机、IP 错误或二层不通) |
| 端口不可达 | Type 3, Code 3 | 传输层 | 目标主机未开放对应端口的相关应用 | 目标主机本身 | 是(服务未启动/端口错误) |
再从"报文旅程"的视角串一遍:
源主机 ──► [路由查找?] ──失败──► ICMP 3+0(缺路由) │成功 ▼ [ARP 解析?] ──失败──► ICMP 3+1(缺 ARP) │成功 ▼ 逐跳转发... ──TTL=0──► ICMP 11(超时) │ ▼ 目标主机 [端口有应用监听?] │无监听(UDP) ▼ ICMP 3+3(端口不可达)这条链路就是网络故障排查的黄金主线:先三层(路由)、再二层(ARP)、最后四层(端口)。
八、完整故障排查方法论与工具箱
8.1 分层排查思想(自下而上 / 自上而下)
面对"网络不通",推荐的标准化排查顺序:
- 物理层/数据链路层:网卡灯、网线、交换机端口状态、VLAN、MAC 表;
- 网络层:本机 IP/掩码/网关配置 → 本机路由表 → ping 网关 → tracert 逐跳 → 各设备路由表 → ARP 表;
- 传输层:端口监听状态、防火墙规则(主机防火墙+网络防火墙);
- 应用层:服务进程状态、应用日志、认证/加密配置。
而 ICMP 报错代码的价值在于:它能直接告诉你应该从哪一层开始查。
- 收到 3+0 → 直接跳查网络层路由;
- 收到 3+1 → 查二层连通性与主机存活;
- 收到 3+3 → 直接上目标主机查服务进程;
- 收到超时 → 最麻烦,逐层全面排查(可能是防火墙静默丢弃)。
8.2 排查工具箱速查表
| 工具 | 平台 | 用途 | 关键命令示例 |
|---|---|---|---|
| ping | 全平台 | 连通性测试 | ping -t 10.1.1.1(Windows 持续);ping -c 4 -s 1400(Linux 指定大小) |
| tracert / traceroute | Win/Linux | 路径探测,定位故障跳 | tracert -d 10.1.1.1(-d 不解析域名,加速) |
| pathping / mtr | Win/Linux | 路径+丢包率综合诊断 | mtr -rw 10.1.1.1 |
| arp | 全平台 | 查看/管理 ARP 缓存 | arp -a、arp -d * |
| arping | Linux | 主动 ARP 探测 | arping -I eth0 192.168.1.100 |
| ipconfig / ip | Win/Linux | 接口与路由配置 | ip addr、ip route、route print |
| netstat / ss | 全平台 | 端口与连接状态 | ss -tulnp、netstat -ano |
| tcpdump / Wireshark | Linux/全平台 | 抓包终极分析 | tcpdump -i eth0 icmp or arp -nn |
| display/show | 网络设备 | 路由表、ARP 表、接口状态 | display ip routing-table、show ip route |
8.3 抓包过滤技巧
排查不可达类故障时,一条高效的 tcpdump 命令:
# 同时抓 ICMP 差错与 ARP,观察"ARP 三连问 + ICMP 主机不可达"特征tcpdump-iany-nn"icmp or arp"# 只看 ICMP 不可达tcpdump-iany-nn"icmp[icmptype]==3"# Wireshark 显示过滤器icmp.type==3arp.duplicate-address-detected8.4 一个重要提醒:ICMP 可能被限速或过滤
现代网络设备普遍对 ICMP 做了防护:
- 路由器通常启用ICMP 限速(如每秒 N 个差错报文),防止 ICMP 攻击;
- 防火墙常常直接丢弃所有 ICMP;
- 因此,收不到不可达报错 ≠ 网络正常,可能是中间设备把差错报文也拦了。
反过来,运维中也不建议完全封禁 ICMP——至少保留 Type 3(尤其是 3+4,否则 PMTUD 失效会造成 TCP 黑洞)和 Type 11,这直接影响 traceroute 等诊断工具的可用性。
九、实战案例
案例一:跨网段访问失败 —— 3+0 缺路由
现象:研发部 PC(192.168.10.2/24,网关 192.168.10.1)无法访问测试服务器(172.16.5.20),ping 提示:
来自 192.168.10.1 的回复: 无法访问目标网。分析:报错来自网关 192.168.10.1,且是"目标网"不可达(3+0)→ 网关路由表中没有到 172.16.5.0/24 的路由。
排查过程:
<Gateway> display ip routing-table 172.16.5.20 # 输出为空 —— 确认缺路由 <Gateway> display ospf peer brief # 发现与核心交换机的 OSPF 邻居状态为 Down根因:网关与核心之间的 OSPF 邻居因接口 MTU 不匹配无法建立,导致路由未学到。
修复:统一两端接口 MTU 后 OSPF 邻居建立,路由自动学习,业务恢复。
复盘要点:3+0 报错时,第一反应永远是登录报错设备查路由表和路由协议状态。
案例二:直连主机 ping 不通 —— 3+1 缺 ARP
现象:办公网用户反馈打印机服务器(192.168.20.50)无法访问,网关 ping 该地址返回:
来自 192.168.20.1 的回复: 无法访问目标主机。分析:3+1 主机不可达,网关有直连路由,但 ARP 解析失败。
排查过程:
<Gateway> display arp | include 192.168.20.50 # ARP 表无此条目 <Gateway> 抓包:连续 3 次 ARP Request "Who has 192.168.20.50?" 无应答进一步到接入交换机检查:
<Access-SW> display mac-address | include Vlan20 # 目标端口下未学到打印机服务器的 MAC现场检查发现:服务器网线被保洁碰松,端口处于 Down 状态。
根因:物理链路断开 → ARP 广播无法到达目标 → 解析失败 → 3+1。
复盘要点:3+1 的排查核心是"三层正常、二层或主机异常"。抓包看到"ARP 三连问无应答"即可确诊,之后沿二层往下挖:端口状态 → VLAN → MAC 表 → 主机本身。
案例三:DNS 解析失败 —— 端口不可达
现象:某 Linux 客户端访问网页极慢,dig @10.0.0.53 example.com返回:
;; communications error to 10.0.0.53#53: end of file同时在客户端抓包:
10.0.0.53 → client ICMP 54 Destination unreachable (Port unreachable)分析:ICMP 3+3 且由目标服务器 10.0.0.53 亲自返回——网络路径完全正常,是服务器上 UDP 53 端口没有应用监听。
排查过程:
# 登录 10.0.0.53ss-tulnp|grep:53# 无输出 —— named 进程未运行systemctl status named# Active: failed —— 配置文件语法错误导致启动失败根因:DNS 服务因配置文件错误崩溃未重启。
修复:修正named.conf语法后systemctl restart named,服务恢复。
复盘要点:3+3 报错是"好消息"——它证明二三层网络全部畅通,问题100%在目标主机的服务进程上,直接上机查端口监听即可,无需在网络设备上浪费时间。
十、常见误区与 FAQ
Q1:收到 3+1 就一定是目标主机关机了吗?
不一定。3+1 只说明"ARP 解析失败",原因可能是主机关机、IP 配错、VLAN 错误、二层链路故障、ARP 被安全策略拦截等多种情况,需按 5.5 节的流程逐一排除。
Q2:为什么有时主机明明在线,网关还是返回 3+1?
常见于:主机防火墙/安全软件丢弃了 ARP 请求;主机与网关实际不在同一 VLAN;或存在 IP 地址冲突导致 ARP 表异常抖动。
Q3:ping 不通但没收到任何报错,是什么情况?
这是"请求超时",说明报文被静默丢弃(防火墙 DROP 策略、路由黑洞、目标宕机且不回应 ARP 等)。与 3+0/3+1 的"明确报错"相比信息量更少,需要结合 tracert 和两端抓包定位丢弃点。
Q4:TCP 端口关闭为什么抓不到 ICMP 端口不可达?
因为 TCP 协议栈对未监听端口的 SYN 直接回复 RST,不使用 ICMP。只有 UDP 报文投递到无监听端口时才产生 ICMP 3+3。
Q5:3+0 报错的源 IP 是路由器接口地址,能说明路由器坏了吗?
不能。这恰恰说明路由器工作正常——它在正确地履行"报告差错"的职责。真正的问题是它的路由表缺失,可能是配置遗漏,也可能是路由协议故障。
Q6:能否用 ICMP 报错做攻击?如何防范?
可以。典型的如 ICMP 不可达报文泛洪(利用伪造源地址让路由器向受害者持续发送差错报文)、Smurf 攻击等。防范措施:对 ICMP 差错报文限速(CoPP/控制平面保护)、过滤源地址非法的报文、边界防火墙合理限制 ICMP 类型(但勿全禁,需保留 3+4 以支持 PMTUD)。
十一、总结
本文以 ICMP 目的不可达家族的三个经典成员为主线,完整梳理了报文转发路径上的三大故障卡点:
3+0(网络不可达)——缺路由:故障卡在网络层路由查找阶段,设备路由表中不存在匹配目标网段的条目(且无默认路由)。排查核心:查路由表、查路由协议、查默认网关。
3+1(主机不可达)——缺 ARP:设备有路由,但卡在ARP 解析阶段,无法获得目标主机(或下一跳)的 MAC 地址。排查核心:查主机存活、查二层连通性、查 VLAN 与 ARP 表,抓包认准"ARP 三连问无应答"特征。
3+3(端口不可达):报文已成功抵达目标主机,卡在传输层端口交付阶段,UDP 报文的目的端口无应用监听。排查核心:直接登录目标主机查服务进程与端口绑定。
三者的关系可以浓缩为一句话:
路由决定"走不走得到那个网",ARP 决定"找不找得到那个人",端口决定"那个人收不收这份信"。
掌握了 ICMP 报错代码的语义,网络故障排查就从"盲人摸象"变成了"按图索骥"。希望本文能帮助你在下一次面对Destination unreachable时,能够迅速、准确地锁定故障层级与根因。
如果本文对你有帮助,欢迎点赞、收藏、关注三连支持!有任何问题或不同见解,欢迎在评论区交流讨论。
参考标准:RFC 792(ICMP)、RFC 1122(主机要求)、RFC 826(ARP)、RFC 1393(Traceroute)