目录
邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议 替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使 用ICMPv6报文实现地址解析,邻居不可达性检测,重复地址检测,路由器发现,重定向以及ND代理等功能。
NDP协议中一共有五种ICMPv6报文类型,分别是RS,RA,NS,NA和Redirect报文
ICMPV6类型 | 消息名称 |
type=133 | RS(Router Soliciation 路由器请求报文) |
type=134 | RA(Router Advertisement 路由器公告报文) |
type=135 | NS(Neighbor Solicitatio 邻居请求报文) |
type=136 | NA(Neighbor Advertisement 邻居通告报文) |
type=137 | Redirect(重定向报文) |
NS和NA报文主要用于地址解析,RA和RS报文主要用于无状态地址自动配置,Redirect报文用于路由器重定向。
在IPv4中,当主机需要和目标主机通信时,必须先通过ARP协议获得目的主机的链路层地址。在IPv6中,同 样需要从IP地址解析到链路层地址的功能。邻居发现协议实现了这个功能。
ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。 NDP本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示 ICMPv6报文,由于NDP协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议, 在三层完成地址解析。与IPv4的ARP相比,IPv6地址解析技术工作在OSI参考模型的网络层,与链路层协议无 关。
主要带来以下几个好处:
地址解析过程中使用了两种ICMPv6报文:邻居请求报文NS(Neighbor Solicitation)和邻居通告报文NA (Neighbor Advertisement)。
Host A在向Host B发送报文之前它必须要解析出Host B的链路层地址,所以首先Host A会发送一个NS报文。
源IP地址为Host A的IPv6地址,目的IP地址为Host B的被请求节点组播地址,需要解析的目标IP为Host B的 IPv6地址,这就表示Host A想要知道Host B的链路层地址。源MAC地址为节点A的MAC地址,目标MAC是节点B的被请求节点组播MAC地址。同时需要指出的是,在NS报文的Options字段中还携带了Host A的链路层地址。
在IPv6组播地址中,有一种特别的组播地址,称为被请求节点组播地址(Solicited-node Address)。 被请求节点组播地址是一种具有特殊用途的地址,主要用于重复地址检测和获取邻居节点的链路层地址时,代替IPv4中使用的广播地址。
该地址是通过计算得出: 被请求节点组播地址由前缀FF02::1:FF00::/104和单播地址的最后24位组成。对于节点或路由器的接口 上配置的每个单播和任播地址,都自动启用一个对应的被请求节点组播地址。被请求节点组播地址使 用范围为链路本地。这里使用2000::1/64举例:
最终2000::1的被请求组播IP地址为FF02::1:FF00::1/104。在例如:如4037::01:800:200E:8C6C对应 于FF02::1:FF0E:8C6C。
组播IPv6报文的目的IP地址是组播IPv6地址,而目的MAC地址则必须是组播MAC地址,并且该地址必 须与组播IPv6地址对应。33-33是专门为IPv6组播预留的MAC地址前缀,MAC地址的后32bit从对应的 组播IPv6地址的后32bit拷贝而来。
所以FF02::1:FF00::1/104的组播MAC地址为33-33-FF00-0001。
当Host B接收到了NS报文之后,就会回应NA报文,其中源地址为Host B的IPv6地址,目的地址为Host A的 IPv6地址(使用NS报文中的Host A的链路层地址进行单播),Host B的链路层地址被放在Options字段中。 这样就完成了一个地址解析的过程。
值得注意的是,因为IPV6地址这样的设定就导致可能出现IPV6网络中存在多个前缀不同但是后24位相同的 IPV6地址,从而产生多个主机使用了一个组播MAC地址,导致网络混乱,所以在ICMPV6数据包中会携带 Target Address字段2000::2,指示目标主机,只有对应的主机会接收该请求,其余主机会丢弃该数据包。
以上抓包,采用以下环境完成:
实际上这个过程大家也不用想的过于复杂,只不过涉及到了一些地址的计算。
类比IPV4的PING
路由器 AR1需要构造 ICMP echo request 报文,将PC1的IP地址 填入报文的目的 IP 地址字段。但在发送该 报文前, 路由器 A 需要确认它已经掌握了以下 4 个信息:
在这 4 个信息中,路由器 A 能轻松填上其中 3 个。
我们敲的命令是 “ping PC1” ,所以路由器 A 知道报文应该填写的目的 IP 地址为 PC1的地址,同时,路由器 R1自身已知自己的源MAC地址和源IP地址。
IPV6的PING
IPv6 中的 Ping 和 IPv4 非常类似,区别在于它使用的是 ICMPv6 echo request 报文。同样的,为了让报文 能顺利发到目的地址 2001:DB8::AB:2, 路由器 A 同样需要以下 4 个信息:
和 IPv4 情形类似,我们可以很轻松地得到上面 4 个信息中的 3 个。
现在我们同样只差一项了:2000::2 对应的 MAC 地址。
那么现在轮到…额,等等。我们不能使用 IPv4 网络中的 ARP 了。为什么呢?因为 ARP 是广播,而 IPv6 压 根没有广播,那我们应该怎么做呢?
根据前面所学,我们知道了,如果一个接口上配置了 2000::2/64 这样一个全球单播地址,它会根据接口配置 的单播地址自己计算出一个对应的组播地址 FF02::1:FF00::2 并加入这个组播组。
那这个地址有什么作用呢?
类似IPV4协议,虽然R1并不知道PC1的MAC地址,但它至少知道PC1一定会侦听一个 MAC 地址:FF:FF-FFFF-FF-FF 这个广播地址。通过这个广播地址,路由器 R1就能与PC1 搭上话,询问 PC1对应的MAC 地址是多 少。事实上不止PC1会监听这个广播地址,所有位于这个广播域的设备都会监听,只不过只有PC1会回复。
而现在,尽管在 IPv6 没有广播了,但路由器 R1还是知道PC1 必然侦听的一个 MAC 地址:33-33-FF-FF-00- 02—这个MAC地址是根据2000::2的组播地址FF02::1:FF00::2计算得出。
这下子路由器R1就能和 PC1 通信了,它也就能获取到想要的单播地址对应的 MAC 地址了,这也被称为 IPv6 的邻居发现(Neighbor Discovery)
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障等。如果目的地失效,则恢复是不可能 的,通信失败;如果路径失效,则恢复是可能的。 因此节点需要维护一张邻居表,每个邻居都有相应的状 态,状态之间可以迁移。
邻居状态有5种,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、 探查(Probe)。
display ipv6 neighbors —查看IPV6邻居表
邻居状态迁移过程如下,其中Empty表示邻居表项为空,初始状态。
重复地址检测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的SolicitedNode组播组发送一个以FC00::1为请求的目标地址的NS报文进行重复地址检测,由于FC00::1并未正式指 定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法:
从抓包结果来看,第一个NS包请求的是本地链路地址,R1路由器的0/0/0口除了自己配置的地址外,还存在 一个本地链路地址,这里R1上的本地链路地址为FE80::2E0:FCFF:FEF6:41EA,本地链路地址对应的组播地址 为 FF02::1:FFF6:41EA,这个数据包用来检测本地链路地址是否重复。也就是说实际上,IPV6地址检测会检测接口配置的IPV6地址是否冲突,同时也会检测本地链路地址是否会冲突。
https://support.huawei.com/enterprise/zh/doc/EDOC1100272823#ZH-CN_TOPIC_0000001467623457
路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。
在IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过某种机制获取网络前缀信息,然后主机自己生 成地址的接口标识部分。路由器发现功能是IPv6地址自动配置功能的基础,主要通过以下两种报文实现:
IPv4使用DHCP实现自动配置,包括IP地址,缺省网关等信息,简化了网络管理。IPv6地址增长为128位,且 终端节点多,对于自动配置的要求更为迫切,除保留了DHCPV6作为有状态自动配置外,还增加了无状态自 动配置。无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址 等,并获得其他相关信息。
IPv6主机无状态自动配置过程:
1. 根据接口标识产生链路本地地址。
接口激活IPV6服务后,将根据自身的接口MAC地址,生成本地链路地址。
2. 发出邻居请求,进行重复地址检测。
3. 如地址冲突,则停止自动配置,需要手工配置。
4. 如不冲突,链路本地地址生效,节点具备本地链路通信能力。
5. 主机会发送RS报文(或接收到设备定期发送的RA报文)。
6. 根据RA报文中的前缀信息和接口标识得到IPv6地址。
同时,值得注意的是上述所有报文均使用组播进行传递,NS—邻居发现报文使用被请求链路组播地址, RS/RA使用FF02::1用于在本地链路范围的所有节点的请求。
配置命令:
- server端(R1)
-
- [Huawei]ipv6 —全局启动IPV6服务
-
- [Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6协议
-
- [Huawei-GigabitEthernet0/0/0]ipv6 address 2000::1 64—接口配置IPV6地址
-
- [Huawei-GigabitEthernet0/0/0]undo ipv6 nd ra halt —用来使能系统发布RA报文功能,重要配置 client端(R2)
-
- [Huawei]ipv6 —全局启动IPV6 [Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6服务
-
- [Huawei-GigabitEthernet0/0/0]ipv6 address auto global —接口无状态自动获取地址
当主机所在的链路中存在多个设备时,主机需要根据报文的目的地址选择转发设备。在这种情况下,设备通 过发布默认路由优先级和特定路由信息给主机,提高主机根据不同的目的地选择合适的转发设备的能力。
在RA报文中,定义了默认路由优先级和路由信息两个字段,帮助主机在发送报文时选择合适的转发设备。
主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询该列表 的路由信息,选择合适的路由发送报文。
主机收到包含默认设备优先级信息的RA报文后,会更新自己的默认路由列表。当主机向其他设备发送报文 时,如果没有路由可选,则首先查询该列表,然后选择本链路内优先级最高的设备发送报文;如果该设备故 障,主机根据优先级从高到低的顺序,依次选择其他设备。
当网关设备发现报文从其它网关设备转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备。重定向报文也承载在ICMPv6报文中,其Type字段值为137,报文中会携带更好的路径下 一跳地址和需要重定向转发的报文的目的地址等信息。
Host A需要和Host B通信,Host A的默认网关设备是Switch A,当Host A发送报文给Host B时报文会被送到 Switch A。Switch A接收到Host A发送的报文以后会发现实际上Host A直接发送给Switch B更好,它将发送 一个重定向报文给主机A,其中报文中更好的路径下一跳地址为Switch B,Destination Address为Host B。 Host A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往Host B的报文就直接发送 给Switch B。
当设备收到一个报文后,只有在如下情况下,设备会向报文发送者发送重定向报文: