一、ICMPV6
1、基于ipv6的ICMPv6(Internet control message protocol for IPv6)是 IPv6 下的 Internet 控制报文协议;在 IPv6 中,ICMPv6 整合实现了 IPv4 中的 ICMP(ping命令)、ARP 以及 IGMP 的所有功能,主要包括错误报告、网络诊断(ping6命令)、邻居发现、多播实现和重定向等。
2、在IPv6包头中,NextHeader=58则表示IPv6包头后封装着一个ICMPv6消息
3、ICMPV6报文
(1)Type:表示 ICMPv6 报文的类型,当取值介于 0 到 127 之间时,表示该报文为错误报文(如目的不可达、超时等),当取值在 128 到 255 之间时,则表示该报文为信息报文。
(2)Code:表示此消息类型(Type)细分的类型,具体区分每种消息类型的错误信息,如目的不可达可能是防火墙导致的,也可能是路由错误导致的。
(3)Checksum:校验和,校验的部分包括了 IPv6 伪首部和ICMPv6报文。IPV6伪首部包含4个部分:16字节的sourse address, 16字节的destination addrss,2字节的 payload length, 1字节的next header。
注:ICMPv6消息类型中有5种是为了支持邻居发现协议而定义的。
TYPE | CODE | 消息名称 | |
133 | 0 | 路由器请求(RS) | |
134 | 0 | 路由器通告(RA) | |
135 | 0 | 邻居请求(NS) | |
136 | 0 | 邻居通告(NA) | |
137 | 0 | 重定向报文 |
二、邻居发现协议NDP
邻居发现协议NDP是通过 Internet 控制报文协议(ICMPv6)报文来承载的;在一个IPv6数据报中,如果该数据报的“下一个报头”字段的值为 58,且 ICMPv6 报文中类型字段取值范围为133-137,则此IPv6报文的数据部分含有邻居发现协议报文。NDP使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。,格式如图 3-1 所示。
1、路由请求报文(Router Solicitation Message,RS)
2、路由通告报文(Router Advertisement Message,RA)
3、邻居请求报文NS(Neighbor Solicitation Message,NS)
(1)功能
《1》邻居请求报文可以用来完成ARP的功能(地址解析)
NS 报文包含发送方的源链路层mac地址,IPV6首部中:当进行地址解析时,目的IPV6地址是一个多播地址。
《2》可以用来探测目的主机的连通性(跟踪邻居状态)
而在验证某相邻节点是否可达时,IPV6首部中:目的地址是邻居的单播地址。
《3》可以用来验证自己的地址在本地链路上是否唯一,IPV6首部中:目的地址是邻居的多播地址。
探测是否有其它的节点使用了该地址。(重复地址检测)
(2)NS报文格式
类型:135,表示该ICMPV6报文是邻居请求报文。
代码:必须置0。
目的IPV6地址:即要解析的IPV6地址。
选项:发送此消息主机的链路层地址。
注:IPV6首部里,源IPV6地址:发送 NS 报文的接口地址;目的IPV6地址:被请求节点多播地址(地址解析或重复地址检测时)或单播的 Target 地址(邻居不可达检测时)。
4、邻居通告报文NA(Neighbor Advertisement Message,NA)
类型:136,表示该ICMPV6报文是邻居通告报文。
代码:必须置0。
R:路由器(Router)标志。当 R 置 1 时,表示发送者是一个路由器。R比特用于邻居不可达检测机制,检测一个路由器是否改变为主机。
S:被请求(Solicited)标志。当 S 置 1 时,表示发送这个 NA 是用于响应一个 NS 的。 S 比特在邻居不可达检测机制中用于可达性的确认。在组播的NA(DAD)和主动发送的 NA 中,S 比特一定不能置 1。
O:重载(Override)标志。当 O 置 1 时,表示这个 NA 应该更新已存在的邻居缓存表项中的 link-layer 地址。当 O 置 0 时,只有在邻居缓存的表项中没有链路层地址时,这个 NA 才可以更新邻居缓存表项。
目的IPV6地址:对于被请求的 NA 消息,Target address 应与相应 NS 中的Target Address 相同。
选项:目标节点请求的链路层地址,响应多播的 NS 时(DAD、地址解析),必须使用该选项;响应单播的NS 时(NUD),可以使用该选项。
注:IPV6首部中,源 IPv6 地址:发送 NA 所用的接口的地址;目的 IPv6 地址:对于被请求的 NA 报文,目的地址为单播地址(使用 NS报文中的源 IPv6 地址);所响应的 NS 报文中源 IPv6 地址为未指定地址,或对于主动发送的 NA 报文,则目的地址使用所有节点组播地址(FF02::1)。
交互过程:
《1》地址解析
(1)PC A在向PC B发送报文之前它要先解析出PC B的MAC地址,所以首先PC A会发送一个NS报文,其中源IP地址为PC A的IPv6地址,目的IP地址为PC B的被请求节点组播地址(前缀F02::1:F/104,并结合请求IPv6地址中的低24位,具体细节请参阅上一期),需要解析的目标IP为PC B的IPv6地址,这就表示PC A想要知道PC B的MAC地址。同时,NS报文还携带了PC A的MAC地址。
(2)当PC B接收到了NS报文之后,就会回应NA报文,其中源地址为PC B的IPv6地址,目的地址为PC A的IPv6地址(使用NS报文中的PC A的MAC地址进行单播),同时包含PC B的MAC地址。这样就完成了一次地址解析的过程。
《2》跟踪邻居状态
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
RFC2461中定义了5种邻居状态,分别是:
邻居状态的具体迁移过程如下图所示:
下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。
《3》重复地址检测
重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的。一个IPv6单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。
IPv6重复地址检测技术和IPv4中的免费ARP类似:节点向试验地址所对应的Solicited-Node组播组发送NS报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。
重复地址检测原理如下:
Host A的IPv6地址FC00::1为新配置地址,即FC00::1为Host A的试验地址。Host A向FC00::1的Solicited-Node组播组发送一个以FC00::1为请求的目标地址的NS报文进行重复地址检测,由于FC00::1并未正式指定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法:
三、本地链路地址:link-local address
当在一个节点启用IPV6,启动时节点的每个接口自动生成一个link-local address
其前缀64位为标准指定的,其后64位按EUI-64格式来构造
注意:在本链路上,路由表中看到的下一跳都是对端的Link Local地址,不是公网IP地址
前缀:FE80::/10
范围:只能在本地链路使用,不能在子网间路由
为何需要link-local?
--在一个接口可以配置很多IPv6地址,所以学习路由就有可能出现很多下一跳。
所以出现Link Local地址唯一标识一个节点。在本地链路看到下一跳都是对端的Link Local地址。
在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。