前言
在IPv4中,Internet控制报文协议(ICMP)向源节点报告关于向目的地传输IP数据包过程中的错误和信息。它为诊断、信息和管理目的定义了一些消息类型,如:目的不可达、数据包超长、超时、回应请求和回应应答等。在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,还有其它的一些机制需要ICMPv6消息,诸如邻居接点发现、无状态地址配置(包括重复地址检测)、路径MTU发现等等。所以IPv6中ICMPv6是一个非常重要的协议。
下面分类介绍一下ICMP报文的结构

Type:类型,分两种错误类型(0,127)和消息类型(128,255)
Code:代码,每种Type对应的Code有不同的含义
Checksum:校验和,IPv6与IPv4的检验和计算有所不同,IPv6的校验和范围是伪首部+ICMP首部+净荷,比IPv4多了一个伪首部(含目的IP,源IP,长度,协议号)
差错类报文
通常节点收到一个错误的数据报文,会根据情况向源端回送一个ICMP的差错类报文,但是如果收到的差错类ICMP报文是错误的则直接丢弃。如下几种差错类报文介绍:
目标不可达:TYPE=1

Code 0:没有到达目标的路由
Code 1:与目标的通信被管理策略禁止
Code 2:目的IP的范围超出了源IP的范围,如源IP是本地链路地址,目的IP是全球单播地址
Code 3:地址不可达
Code 4:端口不可达
Code 5:源IP被管理策略禁止
Code 6:目的路由被拒绝
注:Code 5,6是Code1的更详细的错误标识
数据超长:TYPE=2

Code :发送端填0,接收端忽略
MTU :下一跳的最大MTU值
在路径检测MTU时会使用到
传输超时:TYPE=3

Code 0:跳数超限,当路由器收到跳数限制为0或者向下一跳转发的报文跳数限制为0的报文时,丢弃该报文,并向源端发送此Code。
Code 1:分片组包超时
参数错误:TYPE=4

Code 0:报文头错误
Code 1:NextHeader无法识别
Code 2:选项无法识别
Pointer:无法识别位置偏移
信息类报文
Echo报文 TYPE=128

Identifier:标识,用于标识发送echo报文,接收应答时使用
SequenceNumber:序列号,用于校验发送和应答的个数匹配。
主要用于检测和诊断网络,如ping程序使用。
Echo 应答报文 TYPE=129
同2.1报文一致,仅Type类型不同
邻居发现应用类型
路由请求 TYPE=133
跳数限制为255

Options:如下格式(下同)

路由请求目前只支持源链路层地址,TYPE为1,length的单位为8byte,最少为1,0为非法值,须丢弃
路由通告 TYPE=134
跳数限制为255

Cur Hop Limit:IP首部中的跳数默认值
M,O:配合使用,M为1时,O无效,表示可以从DHCPv6获取动态地址及其他信息
M为0时,O为1表示,其他信息可由DHCPv6获取。
M为0是,O为0表示,无信息可从DHCPv6获取
Router lifetime:与默认路由器的关联生命周期,单位为秒,若不为0则非默认路由器
Reachable Time:单位毫秒,邻居可达有效时间
Retrans Time: 单位毫秒,邻居不可达时探测频率
Options:(仅包含如下可选选项)
1 源链路层地址
3 前缀信息,格式如下,可以重复多个前缀信息

5 MTU,格式如下

邻居请求 TYPE=135
跳数限制 255

Target Address: 请求目标IP
Options:(仅包含如下可选选项)
1 源链路层地址
邻居通告 TYPE=136
跳数限制 255

R:1表示发送者是路由器
S:1表示是对邻居请求的回应,对于组播NA或主动发送的NA则为0
O:替代标志,1表示通告中的信息替代缓存,如更新链路层地址时,对于任播的回应则不应置位
Target Address:对于邻居请求的回应,则邻居请求发起者的IP
对于主动发起的通告,则使用自己的IP
Options:(仅包含如下可选选项)
2 目的链路层地址 (邻居请求目标的链路层地址,即NA的发送者的地址)
重定向 TYPE= 137
跳数限制 255

Target Address:更好的下一跳地址
Destination Address:需要重定向转发的报文的目的地址
Options:(仅包含如下可选选项)
2 目的链路层地址 (更好下一跳路由的目的地址)
4 重定向头 + 尽可能多的须重定向的IP报文,如图






