IPv6 使用的 ICMP
IETF 制定的与IPv6配套使用的ICMP新版本,即ICMPv6
ICMPv6报文作为IPv6分组有效载荷进行传输,对应的IPv6“下一个首部字段”的值为58
ICMPv6 的报文格式和 IPv4 使用的 ICMP 的相似,即前 4 个字节的字段名称都是一样的,第 5 个字节起的后面部分作为报文主体
ICMPv6 的报文划分为两大类
差错报告报文(Error Message)
信息提供报文(Informational Message)
ICMPv6 包含 ARP 和 IGMP 的功能
地址解析协议 ARP 和网际组管理协议 IGMP 协议的功能都已被合并到 ICMPv6 中
IPv6 的地址解析
主机A需要查找B的物理地址
IPv6的地址解析与IPv4的最大不同在于使用邻居请求多播来代替ARP请求的广播
IPv6 无状态地址自动配置
IPv6一开始就设计了地址自动配置的机制
一个IPv6主机通常会自动为每个接口配置以下 IPv6 地址:
一个本地链路单播地址(必须)
一个公开全球单播地址
一个临时全球单播地址
每个单播地址对应的请求结点多播地址
所有结点多播地址
创建本地链路单播地址
在默认情况下,IPv6结点会为接口自动创建一个IPv6本地链路单播地址,并利用该地址与同一网络内的其他结点通信
本地链路单播地址由前缀FE80::/64和64位的接口标识符构成。64位的接口标识符通常由48位的局域网MAC地址映射生成(EUI-64机制)
但为了用户的隐私性,现在很多操作系统都支持随机生成接口标识符的方法,例如Windows系统,以避免攻击者通过IPv6地址获取主机的MAC地址
重复地址检测
为了保证自动创建的本地链路单播地址在本地链路上的唯一性,要利用ICMPv6的邻居请求报文进行重复地址检测(Duplicate Address Detection,DAD)
检测结点首先发送一个邻居请求报文,报文目标地址字段值为需要检测唯一性的IPv6地址,该报文IPv6首部中的目的地址为检测地址对应的请求结点多播地址
若本链路上存在另一接口使用该地址,则会用邻居通告报文对该邻居请求报文进行应答,即分配的地址发生冲突。若没有应答,则通过重复地址检测。
若结点采用 EUI-64 机制生成接口标识符,则重复地址检测失败会导致接口失效(通常不会发生)
若结点采用随机方法生成接口标识符,发现地址冲突后,会尝试生成新的地址
主机自动创建的所有单播地址都需要进行重复地址检测
创建全球单播地址
主机为创建全球单播地址,会多播发送一个ICMPv6的路由器请求报文(源地址为本地链路单播地址,目的地址为所有路由器多播地址)
路由器会单播发送路由器通告报文进行应答,该通告报文中包含所在链路的网络前缀等信息
主机根据接收到的网络前缀和自己生成的接口标识符来创建全球单播地址,并将该路由器的本地链路单播地址作为自己的默认网关地址