一、内容
1.配置各网络节点接口的ip 地址:R1-R8 之间网段的网络前缀为2000:18::/64,R2-R8 之间的网络前缀为 2000:28::/64,R1 的f0/0 接口所处网段为 2000:1::/64, R2 的 f0/0 接口所处网段为 2000:2::/64。PC1 和 PC4 的ipv6 地址和 R1 处于同一网段,PC2 的地址和 R2 处于同一网段,PC3 的地址自动配置。
2.说明 ipv6 地址自动配置的过程,并抓包说明。
3.PC1 ping 通 PC4,并说明 ipv6 主机通信的地址解析过程,抓包说明。
4.PC1 ping 通 PC2,说明这两台主机间的通信过程,并抓包说明。
5.在 R8 上配置环回接口,Ipv6 地址为 8::8/64。在路由器上配置动态路由协议RIPng,连通网络。
6.关闭 R1 的端口 f1/0,PC1 ping 通 R8 的环回,说明整个通信过程,抓包作证。
7.总结链路本地地址和全球单播地址的使用场合。
8. 总结 ipv6 邻居发现协议的用途和使用场合。二、实现方法
(1) 配置各网络节点接口的 ip 地址:R1-R8 之间网段的网络前缀为2000:18::/64,R2-R8 之间的网络前缀为 2000:28::/64,R1 的 f0/0 接口所处网段为 2000:1::/64, R2 的 f0/0 接口所处网段为 2000:2::/64。PC1 和 PC4 的ipv6 地址和 R1 处于同一网段,PC2 的地址和 R2 处于同一网段,PC3 的地址自动配置。
1)R1配置
R1#conf t
Enter configuration commands, one perline. End with CNTL/Z.
R1(config)#ipv unicast-routing
R1(config)#int f1/0
R1(config-if)#ipv enable
R1(config-if)#ipv6 add 2000:18::1/64
R1(config-if)#no shut
*Mar 1 00:02:01.223: %LINK-3-UPDOWN: Interface FastEthernet1/0, changed stateto up
*Mar 1 00:02:02.223: %LINEPROTO-5-UPDOWN: Line protocol on InterfaceFastEthernet1/0, changed state to up
R1(config-if)#int f0/0
R1(config-if)#ipv enable
R1(config-if)#ipv6 add 2000:1::1/64
R1(config-if)#no shut
R1(config-if)#do write
*Mar 1 00:03:36.547: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed stateto up
*Mar 1 00:03:37.547: %LINEPROTO-5-UPDOWN: Line protocol on InterfaceFastEthernet0/0, changed state to up
R1(config-if)#do write
Building configuration...
[OK]
R1(config-if)#do show ipv int
2)R8配置
R8#conf t
Enter configuration commands, one perline. End with CNTL/Z.
R8(config)#ipv unicast-routing
R8(config)#int f1/0
R8(config-if)#ipv enable
R8(config-if)#ipv add 2000:18::8/64
R8(config-if)#no shut
R8(config-if)#ipv enable
*Mar 1 00:10:21.747: %LINK-3-UPDOWN: Interface FastEthernet1/0, changed stateto up
*Mar 1 00:10:22.747: %LINEPROTO-5-UPDOWN: Line protocol on InterfaceFastEthernet1/0, changed state to up
R8(config-if)#int f0/0
R8(config-if)#ipv enable
R8(config-if)#ipv add 2000:28::8/64
R8(config-if)#no shut
*Mar 1 00:10:46.531: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed stateto up
*Mar 1 00:10:47.531: %LINEPROTO-5-UPDOWN: Line protocol on InterfaceFastEthernet0/0, changed state to up
R8(config-if)#int loop
R8(config-if)#int loopback 1
*Mar 1 00:11:34.947: %LINEPROTO-5-UPDOWN: Line protocol on InterfaceLoopback1, changed state to up
R8(config-if)#ipv enable
R8(config-if)#ipv add 8::8/64
R8(config-if)#no shut
R8(config-if)#do write
R8(config-if)#do show ipv int
3)R2配置
R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#ipv unicast-routing
R2(config)#int f1/0
R2(config-if)#ipv enable
R2(config-if)#ipv add 2000:28::2/64
R2(config-if)#no shut
*Mar 100:17:14.839: %LINK-3-UPDOWN: Interface FastEthernet1/0, changed state to up
*Mar 100:17:15.839: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/0,changed state to up
R2(config-if)#int f0/0
R2(config-if)#ipv enable
R2(config-if)#ipv add 2000:2::2/64
R2(config-if)#no shut
*Mar 1 00:17:34.195:%LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 100:17:35.195: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0,changed state to up
R2(config-if)#do write
Building configuration...
[OK]
R2(config-if)#do show ipv int
4)PC1配置
PC1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
PC1(config)#int f0/0
PC1(config-if)#ipv enable
PC1(config-if)#ipv add 2000:1::2/64
PC1(config-if)#no shut
*Mar 100:23:45.671: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 100:23:46.671: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0,changed state to up
PC1(config-if)#do write
PC1(config-if)#do show ipv int
5)PC2配置
PC2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
PC2(config)#int f0/0
PC2(config-if)#ipv enable
PC2(config-if)#ipv add 2000:2::1/64
PC2(config-if)#no shut
*Mar 100:26:26.307: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 100:26:27.307: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0,changed state to up
PC2(config-if)#do write
Building configuration...
[OK]
PC2(config-if)#do show ipv int
6)PC4配置
PC4#conf t
Enter configuration commands, one per line. End with CNTL/Z.
PC4(config)#int f0/0
PC4(config-if)#ipv enable
PC4(config-if)#ipv add 2000:1::3/64
PC4(config-if)#no shut
*Mar 100:27:57.083: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 100:27:58.083: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0,changed state to up
PC4(config-if)#do write
Building configuration...
[OK]
PC4(config-if)#do show ipv int
7)PC3配置
PC3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
PC3(config)#int f0/0
PC3(config-if)#ipv enable
PC3(config-if)#ipv add autoconfig
PC3(config-if)#no shut
*Mar 100:33:21.263: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 100:33:22.263: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0,changed state to up
PC3(config-if)#do write
Building configuration...
[OK]
PC3(config-if)#do show ipv int
(2) 说明 ipv6 地址自动配置的过程,并抓包说明。
1、本地链路地址形成过程
1) PC3的MAC地址是cc04.22c0.0000,插入FFFE,并将G/L为取反,所以EUI64是CE04.22FF.FEC0.0。链路本地地址是11111111 10开头,再加上EUI64,即为FE80::CE04:22FF:FEC0:0。
2) PC3想使用1)得到的这个IPV6链路本地地址,所以PC3发送源IP为不确定的IP地址(::,表示PC3想用此链路本地地址,但不一定可用),目的IP为PC3IP(网络前缀为FE80)对应的请求节点多播地址(104位前缀+接口ID后24位,进行地址重复性检测)的NS报文。只有链路本地地址(单播地址)后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。若在一定时间内没人响应此NS报文,则我(PC3)可以使用这个链路本地地址,我(PC3)的链路本地地址在本地链路范围内是独一无二的;若有人响应,则不能用这个链路本地地址。
3) PC3发送源IP为PC3IP(网络前缀FE80),目的IP为组播地址FF02::1(链路范围内所有接口接收)的NA报文。所有节点都会记录下这个MAC地址(报文中有)是与这个链路本地地址对应的,以后就不用再解析MAC了。
4) PC3使用multicast listener report message组播侦听发现协议,了解自己的直连网段上是否有IPv6组播组的侦听者,并在数据库里做相应记录。
2、全球单播地址形成过程
1) 当主机终端刚接入网段时,等不及路由器周期性的RA通告,想要知道周围环境,所以终端发RS报文(目的ip:组播FF02::2,链路范围内所有路由器接收),之后路由器立刻发送RA报文。
2) 路由器R1收到终端PC3发送的RS报文(目的ip:组播FF02::2)后,路由器R1立刻发送RA报文(目的ip:组播FF02::1,链路范围内所有接口接收),通告链路中所有终端,可配置什么网络前缀。
3) 路由器R2收到终端PC3发送的RS报文(目的ip:组播FF02::2)后,路由器R2立刻发送RA报文(目的ip:组播FF02::1,链路范围内所有接口接收),通告链路中所有终端,可配置什么网络前缀。
4) PC3发送源IP为不确定的IP地址(::,表示PC3想用此全球单播地址,但不一定可用),目的IP为PC3IP(网络前缀与R1f0/0端口相同)对应的请求节点多播地址(104位前缀+接口ID后24位,进行地址重复性检测)的NS报文。只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。若在一定时间内没人响应此NS报文,则我(PC3)可以使用这个IP地址,我(PC3)自动分配的IP地址在本地链路范围内是独一无二的;若有人响应,则不能用这个自动分配的IP。
5) PC3发送源IP为不确定的IP地址(::,表示PC3想用此全球单播地址,但不一定可用),目的IP为PC3IP(网络前缀与R2f0/0端口相同)对应的请求节点多播地址(104位前缀+接口ID后24位,进行地址重复性检测)的NS报文。只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。若在一定时间内没人响应此NS报文,则我(PC3)可以使用这个IP地址,我(PC3)自动分配的IP地址在本地链路范围内是独一无二的;若有人响应,则不能用这个自动分配的IP。
6) PC3发送源IP为PC3IP(网络前缀与R1f0/0端口相同),目的IP为组播地址FF02::1(链路范围内所有接口接收)的NA报文。所有节点都会记录下这个MAC地址(报文中有)是与这个IP(全球单播地址)对应的,以后就不用再解析MAC了。
7) PC3发送源IP为PC3IP(网络前缀与R2f0/0端口相同),目的IP为组播地址FF02::1(链路范围内所有接口接收)的NA报文。所有节点都会记录下这个MAC地址(报文中有)是与这个IP(全球单播地址)对应的,以后就不用再解析MAC了。
(3) PC1ping通PC4,并说明ipv6主机通信的地址解析过程,抓包说明。
1 )PC1 ping PC4
2 )PC1和PC4第一次进行数据通信,PC1只知PC4的IP,不知PC4的MAC,需要进行地址解析。所以PC1发送源IP为PC1IP(2000:1::2),目的IP为PC4IP(2000:1::3)对应的请求节点多播地址(ff02::1:ff00:3)的NS报文。并且PC1将一条ipv6地址为2000:1::3 mac标记为不完全状态(incomplete)的条目记录到自己的邻居缓存表中,该申请报文是一个类型为icmpv6的组播报文,目的是要获取PC4的MAC地址。
3)只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。PC4对数据包进行响应(包含自己的IP和MAC),发送源IP为PC4IP(2000:1::3),目的IP为PC1IP(2000:1::1)的NA报文,表示我(PC4)就是你(PC1)要找的那个主机,我们可进行通信。并将刚刚收到那个组播报文的源ip地址和源mac地址记录到自己的邻居缓存表格中。
4 )当PC1收到PC4回复应答报文后,它会立即根据回复的目的MAC,修改对应的邻居缓存表象,此时该表象从刚才的incomplete状态,更改为Reachable状态。这时,PC1会将PC4的MAC封装为目的MAC,自己的MAC封装为源MAC,将自己的IPV6地址封装为源IP,将PC4的IPV6地址封装为目的IP,加上数据报文,发送给交换机。然后通过交换机转发给PC4。该过程就是在同一网段地址的IPV6转发过程。
5 )PC4对于PC1发送过来的ping包进行回应。PC4会将PC1的MAC封装为目的MAC,自己的MAC封装为源MAC,将自己的IPV6地址封装为源IP,将PC1的IPV6地址封装为目的IP,加上数据报文,发送给交换机。
(4) PC1ping通PC2,说明这两台主机间的通信过程,并抓包说明。
1) R1和R2路由器上配置静态路由
R1#conf t
Enter configuration commands, one perline. End with CNTL/Z.
R1(config)#ipv6 route 2000:2::/64 f0/0
R1(config)#do show ipv route
R2#conf t
Enter configuration commands, one perline. End with CNTL/Z.
R2(config)#ipv6 route 2000:1::/64 f0/0
R2(config)#do show ipv route
2)PC2ping通PC1
3)抓包
PC2的f0/0
R2的f0/0
R1的f0/0
PC1的f0/0
1) PC2的网关R2发送源IP为R2链路本地地址(网络前缀FE80),目的IP为组播地址FF02::1(链路范围内所有接口接收)的RA报文。所有节点都会记录下R2的MAC地址和网络前缀是多少,这个MAC地址(报文中有)是与这个链路本地地址对应的,以后就不用再解析MAC了。
2) PC2收到R2的RA报文后,知道R2的MAC地址,且PC2比较目标主机PC1IP,发现PC1IP与自己不在同一个网段,所以将ping包发送给网关(R2f0/0端口)。
3) R2和PC2第一次进行数据通信,R2只知PC2的IP,不知PC2的MAC,需要进行地址解析。所以R2发送源IP为R2 f0/0端口自动生成的本地链路地址,目的IP为PC2IP(2000:2::1)对应的请求节点多播地址(ff02::1:ff00:1,发送给链路中所有结点)的NS报文。
4) R2和PC1第一次进行数据通信,R2只知PC1的IP,不知PC1的MAC,需要进行地址解析。所以R2发送源IP为R2 f0/0端口自动生成的本地链路地址,目的IP为PC1IP(2000:1::2)对应的请求节点多播地址(ff02::1:ff00:2,发送给链路中所有结点)的NS报文。
5) 只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。PC1对数据包进行响应(包含自己的IP和MAC),发送源IP为PC1IP(2000:1::2),目的IP为R2 f0/0端口自动生成的本地链路地址的NA报文,表示我(PC1)就是你(R2 f0/0端口)要找的那个主机,我们可进行通信,R2发现PC1与我在同一个链路,R2直接将PC2的数据包转发给PC1。
6) 只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。PC2对数据包进行响应(包含自己的IP和MAC),发送源IP为PC2IP(2000:2::1),目的IP为R2 f0/0端口自动生成的本地链路地址的NA报文,表示我(PC2)就是你(R2 f0/0端口)要找的那个主机,我们可进行通信。
7) R2会将PC1的MAC封装为目的MAC,自己的MAC封装为源MAC,将自己的PC2地址封装为源IP,将PC1的IPV6地址封装为目的IP,加上数据报文,发送给PC1。为PC2转发ping包。
8) R2给PC2发送源IP为R2 f0/0端口自动生成的本地链路地址,目的IP为PC2IP(2000:2::1)的重定向报文(Redirect),告诉PC2,PC1的MAC地址是cc:03:12:a4:00:00。若PC2下次再给PC1发数据,则PC2可直接将数据发送给PC1。重定向包中包含PC1的MAC地址。
9) PC1对于PC2发送过来的ping包进行回应,PC1将回包交给R2。
10) R2将PC1发给PC2的回包转发给PC2。
(5) 在R8上配置环回接口,Ipv6地址为8::8/64。在路由器上配置动态路由协议RIPng,连通网络。
1)在R8上配置环回接口,Ipv6地址为8::8/64(在之前已完成)
2)在R1、R2和R8路由器上配置动态路由协议RIPng
R1(config)#int f0/0
R1(config-if)#ipv6 rip sangenable
R1(config-if)#int f1/0
R1(config-if)#ipv6 rip sangenable
R1(config-if)#do write
Building configuration...
[OK]
R8#conf t
Enter configuration commands,one per line. End with CNTL/Z.
R8(config)#int f1/0
R8(config-if)#ipv6 rip sang enable
R8(config-if)#int f0/0
R8(config-if)#ipv6 rip sangenable
R8(config-if)#int loopback 1
R8(config-if)#ipv6 rip sang enable
R8(config-if)#do write
Building configuration...
[OK]
R2(config)#int f0/0
R2(config-if)#ipv6 rip sangenable
R2(config-if)#int f1/0
R2(config-if)#ipv6 rip sangenable
R2(config-if)#do write
Building configuration...
[OK]
R1(config-if)#exit
R1(config)#ipv6 router rip sang
R1(config-rtr)#split-h
R1(config-rtr)#split-horizon//水平分割
R1(config-rtr)#po
R1(config-rtr)#poi
R1(config-rtr)#poison-reverse//毒性逆转
R1(config-rtr)#do write
Building configuration...
[OK]
R2(config-if)#exit
R2(config)#ipv6 router rip sang
R2(config-rtr)#split-horizon
R2(config-rtr)#poison-reverse
R2(config-rtr)#do write
Building configuration...
[OK]
R8(config-if)#exit
R8(config)#ipv6 router rip sang
R8(config-rtr)#split-horizon
R8(config-rtr)#poison-reverse
R8(config-rtr)#do write
Building configuration...
[OK]
R1#show ipv rou
R2#show ipv rout
R8#show ipv rout
3)连通网络
(6) 关闭R1的端口f1/0,PC1ping通R8的环回,说明整个通信过程,抓包作证。
1、关闭R1的端口f1/0
R1#conf t
Enter configuration commands,one per line. End with CNTL/Z.
R1(config)#int f1/0
R1(config-if)#shut
2、R1和R2的ipv6配置模式下重分布静态路由
R2(config)#ipv6 router rip sang
R2(config-rtr)#redistribute staticmetric 5
R1#conf t
Enter configuration commands,one per line. End with CNTL/Z.
R1(config)#ipv6 router rip sang
R1(config-rtr)#redistributestatic metric 5
R1(config-rtr)#do write
Building configuration...
[OK]
3、PC1ping通R8的环回
4、抓包(回包不走R1)
PC1的f0/0
R1的f0/0
R2的f0/0
R8的f0/0
1) PC1的网关R1发送源IP为R1链路本地地址(网络前缀FE80),目的IP为组播地址FF02::1(链路范围内所有接口接收)的RA报文。所有节点都会记录下R1的MAC地址和网络前缀是多少,这个MAC地址(报文中有)是与这个链路本地地址对应的,以后就不用再解析MAC了。
2) PC1收到R1的RA报文后,知道R1的MAC地址,且PC1比较目标主机R8环回IP,发现R8环回IP与自己不在同一个网段,所以将ping包发送给网关(R1 f0/0端口)。PC1会将R1的MAC封装为目的MAC,自己的MAC封装为源MAC,将自己的IPV6地址封装为源IP,将R8环回的IPV6地址封装为目的IP,加上数据报文,发送给R1。
3) R1和PC1第一次进行数据通信,R1只知PC1的IP,不知PC1的MAC,需要进行地址解析。所以R1发送源IP为R1 f0/0端口自动生成的本地链路地址,目的IP为PC1IP(2000:1::2)对应的请求节点多播地址(ff02::1:ff00:2,发送给链路中所有结点)的NS报文。
4) R1和R2第一次进行数据通信,R1只知R2的IP,不知R2的MAC,需要进行地址解析。所以R1发送源IP为R1 f0/0端口自动生成的本地链路地址,目的IP为R2链路本地地址对应的请求节点多播地址(ff02::1:ff5c:0,发送给链路中所有结点)的NS报文。
5) 只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。PC1对数据包进行响应(包含自己的IP和MAC),发送源IP为PC1IP(2000:1::2),目的IP为R1 f0/0端口自动生成的本地链路地址的NA报文,表示我(PC1)就是你(R1 f0/0端口)要找的那个主机,我们可进行通信。
6) 只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。R2对数据包进行响应(包含自己的IP和MAC),发送源IP为R2链路本地地址,目的IP为R1 f0/0端口自动生成的本地链路地址的NA报文,表示我(R2)就是你(R1 f0/0端口)要找的那个主机,我们可进行通信。
7) R1发现PC1要去8::8地址,R2为最优下一跳,所以R1给PC1发重定向报文(包含R2f0/0端口的MAC),重定向到最优下一跳R2f0/0,告诉PC1若你再给8::8地址发送数据,直接将数据包发送给R2的f0/0。
8) R1收到R2的NA报文后,知道R2的MAC地址,R1会将R2的MAC封装为目的MAC,自己的MAC封装为源MAC,将PC1的IPV6地址封装为源IP,将R8环回的IPV6地址封装为目的IP,加上数据报文,发送给R2。为PC1转发ping包。
9) R2和PC1第一次进行数据通信,R2只知PC1的IP,不知PC1的MAC,需要进行地址解析。所以R2发送源IP为R2 f0/0端口自动生成的本地链路地址,目的IP为PC1IP(2000:1::2)对应的请求节点多播地址(ff02::1:ff00:2,发送给链路中所有结点)的NS报文。
10) 只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。PC1对数据包进行响应(包含自己的IP和MAC),发送源IP为PC1IP(2000:1::2),目的IP为R2 f0/0端口自动生成的本地链路地址的NA报文,表示我(PC1)就是你(R2 f0/0端口)要找的那个主机,我们可进行通信。
11) R2会将R8的MAC封装为目的MAC,自己的MAC封装为源MAC,将PC1的IPV6地址封装为源IP,将R8环回的IPV6地址封装为目的IP,加上数据报文,发送给R8。为R1转发ping包。
12) R8对于R2发送过来的ping包进行回应,R8将回包交给R2。
13) R2将R8发给PC1的回包转发给PC1。R2将R8发给PC1的回包转发给PC1。
(7) 总结链路本地地址和全球单播地址的使用场合。
1、链路本地地址
当在一个节点启用IPV6,启动时节点的每个接口自动生成一个链路本地地址。其前缀64位为标准指定的,其后64位按EUI-64格式来构造。在本链路上,路由表中看到的下一跳都是对端的链路本地地址,不是公网IP地址,前缀是FE80::/10(1111 1110 10),只能在本地链路使用,不能在子网间路由。
在一个接口可以配置很多IPv6地址,所以学习路由就有可能出现很多下一跳。所以出现链路本地地址唯一标识一个节点。在网络重新编址过程中,节点和路由器的链路本地地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。
本地链路地址用于同一链路上的相邻节点之间的通信。在一个没有路由器的单链路IPv6 网络上,本地链路地址用于链路上各个主机之间的通信。本地链路地址相当于自动专用IP 寻址的IPv4 地址,就是169.254.0.0/16。本地链路地址对于邻节点的发现过程是必须的,且总是自动配置的。本地链路地址的作用域是本地链路。
邻结点发现报文源IP都是链路本地地址。
2、全球单播地址
IPv6的可聚合全球单播地址是可以在全球范围内进行路由转发的IPv6地址(亦即可以在全球范围内使用的IPv6地址);可聚合全球单播地址可以自动配置(即:支持IPv6地址的自动配置)。
可聚合全球单播地址前64位组成网络地址,后64位组成主机接口ID。
3、在同一链路中:
1) 如果通信的源IP和目的IP在同一个网段(同一网段是指不跨路由器,不是网络前缀不同),那么源地址使用链路本地地址,目的地址可能为请求节点多播地址(链路本地有效)或链路本地地址。
例如,R1给链路中所有结点发送NS包,请求PC1的MAC地址。
例如,R2给R1发的地址解析NA包(不同网络前缀,却都是链路本地地址)
2) 如果通信的源IP和目的IP不在同一个网段(跨路由器),那么源地址和目的地址都使用全球单播地址。如果是ping包,那么源地址和目的地址也都使用全球单播地址。
例如,PC1和PC2不在同一网段(网络前缀不同),互相发送ping包的时候使用的都是全球单播地址。
例如,PC1给PC4发的ping包(同一网络前缀且不跨路由器,却都是全球单播地址)。
3) 如果发送的是重定向包,那么地址的形式按照初始时的ping包的地址格式确定。
例如,R1给PC1发送重定向包,PC1的IP使用的和初始的ping包中PC1的IP地址格式相同,为全球单播地址2000:1::2。
(8) 总结ipv6邻居发现协议的用途和使用场合。
1、路由器发现:
路由器发现是指主机定位本地链路上的路由器和确定其配置信息的过程,主要包含以下3方面内容:
1) 路由器发现(Router Discovery):主机发现邻居路由器及选择某一个路由器作为默认网关的过程。例如,R1发NA报文给链路中的所有结点。
2) 前缀发现(Prefix Discovery):主机发现本地链路上的一组IPv6前缀,生成前缀列表。该列表用于主机的地址自动配置和on-link判断。例如:R1发送的RA报文中prefix information中包括前缀信息为2000::1::/64。
3) 参数发现(Parameter Discovery):主机发现相关操作参数的过程,如MTU、报文的默认跳数限制、地址分配方式等信息。例如:R1给链路中所有的结点发送的RA报文中,包括了MTU为1500等。
2、地址解析(AR):
地址解析是一种确定目的节点的链路层地址的方法。NDP中的地址解析功能不仅替代了原IPv4中的ARP,同时还用邻居不可达检测(NUD)方法来维持邻居节点之间的可达性状态信息。通过交互,建立起了到达对方的邻居缓存表项,从而可以相互通信。当一个节点的链路层地址发生改变时,将以所有节点组播地址FF02::1为目的地址发送NA报文,通知链路上的其他节点更新邻居缓存表项。
例如:R2和PC1第一次进行数据通信,R2只知PC1的IP,不知PC1的MAC,需要进行地址解析。所以R2发送源IP为R2 f0/0端口自动生成的本地链路地址,目的IP为PC1IP(2000:1::2)对应的请求节点多播地址(ff02::1:ff00:2,发送给链路中所有结点)的NS报文。
3、可达性验证(NUD)
NUD(Neighbor Unreachable Detection,邻居不可达检测)是节点确定邻居可达性的过程。邻居不可达检测机制通过邻居可达性状态机来描述邻居的可达性。邻居可达性状态机保存在邻居缓存表中,共有如下6种状态:
1) INCOMPLETE(未完成状态):表示正在解析地址,但邻居链路层地址尚未确定。
2) REACHABLE(可达状态):表示地址解析成功,该邻居可达。
3) STALE(失效状态):表示可达时间耗尽,未确定邻居是否可达。
4) DELAY(延迟状态):表示未确定邻居是否可达。DELAY状态不是一个稳定的状态,而是一个延时等待状态。
5) PROBE(探测状态):节点会向处于PROBE状态的邻居持续发送NS报文。
6) EMPTY(空闲状态):表示节点上没有相关邻接点的邻居缓存表项。
4、重复地址监测(DAD):
是节点确定即将使用的地址是否在链路上唯一的过程。所有的IPv6单播地址,包括自动配置或手动配置的单播地址,在节点使用之前必须要通过重复地址检测。DAD机制通过NS和NA报文实现。节点会发送NS报文,其源地址为未指定地址,目的地址为接口配置的IPv6地址的请求节点多播地址。在NS报文发送到链路上后,如果在规定时间内没有收到应答的NA报文,则认为这个单播地址在链路上是唯一的,可以分配给接口;反之,如果收到应答的NA报文,则表明这个地址已经被其他节点所使用,不能配置到接口。
例:PC3链路本地地址和全球单播地址自动配置时,会进行重复地址监测,下面展示的是全球单播地址形成时进行重复地址监测的过程。
1) 当主机终端刚接入网段时,等不及路由器周期性的RA通告,想要知道周围环境,所以终端发RS报文(目的ip:组播FF02::2,链路范围内所有路由器接收),之后路由器立刻发送RA报文。
2) 路由器R1收到终端PC3发送的RS报文(目的ip:组播FF02::2)后,路由器R1立刻发送RA报文(目的ip:组播FF02::1,链路范围内所有接口接收),通告链路中所有终端,可配置什么网络前缀。
3) 路由器R2收到终端PC3发送的RS报文(目的ip:组播FF02::2)后,路由器R2立刻发送RA报文(目的ip:组播FF02::1,链路范围内所有接口接收),通告链路中所有终端,可配置什么网络前缀。
4) PC3发送源IP为不确定的IP地址(::,表示PC3想用此全球单播地址,但不一定可用),目的IP为PC3IP(网络前缀与R1f0/0端口相同)对应的请求节点多播地址(104位前缀+接口ID后24位,进行地址重复性检测)的NS报文。只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。若在一定时间内没人响应此NS报文,则我(PC3)可以使用这个IP地址,我(PC3)自动分配的IP地址在本地链路范围内是独一无二的;若有人响应,则不能用这个自动分配的IP。
5) PC3发送源IP为不确定的IP地址(::,表示PC3想用此全球单播地址,但不一定可用),目的IP为PC3IP(网络前缀与R2f0/0端口相同)对应的请求节点多播地址(104位前缀+接口ID后24位,进行地址重复性检测)的NS报文。只有单播地址后24位与请求节点多播地址后24位相同的主机才会响应。节省了其他节点的效率,不打扰无关主机。若在一定时间内没人响应此NS报文,则我(PC3)可以使用这个IP地址,我(PC3)自动分配的IP地址在本地链路范围内是独一无二的;若有人响应,则不能用这个自动分配的IP。
6) PC3发送源IP为PC3IP(网络前缀与R1f0/0端口相同),目的IP为组播地址FF02::1(链路范围内所有接口接收)的NA报文。所有节点都会记录下这个MAC地址(报文中有)是与这个IP(全球单播地址)对应的,以后就不用再解析MAC了。
7) PC3发送源IP为PC3IP(网络前缀与R2f0/0端口相同),目的IP为组播地址FF02::1(链路范围内所有接口接收)的NA报文。所有节点都会记录下这个MAC地址(报文中有)是与这个IP(全球单播地址)对应的,以后就不用再解析MAC了。