2. ICMPv6 (IPv6的ICMP)
ICMPv6被IPv6节点用来报告在处理数据包时遇到的错误, 并执行其他互联网层功能, 例如诊断 (ICMPv6 "ping")。ICMPv6是IPv6的组成部分, 基本协议 (本规范要求的所有消息和行为) 必须 (MUST) 由每个IPv6节点完全实现。
2.1. Message General Format (消息通用格式)
每个ICMPv6消息之前都有一个IPv6头部和零个或多个IPv6扩展头部。ICMPv6头部由紧邻前一个头部中的Next Header值58标识。(这与用于标识IPv4的ICMP的值不同。)
ICMPv6消息具有以下通用格式:
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Message Body +
| |
Type字段指示消息的类型。其值决定剩余数据的格式。
Code字段取决于消息类型。它用于创建额外级别的消息粒度。
Checksum字段用于检测ICMPv6消息和IPv6头部某些部分的数据损坏。
ICMPv6消息分为两类: 错误消息和信息消息。错误消息通过其消息Type字段值的高位为零来标识。因此, 错误消息的消息类型从0到127; 信息消息的消息类型从128到255。
本文档定义了以下ICMPv6消息的消息格式:
ICMPv6错误消息:
- 1 - Destination Unreachable (目的地不可达) (参见第3.1节)
- 2 - Packet Too Big (数据包过大) (参见第3.2节)
- 3 - Time Exceeded (超时) (参见第3.3节)
- 4 - Parameter Problem (参数问题) (参见第3.4节)
- 100 - Private experimentation (私有实验)
- 101 - Private experimentation (私有实验)
- 127 - Reserved for expansion of ICMPv6 error messages (为扩展ICMPv6错误消息保留)
ICMPv6信息消息:
- 128 - Echo Request (回显请求) (参见第4.1节)
- 129 - Echo Reply (回显应答) (参见第4.2节)
- 200 - Private experimentation (私有实验)
- 201 - Private experimentation (私有实验)
- 255 - Reserved for expansion of ICMPv6 informational messages (为扩展ICMPv6信息消息保留)
类型值100、101、200和201保留用于私有实验。它们不用于一般用途。预计将使用相同类型值进行多个并发实验。任何大规模和/或不受控制的使用都应获得第6节中定义的实际分配。
类型值127和255保留用于将来扩展类型值范围 (如果将来出现短缺)。其详细信息留待将来工作。一种不会对当前实现造成任何问题的可能方法是, 如果类型等于127或255, 则应使用code字段进行新分配。现有实现将按照第2.4节 (b) 中的规定忽略新分配。使用这些扩展类型值的新消息可以为其代码值分配消息体中的字段。
第3节和第4节描述了ICMPv6错误消息类型1到4和信息消息类型128和129的消息格式。
至少包含调用数据包的开头是为了允许导致ICMPv6错误消息的数据包的发起者识别发送数据包的上层协议和进程。
2.2. Message Source Address Determination (消息源地址确定)
发起ICMPv6消息的节点在计算校验和之前必须确定IPv6头部中的源地址和目的地址。如果节点有多个单播地址, 它必须 (MUST) 按如下方式选择消息的源地址:
(a) 如果消息是对发送到节点的某个单播地址的消息的响应, 则回复的源地址必须 (MUST) 是相同的地址。
(b) 如果消息是对发送到任何其他地址的消息的响应, 例如
- 组播组地址,
- 由节点实现的任播地址, 或
- 不属于节点的单播地址
则ICMPv6数据包的源地址必须 (MUST) 是属于该节点的单播地址。应该 (SHOULD) 根据用于为节点发起的任何其他数据包选择源地址的规则来选择地址, 给定数据包的目的地址。但是, 如果这会导致从ICMPv6数据包的目的地可达的地址的更多信息选择, 则可以 (MAY) 以替代方式选择它。
2.3. Message Checksum Calculation (消息校验和计算)
校验和是整个ICMPv6消息的1的补码和的16位1的补码, 从ICMPv6消息类型字段开始, 并在前面加上IPv6头部字段的"伪头部 (pseudo-header)", 如 [IPv6, Section 8.1] 中所述。伪头部中使用的Next Header值为58。(在ICMPv6校验和中包含伪头部是与IPv4的一个变化; 有关此变化的理由, 请参见 [IPv6]。)
为了计算校验和, 首先将校验和字段设置为零。
2.4. Message Processing Rules (消息处理规则)
实现在处理ICMPv6消息时必须 (MUST) 遵守以下规则 (来自 [RFC-1122]):
(a) 如果在其目的地接收到未知类型的ICMPv6错误消息, 则必须 (MUST) 将其传递给发起导致错误的数据包的上层进程 (如果可以识别) (参见第2.4节, (d))。
(b) 如果接收到未知类型的ICMPv6信息消息, 则必须 (MUST) 静默丢弃它。
(c) 每个ICMPv6错误消息 (类型 < 128) 必须 (MUST) 包含尽可能多的IPv6违规 (调用) 数据包 (导致错误的数据包), 而不使错误消息数据包超过最小IPv6 MTU [IPv6]。
(d) 在需要互联网层协议将ICMPv6错误消息传递给上层进程的情况下, 从原始数据包 (包含在ICMPv6错误消息的主体中) 中提取上层协议类型, 并用于选择适当的上层进程来处理错误。
在无法从ICMPv6消息中检索上层协议类型的情况下, ICMPv6消息在任何IPv6层处理后被静默丢弃。此类情况的一个示例是具有异常大量扩展头部的ICMPv6消息, 由于原始数据包被截断以满足最小IPv6 MTU [IPv6] 限制而没有上层协议类型。另一个示例是带有ESP扩展头部的ICMPv6消息, 由于截断或解密数据包所需状态的不可用而无法解密原始数据包。
(e) 由于接收以下内容, 绝对不能 (MUST NOT) 发起ICMPv6错误消息:
(e.1) ICMPv6错误消息。
(e.2) ICMPv6重定向消息 [IPv6-DISC]。
(e.3) 目的地为IPv6组播地址的数据包。(此规则有两个例外: (1) Packet Too Big消息 (第3.2节) 以允许路径MTU发现对IPv6组播工作, 以及 (2) Parameter Problem消息, 代码2 (第3.4节) 报告无法识别的IPv6选项 (参见 [IPv6] 的第4.2节), 该选项的Option Type最高两位设置为10)。
(e.4) 作为链路层组播发送的数据包 (e.3的例外也适用于此情况)。
(e.5) 作为链路层广播发送的数据包 (e.3的例外也适用于此情况)。
(e.6) 源地址不能唯一标识单个节点的数据包 -- 例如, IPv6未指定地址、IPv6组播地址或ICMP消息发起者已知的IPv6任播地址。
(f) 最后, 为了限制发起ICMPv6错误消息所产生的带宽和转发成本, IPv6节点必须 (MUST) 限制其发起的ICMPv6错误消息的速率。当发送错误数据包流的源未能注意由此产生的ICMPv6错误消息时, 可能会发生这种情况。
转发的ICMP消息的速率限制超出了本规范的范围。
实现速率限制功能的推荐方法是令牌桶, 将平均传输速率限制为N, 其中N可以是数据包/秒或附加链路带宽的一部分, 但允许在突发中传输多达B个错误消息, 只要不超过长期平均值。
不推荐无法应对突发流量 (例如, traceroute) 的速率限制机制; 例如, 简单的基于计时器的实现, 每T毫秒允许一个错误消息 (即使T的值很低), 是不合理的。
速率限制参数应该 (SHOULD) 是可配置的。在令牌桶实现的情况下, 最佳默认值取决于实现预期部署的位置 (例如, 高端路由器与嵌入式主机)。例如, 在小型/中型设备中, 可能的默认值可能是B=10, N=10/s。
注意: 上述 (e) 和 (f) 下的限制优先于本文档中其他任何地方关于发起ICMP错误消息的要求。
以下各节描述了上述ICMPv6消息的消息格式。