首页/网络/协议速查/ICMP 目的不可达(类型 3)

ICMP 目的不可达(类型 3)

最常见的 ICMP 差错:路由器或主机因网络/主机/端口/分片等原因无法交付时回送,代码(Code)区分具体原因。

协议速查网络更新于 2026-10-13

ICMP 目的不可达是什么

ICMP 类型 3 是最常见的差错消息:路由器或主机发现报文无法交付时,回送一条目的不可达,并用 Code(代码)说明具体原因。需要注意的是 ICMP 差错只携带原始 IP 头加前 8 字节的数据,因此它是提示而非完整回执;UDP 没有连接概念,很多失败判断都依赖这类消息。

基本信息

类型3(Destination Unreachable)
代码范围0-15,常用 0/1/3/4/9/10/13
封装内容原始 IP 头 + 原始载荷前 8 字节
关键用途无路由通告、端口探测判定、PMTUD 触发
规范RFC 792、RFC 1812 §4.3.2
抓包过滤icmp[0] == 3

典型使用场景

  • 确认目标网段是否真的无路由:类型 3 代码 0 表示路由器查不到路由
  • traceroute 用 UDP 探测时,靠端口不可达判断探测包已到达目标主机
  • 排查 PMTU 黑洞:代码 4 表示「需要分片但 DF 置位」,是路径 MTU 发现的关键信号
  • 判断防火墙行为:回送 ICMP 回绝与静默丢弃对上层超时表现完全不同
  • 核对 NAT 与策略设备是否改写了差错消息

抓取与观察

抓取与观察
tcpdump -nn -v 'icmp[0] == 3' -c 10                     # 抓目的不可达
tcpdump -nn -v 'icmp[0] == 3 and icmp[1] == 4' -c 5    # 只看需要分片(PMTUD)
traceroute 8.8.8.8 | tail -5                           # 终点常见端口不可达
ping -M do -s 1472 target                              # 触发分片需要的提示

代码逐值读法

代码含义典型成因
0网络不可达路由器无匹配路由或路由被撤销
1主机不可达目标不在线,或 ARP 解析失败
2协议不可达目标主机未实现该协议
3端口不可达UDP 打到未监听端口(TCP 用 RST 表示)
4需要分片但 DF 置位报文超过路径 MTU,PMTUD 的核心信号
6/7目标网络/主机未知路由信息缺失或网络被隔离
9/10网络/主机被管理禁止被策略明确拒绝,常见于 ACL
13通信被管理过滤防火墙按策略过滤,含端口维度
UDP 探测收到「端口不可达」说明包已经到达目标主机并被其协议栈处理,这正是 traceroute 判定终点的依据:最后一跳不再是超时,而是不可达消息。
边界防火墙回送 ICMP 差错会泄露内部策略细节(哪些网段存在、哪些端口被拒),对外通常选择静默丢弃,内网则可保留回绝以便快速排障。

易错点

  • 把 ICMP 差错当成唯一依据:路径上大量设备限制 ICMP 生成速率,丢一条差错消息不代表网络真的不通
  • 忽略代码只看类型,把「需要分片」误当成「网络不可达」,会往错误方向排查 MTU 问题
  • 对互联网边界一刀切丢弃全部 ICMP:PMTUD 失效后大包会被静默黑洞,表现为小包正常传输大文件卡住
  • 以为差错消息里能看到完整原始报文:它只带前 8 字节,应用层信息不足时需结合抓包位置判断

数据来源与参考

  • RFC 792
  • RFC 1812 §4.3.2

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌