互联网控制消息协议第六版

互联网控制消息协议第六版（或，缩写：ICMPv6）是互联网控制消息协议（）在IPv6协议下的新版本。它在 RFC 4443 中被定义，其协议号（IPv6的Next Header域）为58。

ICMPv6协议定义在OSI模型中的网络层（），用于报告IPv6节点数据包处理过程中的错误消息和完成一些网络诊断功能（如ping和traceroute等）。它是IPv6体系总体的的一个组成部分，其基本的协议必须被所有IPv6实现和IPv6节点所完整支持。

除了ICMPv4原有的功能，ICMPv6还承担了IPv4其他协议所实现的功能或IPv6所需的新功能，例如邻居发现协议（同时取代了ARP/RARP，SEND作为其安全扩展）、多播管理（取代了IGMP）。

数据包格式 
IANA（因特网地址授权委员会）定义ICMPv6的协议号为58。

其消息分为两类，错误消息和信息消息。ICMPv6通过IPv6数据包传送，并且IPv6的扩展头需要被设置。

下文描述了ICMPv6使用的控制消息集的格式。

格式 
ICMPv6包有类型（Type），代码（Code），校验和（Checksum）和消息体（Message Body）等几个字段。类型域为8位，用来表示消息的类型，如果最高有效位是0（即值的范围是0-127），则表示一个错误消息；如果是1，则该ICMPv6包是一个信息消息。代码域同样为8位，其内容取决于消息类型，用来区分某一类型的多条消息。校验和用来检测ICMP消息和IPv6包的错误。消息体的内容取决于消息类型。

消息类型

消息的校验和 
ICMPv6 包的校验和是一个 16 位的二进制补码，计算消息类型域开始的整个 ICMPv6 消息以及 IPv6 头的伪头标（pseudo-header）。计算校验和时，校验和預设为 0。伪头标中的下一个头标（Next Header）值为 58。（注意：ICMPv6 校验和中的伪头标的内容与 IPv4 中不同，见 IPv6）。

ICMPv6消息传送 
ICMPv6通过IPv6数据包传送，当节点发送或转发ICMPv6消息时，必须确定消息的IPv6源地址和目的地址。当节点有多个单播地址，则要注意源地址的选择。

消息源地址的确定 
如果节点有多个单播地址，则通过下面的规则确定源地址。
如果消息是对发送到其中一个单播（unicast）地址消息的回应，则使用该地址作为源地址。
如果消息是对发送到其他地址消息的回应，如：
多播（multcast）组地址
该节点实现的任播（anycast）地址
其他节点的单播地址
则源地址必须为该节点所属的一个多播地址，且源地址的选择应该与从该节点发出并到达同一目的地址的其他数据包使用相同的规则，即与其他IPv6协议的数据包使用相同的路由表。如果有多个路由可以到达ICMPv6包的目的地址，则可以任选其一。

传送和处理规则 
当 ICMPv6节点收到数据包时，它应按照消息的类型采取动作。

 未知的ICMPv6错误消息交由上层协议处理。
 未知的ICMPv6消息信息丢弃。
 所有的错误消息必须足够长但不超过IPv6最小的MTU。
 禁止回应以下的消息或数据包：
 ICMPv6错误消息
 ICMPv6重定向消息
 发送到IPv6多播地址的数据包。（有两种例外情况。）
 发送到数据链路层广播地址的数据包。（例外情况同上）
 源地址不确定的数据包。
必须限制ICMPv6错误消息的产生速率。
为避免网络过负载，ICMPv6协议需要限制发送至同一地址的错误消息的数目。例如，如果一个节点持续转发错误的包，则ICMP会通知第一个错误包，然后根据一个固定的最小周期或者最大的网络负载，周期性提醒。禁止以ICMP错误消息回应错误消息包。

参见 
 互联网控制消息协议（ICMP）
 IPv6

参考 
 计算机世界网：ICMPv6
 RFC 4443

延伸阅读 
 IANA: ICMPv6 Parameters
 RFC 4443, ICMPv6 for IPv6 Specification（替代了 RFC 2463 和 RFC 1885）
 RFC 2894, Router Renumbering for IPv6

脚注 

网络层协议
IPv6