ICMPv6协议

ICMPv6 是 IPv6 协议栈中最重要的基础协议之一,它不仅仅是“错误提示”那么简单,还承载了邻居发现(NDP)、组播监听(MLD)、路由器通告(RA/RS)等核心功能。


🧩 一、ICMPv6 的定位

ICMPv6(Internet Control Message Protocol for IPv6)
定义于 RFC 4443

它相当于 IPv4 的 ICMP,但功能更强大、结构更统一。
ICMPv6 负责:

  • 报告 IPv6 层的错误(比如目的不可达、包太大)
  • 发送诊断消息(如 ping)
  • 承载其他控制协议(比如 NDP、MLD、RA、RS)

✅ IPv6 运行中几乎所有“控制类”操作,都通过 ICMPv6 完成。


🧱 二、ICMPv6 报文结构

基本格式:

+----------------+----------------+----------------+-----------------+
|     Type       |     Code       |               Checksum           |
+----------------+----------------+----------------+-----------------+
|                         Message Body (Data)                        |
+--------------------------------------------------------------------+
  • Type:标识消息类型
  • Code:进一步区分消息子类型
  • Checksum:校验和(包含 IPv6 伪首部)
  • Message Body:实际内容(依类型不同)

⚠️ 三、ICMPv6 的两大类消息

1️⃣ 错误消息(Type < 128)

TypeCode含义
1多种目的地不可达(Destination Unreachable)
20分组太大(Packet Too Big)
3多种超时(Time Exceeded)
4多种参数问题(Parameter Problem)
说明:
  • “Packet Too Big” 是 IPv6 的路径 MTU 发现机制的关键。
    • 因为 IPv6 不支持中间节点分片,这条消息用于告知源主机降低包大小。
  • “Parameter Problem” 通常是 IPv6 头或扩展头出错时触发。

🧱 Type 1:Destination Unreachable

📜 RFC 4443 §3.1
当路由器或主机无法递交数据包时发送。

报文结构

Type = 1
Code = 不同的不可达原因
+-------------------------------------------------+
|  Unused (4 bytes, set to zero)                  |
+-------------------------------------------------+
|  As much of invoking packet as will fit         |
+-------------------------------------------------+

code类型

Code含义触发场景
0No route to destination没有匹配路由
1Communication with destination administratively prohibited防火墙或策略禁止
2Beyond scope of source address地址范围超出(如 link-local 发到 global)
3Address unreachable目标地址不可达(ARP/NDP 失败)
4Port unreachable目标端口无响应(常见于 UDP)
5Source address failed ingress/egress policy源地址策略被拒
6Reject route to destination路由被标记为拒绝

📦 Type 2:Packet Too Big

📜 RFC 4443 §3.2
IPv6 不允许中间节点分片,因此必须通知源主机减小包大小。

报文结构

Type = 2
Code = 0
+-------------------+
|  MTU (4 bytes)    | ← 指出下一跳链路可支持的最大 MTU
+-------------------+
|  Original Packet  | ← 原始包头部的一部分
+-------------------+

功能

  • 当路由器发现要转发的 IPv6 包超过链路 MTU,就返回该消息;
  • 源主机收到后会执行 Path MTU Discovery (PMTUD)
  • 源主机自动调整数据包大小,避免再次触发。

举例

源主机发送 1500 字节包,下一跳 MTU 1280 →
路由器返回 Type 2,MTU=1280 → 源主机改发 1280 字节包。

⏳ Type 3:Time Exceeded

📜 RFC 4443 §3.3
当 IPv6 数据包的 Hop Limit(跳数)耗尽时发送。

报文结构

Type = 3
Code = 0 or 1
+-------------------------------------------------+
|  Unused (4 bytes)                               |
+-------------------------------------------------+
|  Original Packet (header + partial payload)     |
+-------------------------------------------------+

code类型

Code含义场景
0Hop limit exceeded in transitTTL(Hop Limit)耗尽(常见)
1Fragment reassembly time exceeded分片重组超时(源节点负责分片)

典型用途

  • traceroute6 工具使用:逐跳减少 Hop Limit,收到 Type 3 Code 0 报文即可获知中间路由。

⚙️ Type 4:Parameter Problem

📜 RFC 4443 §3.4
表示 IPv6 首部或扩展头字段有错误,无法处理。

报文结构

Type = 4
Code = 指示哪类错误
+-------------------+
|  Pointer (4 bytes)| ← 指示错误字段的偏移位置
+-------------------+
|  Original Packet  |
+-------------------+

code类型

Code含义场景
0Erroneous header field encounteredIPv6 主头部字段非法
1Unrecognized Next Header type无法识别的 Next Header
2Unrecognized IPv6 option扩展头选项无法识别

举例:

  • IPv6 包中 Next Header = 255(不存在的协议号) → Code 1
  • Hop-by-Hop 选项头格式错误 → Code 2

2️⃣ 信息类消息(Type ≥ 128)

TypeCode含义
1280回显请求(Echo Request,ping 请求)
1290回显应答(Echo Reply,ping 应答)
1300Multicast Listener Query (MLDv1/MLDv2协议, 路由器询问)
1310Multicast Listener Report(MLDv1协议, 主机加入)
1320Multicast Listener Done(MLDv1协议,主机离开)
1330路由器请求(Router Solicitation, RS)
1340路由器通告(Router Advertisement, RA)
1350邻居请求(Neighbor Solicitation, NS)
1360邻居通告(Neighbor Advertisement, NA)
1370重定向(Redirect)
1430MLDv2 Listener Report(多播监听报告,主机加入离开或过滤)
🚀 从这里可以看出:
  • NDP(RS/RA/NS/NA/Redirect)其实都是 ICMPv6 的一部分;
  • MLD(多播监听)也在 ICMPv6 范围内。

🧭 四、ICMPv6 与 IPv4 对比

功能IPv4 协议IPv6 协议
控制消息ICMPICMPv6
地址解析ARPNDP(基于 ICMPv6)
路由器发现ICMP Router DiscoveryRA/RS(基于 ICMPv6)
多播管理IGMPMLD(基于 ICMPv6)
MTU 探测ICMP Fragmentation NeededICMPv6 Packet Too Big

🧠 五、ICMPv6 的作用总结

功能类别示例消息说明
错误报告目的地不可达、包太大、超时等通知上层网络问题
诊断工具Echo Request / Reply用于 ping 测试
邻居发现(NDP)RS / RA / NS / NA / Redirect地址解析与路由器发现
路径 MTU 发现Packet Too Big通知源主机调整包大小
组播管理MLD 报文控制主机加入或离开组播组

🧩 六、一个例子:ping6 流程

当你执行

ping6 fe80::1

过程:

  1. 主机先通过 NDP (ICMPv6 Type 135) 解析目标 MAC 地址
  2. 然后发送 Echo Request (Type 128)
  3. 对方回复 Echo Reply (Type 129)
  4. 若路径过大,会收到 Packet Too Big (Type 2) 报文,调整 MTU