3. ICMPv6 错误消息 (ICMPv6 Error Messages)
3.1. 目标不可达消息 (Destination Unreachable Message)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| As much of invoking packet |
+ as possible without the ICMPv6 packet +
| exceeding the minimum IPv6 MTU [IPv6] |
IPv6 字段:
目标地址 (Destination Address): 从触发数据包的 Source Address 字段复制.
ICMPv6 字段:
Type: 1
Code:
- 0 - 无到目标的路由
- 1 - 与目标通信被管理策略禁止
- 2 - 超出源地址作用域
- 3 - 地址不可达
- 4 - 端口不可达
- 5 - 源地址未通过入口/出口策略
- 6 - 到目标的拒绝路由
未使用 (Unused): 对所有 code 值, 该字段均未使用. 发起者必须将其初始化为零, 接收者必须忽略它.
描述 (Description)
当路由器或发起节点中的 IPv6 层遇到由于拥塞以外的原因无法传送到目标地址的数据包时, 应当生成 Destination Unreachable 消息作为响应. (如果数据包因拥塞而被丢弃, 禁止生成 ICMPv6 消息.)
如果传送失败的原因是转发节点的路由表中缺少匹配项, 则 Code 字段设置为 0. (该错误只可能发生在路由表中没有"默认路由"的节点上.)
如果传送失败的原因是管理策略禁止 (例如"防火墙过滤器"), 则 Code 字段设置为 1.
如果传送失败的原因是目标超出源地址作用域, 则 Code 字段设置为 2. 这种情况只会在源地址作用域小于目标地址作用域时发生 (例如, 数据包具有链路本地源地址和全局作用域目标地址), 并且该数据包无法在不离开源地址作用域的情况下传送到目标.
如果传送失败的原因不能映射到任何其他 code, 则 Code 字段设置为 3. 此类情况的示例包括无法将 IPv6 目标地址解析为相应链路地址, 或某种链路特定问题.
发送 code 3 的 Destination Unreachable 消息的一个具体场景是: 路由器从点到点链路收到一个数据包, 其目标地址位于分配给同一链路的子网内 (且不是接收路由器自己的地址之一). 在这种情况下, 禁止将该数据包转发回到达链路.
如果传输协议 (例如 UDP) 对某个数据包没有监听者, 且该传输协议没有其他方式通知发送者, 目标节点应当发起 Code 4 的 Destination Unreachable 消息作为响应.
如果传送失败的原因是具有该源地址的数据包由于入口或出口过滤策略而不被允许, 则 Code 字段设置为 5.
如果传送失败的原因是到目标的路由是一条拒绝路由, 则 Code 字段设置为 6. 如果路由器已配置为拒绝某个特定前缀的所有流量, 就可能发生这种情况.
Code 5 和 6 是 code 1 中信息量更大的子集.
出于安全原因, 推荐实现应当允许禁用 ICMP 目标不可达消息的发送, 最好能够按接口配置.
上层通知 (Upper Layer Notification)
接收 ICMPv6 Destination Unreachable 消息的节点, 如果能够识别相关进程, 必须通知上层进程 (见第 2.4 节 (d)).
3.2. 数据包过大消息 (Packet Too Big Message)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MTU |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| As much of invoking packet |
+ as possible without the ICMPv6 packet +
| exceeding the minimum IPv6 MTU [IPv6] |
IPv6 字段:
目标地址 (Destination Address): 从触发数据包的 Source Address 字段复制.
ICMPv6 字段:
Type: 2
Code: 发起者设置为 0 (zero), 接收者忽略.
MTU: 下一跳链路的最大传输单元 (Maximum Transmission Unit).
描述 (Description)
当路由器由于某个数据包大于出站链路 MTU 而无法转发该数据包时, 必须发送 Packet Too Big 消息作为响应. 该消息中的信息会作为路径 MTU 发现过程 [PMTU] 的一部分使用.
发起 Packet Too Big 消息构成了 ICMPv6 错误消息发起规则之一的例外. 与其他消息不同, 它会响应目标地址为 IPv6 组播地址的数据包, 或链路层组播或链路层广播地址的数据包而发送.
上层通知 (Upper Layer Notification)
传入的 Packet Too Big 消息, 如果能够识别相关进程, 必须传递给上层进程 (见第 2.4 节 (d)).
3.3. 时间超限消息 (Time Exceeded Message)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| As much of invoking packet |
+ as possible without the ICMPv6 packet +
| exceeding the minimum IPv6 MTU [IPv6] |
IPv6 字段:
目标地址 (Destination Address): 从触发数据包的 Source Address 字段复制.
ICMPv6 字段:
Type: 3
Code:
- 0 - 传输过程中跳数限制超限
- 1 - 分片重组时间超限
未使用 (Unused): 对所有 code 值, 该字段均未使用. 发起者必须将其初始化为零, 接收者必须忽略它.
描述 (Description)
如果路由器收到 Hop Limit 为零的数据包, 或者路由器将某个数据包的 Hop Limit 递减到零, 则必须丢弃该数据包, 并向该数据包的源发起 Code 0 的 ICMPv6 Time Exceeded 消息. 这表示可能存在路由环路, 或初始 Hop Limit 值过小.
Code 1 的 ICMPv6 Time Exceeded 消息用于报告分片重组超时, 如 [IPv6, Section 4.5] 所规定.
上层通知 (Upper Layer Notification)
传入的 Time Exceeded 消息, 如果能够识别相关进程, 必须传递给上层进程 (见第 2.4 节 (d)).
3.4. 参数问题消息 (Parameter Problem Message)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| As much of invoking packet |
+ as possible without the ICMPv6 packet +
| exceeding the minimum IPv6 MTU [IPv6] |
IPv6 字段:
目标地址 (Destination Address): 从触发数据包的 Source Address 字段复制.
ICMPv6 字段:
Type: 4
Code:
- 0 - 遇到错误的头部字段
- 1 - 遇到无法识别的 Next Header 类型
- 2 - 遇到无法识别的 IPv6 选项
指针 (Pointer): 标识触发数据包中检测到错误的八位字节偏移量. 如果出错字段位于 ICMPv6 错误消息最大大小所能容纳的范围之外, 指针会指向 ICMPv6 数据包末尾之后的位置.
描述 (Description)
如果 IPv6 节点在处理数据包时发现 IPv6 头部或扩展头部中的某个字段存在问题, 以至于无法完成该数据包的处理, 则它必须丢弃该数据包, 并应当向数据包源发起 ICMPv6 Parameter Problem 消息, 指示问题的类型和位置.
Code 1 和 2 是 Code 0 中信息量更大的子集.
Pointer 标识原始数据包头部中检测到错误的八位字节. 例如, 如果某个 ICMPv6 消息的 Type 字段为 4, Code 字段为 1, Pointer 字段为 40, 则表示原始数据包的 IPv6 头部之后的 IPv6 扩展头部包含无法识别的 Next Header 字段值.
上层通知 (Upper Layer Notification)
接收该 ICMPv6 消息的节点, 如果能够识别相关进程, 必须通知上层进程 (见第 2.4 节 (d)).