Skip to main content

3. ICMPv6错误消息

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 - No route to destination (无到达目的地的路由)
  • 1 - Communication with destination administratively prohibited (与目的地通信被管理性禁止)
  • 2 - Beyond scope of source address (超出源地址范围)
  • 3 - Address unreachable (地址不可达)
  • 4 - Port unreachable (端口不可达)
  • 5 - Source address failed ingress/egress policy (源地址未通过入口/出口策略)
  • 6 - Reject route to destination (拒绝到达目的地的路由)

Unused (未使用): 此字段对所有代码值都未使用。发起者必须 (must) 将其初始化为零, 接收者必须忽略它。

描述

当数据包由于除拥塞之外的原因无法传递到其目的地址时, 路由器或发起节点的IPv6层应该 (SHOULD) 生成目的地不可达消息。(绝对不能 (MUST NOT) 在由于拥塞而丢弃数据包时生成ICMPv6消息。)

如果传递失败的原因是转发节点的路由表中缺少匹配条目, 则Code字段设置为0。(此错误只能在路由表中不包含"默认路由"的节点中发生。)

如果传递失败的原因是管理性禁止 (例如, "防火墙过滤器"), 则Code字段设置为1。

如果传递失败的原因是目的地超出源地址的范围, 则Code字段设置为2。只有当源地址的范围小于目的地址的范围 (例如, 当数据包具有链路本地源地址和全局范围目的地址时) 并且数据包无法在不离开源地址范围的情况下传递到目的地时, 才会出现这种情况。

如果传递失败的原因无法映射到任何其他代码, 则Code字段设置为3。此类情况的示例包括无法将IPv6目的地址解析为相应的链路地址, 或某种链路特定问题。

发送代码3的目的地不可达消息的一个特定情况是响应路由器从点对点链路接收的数据包, 该数据包的目的地址位于分配给同一链路的子网内 (接收路由器自己的地址除外)。在这种情况下, 绝对不能 (MUST NOT) 将数据包转发回到达链路。

如果传输协议 (例如, UDP) 没有侦听器, 并且该传输协议没有通知发送方的替代方法, 则目的节点应该 (SHOULD) 针对该数据包发起代码为4的目的地不可达消息。

如果传递失败的原因是由于入口或出口过滤策略不允许具有此源地址的数据包, 则Code字段设置为5。

如果传递失败的原因是到达目的地的路由是拒绝路由, 则Code字段设置为6。如果路由器已配置为拒绝特定前缀的所有流量, 则可能会发生这种情况。

代码5和6是代码1的更详细子集。

出于安全原因, 建议实现应该 (SHOULD) 允许禁用发送ICMP目的地不可达消息, 最好以每个接口为基础。

上层通知

接收ICMPv6目的地不可达消息的节点必须 (MUST) 通知上层进程 (如果可以识别相关进程) (参见第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 (零), 接收者忽略。

MTU: 下一跳链路的最大传输单元。

描述

当路由器由于数据包大于出站链路的MTU而无法转发数据包时, 必须 (MUST) 发送数据包过大消息。此消息中的信息用作路径MTU发现过程 [PMTU] 的一部分。

发起数据包过大消息是何时发起ICMPv6错误消息规则的例外。与其他消息不同, 它响应使用IPv6组播目的地址或链路层组播或链路层广播地址接收的数据包而发送。

上层通知

如果可以识别相关进程, 传入的数据包过大消息必须 (MUST) 传递给上层进程 (参见第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 - Hop limit exceeded in transit (传输中跳数限制超时)
  • 1 - Fragment reassembly time exceeded (分片重组超时)

Unused (未使用): 此字段对所有代码值都未使用。发起者必须将其初始化为零, 接收者必须忽略它。

描述

如果路由器接收到跳数限制为零的数据包, 或者路由器将数据包的跳数限制递减为零, 它必须 (MUST) 丢弃该数据包并向数据包源发起代码为0的ICMPv6超时消息。这表明存在路由循环或初始跳数限制值太小。

代码为1的ICMPv6超时消息用于报告分片重组超时, 如 [IPv6, Section 4.5] 中所述。

上层通知

如果可以识别相关进程, 传入的超时消息必须 (MUST) 传递给上层进程 (参见第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 - Erroneous header field encountered (遇到错误的头部字段)
  • 1 - Unrecognized Next Header type encountered (遇到无法识别的Next Header类型)
  • 2 - Unrecognized IPv6 option encountered (遇到无法识别的IPv6选项)

Pointer (指针): 标识调用数据包中检测到错误的八位字节偏移量。如果错误字段超出ICMPv6错误消息的最大大小所能容纳的范围, 指针将指向ICMPv6数据包末尾之外。

描述

如果IPv6节点在处理数据包时发现IPv6头部或扩展头部中的字段存在问题, 导致无法完成数据包的处理, 它必须 (MUST) 丢弃该数据包, 并应该 (SHOULD) 向数据包源发起ICMPv6参数问题消息, 指示问题的类型和位置。

代码1和2是代码0的更详细子集。

指针标识原始数据包头部中检测到错误的八位字节。例如, Type字段为4、Code字段为1、Pointer字段为40的ICMPv6消息将指示原始数据包的IPv6头部之后的IPv6扩展头部包含无法识别的Next Header字段值。

上层通知

接收此ICMPv6消息的节点必须 (MUST) 通知上层进程 (如果可以识别相关进程) (参见第2.4节, (d))。