2、IPv6地址分类

IPv6地址总的来说可分为三大类:单播地址,任播地址和组播地址。

image-20220105161034872

单播地址:在单播寻址模式下,IPv6接口(host)在网段中唯一标识。 IPv6数据包包含源IP地址和目标IP地址。 主机接口配备有在该网络段中唯一的IP地址。当网络交换机或路由器接收到注定到单个主机的单播IP分组时,它发出其连接到该特定主机的输出接口之一 。

多播(组播)地址:IPv6组播模式与IPv4相同。 目的地为多个主机的数据包在特殊的多播地址上发送。 所有对该组播信息感兴趣的主机需要首先加入该组播组。 加入组的所有接口接收组播数据包并对其进行处理,而对组播数据不感兴趣的其他主机则忽略组播信息。

任播地址:IPv6引入了一种新型的寻址,称为Anycast寻址。 在此寻址模式下,多个接口(host)被分配相同的任播IP地址。 当主机希望与配备有任播IP地址的主机通信时,它发送单播消息。 在复杂的路由机制的帮助下,在路由成本方面,该单播消息被递送到最接近发送方的主机。

注:IPv6不使用广播地址,广播地址的功能由多播地址代替。

2.1、单播地址

那么、到底什么是单播地址呢?IPv6单播又可以分为:全球单播地址(可理解为公网地址—IPv6)、本地链路地址、站点本地地址、回环地址、未指定地址、内嵌IPv4地址。IPv6有三种不同类型的单播地址方案, 地址的后半部分(最后64位)始终用于接口ID。 系统的MAC地址由48位组成并以十六进制表示;MAC地址被认为是在世界范围内唯一分配的。 接口ID利用MAC地址的这种唯一性,主机可以使用IEEE的扩展唯一标识符(EUI-64)格式自动配置其接口ID。 首先,主机将其自己的MAC地址划分为两个24位的半部分。 然后16位十六进制值0xFFFE被夹在这两个MAC地址的两半之间,产生EUI-64接口ID。

img

EUI-64 ID转换为IPv6接口标识符

为了将EUI-64 ID转换为IPv6接口标识符,EUI-64 ID的最高有效的第7位被补充。 例如:

img

全球单播地址

全球单播地址也称为可聚合全球单播地址,简单的一点说就是这些单播地址是可以在公网上使用的普通IPv6地址。全球单播地址的前3bit固定是001;地址范围是:2xxx:xxxxx/3-3FFF::FFFF。当然、这里面还包含其他的一些地址;例如:2001::/16 IPV6是因特网地址;2002::/16 是6to4过渡地址;3ffe::/16用于6bone测试目的的前缀;2001::/32用于Teredo前缀(后面我们会详细讲解什么是Teredo和6To4隧道)。

image-20220105163915774

注:接口标识符:指64bit的MAC地址(未来网络适配器的MAC地址),或者是基于48bit MAC地址扩展为64bit(EUI 64)。在全球单播地址中,规定如2001:BCFF:FEA6::/48表示一个IPv6路由前缀,2001:BCFF:FEA6:6C01::/64表示一个IPv6子网前缀。

本地链路地址

固定前缀FE80::/10;当一个节点启用IPv6时自动生成,格式如下图,64位拓展由MAC地址按照EUI 64转换而来。EUI-64格式:基于MAC地址自动构造;例如:MAC地址为0012:3400:ABCD;首先把MAC地址对半分开,插入一个固定值FFFE;0012:3400:ABCD—->0012:34FF:FE00:ABCD;再把第七位翻转:0—->1,1—->0;0012:34FF:FE00:ABCD—->0212:34FF:FE00:ABCD;最后加上前缀:FE80::212:34FF:FE00:ABCD。

image-20220105163924050

如果我们如果启用了IPv6就可以获取一个本地链路地址,当然在路由器里面本地链路地址也是可以修改的。我们可以通过下面的命令进行修改:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#int ethernet 0/0
Router(config-if)#ipv6 enable 
Router(config-if)#no shutdown 
Router(config-if)#exit
Router(config)#exit
*Jan  6 19:27:54.829: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to up
*Jan  6 19:27:55.516: %SYS-5-CONFIG_I: Configured from console by console
*Jan  6 19:27:55.836: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to up
Router#sh ipv6 int brief 
Ethernet0/0            [up/up]
    FE80::A8BB:CCFF:FE00:300
Ethernet0/1            [administratively down/down]
    unassigned
Ethernet0/2            [administratively down/down]
    unassigned
Ethernet0/3            [administratively down/down]
    unassigned
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#int ethernet 0/0
Router(config-if)#ipv6 add FE80::ABCD link-local 
Router(config-if)#exit
Router(config)#exit
*Jan  6 19:28:27.242: %SYS-5-CONFIG_I: Configured from console by console
Router#show ipv6 interface brief 
Ethernet0/0            [up/up]
    FE80::ABCD
Ethernet0/1            [administratively down/down]
    unassigned
Ethernet0/2            [administratively down/down]
    unassigned
Ethernet0/3            [administratively down/down]
    unassigned
Router#

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.

# 全局开启 IPV6 路由功能
Router(config)#ipv6 unicast-routing 
Router(config)#int ethernet 0/0
# 不抑制RA报文发送(思科默认会有这个配置)
Router(config-if)#no ipv6 nd ra suppress 
Router(config-if)#

全局IPv6路由功能开启之后客户端会自动过去默认网关;当然你也可以自己去做一个ping操作、然后用抓包工具进行抓包分析IPv6的数据包格式:

image-20220105205756553

image-20220105210127562

注:WIN10也有本地链路地址、但是WIN10的本地链路地址和网卡MAC地址没有任何关系;因为WIN10默认启用了数据化接口标识。

# WIN10可以通过下面的命令修改IPv6地址信息
netsh interface ipv6 set address "4" fe80::1234
# 删除命令
netsh interface ipv6 delete address "4" fe80::1234

本地站点地址

类似于IPv4中的私有地址,仅在内部网络使用,如打印机;本地站点地址的固定前缀是FEC0::/10;对于IPv6本地站点地址的配置,必须通过DHCPv6进行地址的分配、无状态的前缀公告、或者手工的进行输入。

image-20220105200322258

唯一本地地址

ULA,唯一本地地址,概念上相当于私有IP,仅能够在本地网络使用,在IPv6 Internet上不可被路由。上面提到的站点本地地址由于起初的标准定义模糊而被弃用,而后RFC又重新定义了唯一本地地址以满足本地环境中私有IPv6地址的使用。在RFC4193中标准化了一种用来在本地通信中取代站点本地单播地址的类型。ULA拥有固定前缀FC00::/7,分为两块:FC00::/8暂未定义,FD00::/8定义如下:

image-20220105200313658

未指定地址

未指定地址的形式是:0:0:0:0:0:0:0:0/128–>::/128;表示地址未指定,或者在写默认路由时代表所有路由;该地址作为某些报文的源IP地址,比如作为重复地址检测时DAD时发送的邻居请求报文的源地址,或者DHCPv6初始化过程中客户端所发送报文的源IP。

回环地址

IPv6回环地址形式是:0:0:0:0:0:0:0:1;同IPV4中127.0.0.1地址的含义一样,表示节点自已。

内嵌IPv4

映射IPV4的IPV6地址–仅用于拥有IPV4和IPV6双协议栈节点的本地范围;其中高80bit设为0,后16bit设为1,再跟IPV4地址,0000:0000:0000:0000:0000:ffff:206.123.31.2,0000:0000:0000:0000:0000:ffff:ce7b:1f01。8组播地址(IPv6通信的核心)前缀:FFxx::/8;在IPV6中没有广播的概念,而是使用用组播来代替;因此IPv6中存在大量的组播使用。

image-20220105200302577

标志位为0000表示是永久保留的组播地址,分配给各种技术使用;标志位为0001表示是用户可使用的临时组播地址;范围段定义了组播地址的范围,其定义如下:二进制十六进制范围类型;0001 1本地接口范围;0010 2本地链路范围;0011 3本地子网范围;0100 4本地管理范围;0101 5本地站点范围类似组播的私网地址;1000 8组织机构范围;1110 E全球范围类似组播的公网地址;

下面还有一些组播指定地址:FF02::1 all nodes在本地链路范围的所有节点;FF02::2 all routers在本地链路范围的所有路由器;FF02::5 all ospf routers;FF02::9 all rip routers所有运行RIP的路由器;FF02::A all eigrp routers所有运行eigrp的路由器;FF05::2在一个站点范围内的所有路由器。

2.2、任播地址

单播和多播地址在IPv4中已经存在,任播地址是IPv6中新的成员,RFC 2723将IPv6地址结构中的的任播地址定义为一系列网络接口(通常属于不同的节点)的标识,其特点是:发往一个任播地址的分组将被转发到由该地址标识的“最近”的一个网络接口(“最近”的定义是基于路由协议中的距离度量)。任播通信是支持导向服务地址的,但是目前IPv6中它的很多定义是模糊的,并且在控制路由方面没有达成一致的协议标准,因此节点间任播通信仍然无法实现。

其实任播地址在IPv4中也有、比如下面这个DNS:114.114.114.114;前面这个DNS地址在互联网上非常多、而且不同的运营商也会有不同的地区部署这样的DNS服务器。当网内的用户去查询这个DNS的时候、并不是直接去找根DNS;而是去找一个距离最近的DNS来进行解析。

C:\Users\Administrator>tracert -d 114.114.114.114

通过最多 30 个跃点跟踪到 114.114.114.114 的路由

  1    <1 毫秒   <1 毫秒   <1 毫秒 10.10.10.254
  2    54 ms     9 ms    24 ms  100.64.0.1
  3     2 ms     1 ms     2 ms  58.51.38.181
  4     *        *        *     请求超时。
  5     *       19 ms    18 ms  202.97.102.141
  6    20 ms     *       20 ms  222.190.59.202
  7     *        *        *     请求超时。
  8    18 ms    18 ms    18 ms  114.114.114.114

跟踪完成。

注:如果我们不加-d、tracert就会试图尝试解析出中间经过的所有路由器的IP和域名;这样探测速度就很慢。

当然、我们也可以自己去做一个任播地址测试、测试环境如下:

image-20220105212026578

这里我们把loopback0的地址作为DNS的地址来进行测试,配置完成之后我们就可以分别在R1和R4上去pingloopback0地址;看看R1和R4的路径都到了哪里。配置信息如下:

# R1配置信息:
ipv6 unicast-routing
interface Ethernet0/0
 no ip address
 ipv6 address 2001:12::1/64
 ipv6 enable
ipv6 route ::/0 2001:12::2
line con 0
 logging synchronous
line aux 0
line vty 0 4
 login
 transport input none

# R2配置信息:
ipv6 unicast-routing
interface Loopback0
 no ip address
 ipv6 address 240C::6666/128 anycast
 ipv6 enable

interface Ethernet0/0
 no ip address
 ipv6 address 2001:12::2/64
 ipv6 enable

interface Ethernet0/1
 no ip address
 ipv6 address 2001:23::2/64
 ipv6 enable
ipv6 route ::/0 2001:23::3

line con 0
 logging synchronous
line aux 0
line vty 0 4
 password cisco
 login
 transport input all

# R3配置信息:
ipv6 unicast-routing
interface Loopback0
 no ip address
 ipv6 address 240C::6666/128 anycast
 ipv6 enable
interface Ethernet0/0
 no ip address
 ipv6 address 2001:23::3/64
 ipv6 enable
interface Ethernet0/1
 no ip address
 ipv6 address 2001:34::3/64
 ipv6 enable
line con 0
 logging synchronous
line aux 0
line vty 0 4
 password cisco
 login
 transport input all

# R4配置信息:
ipv6 unicast-routing
interface Ethernet0/0
 no ip address
 ipv6 address 2001:34::4/64
 ipv6 enable
ipv6 route ::/0 2001:34::3
line con 0
 logging synchronous
line aux 0
line vty 0 4
 login
 transport input none

测试效果如下:我们在R1和R4上面分别去telnet 240C::6666这个地址;从下图可以看到、R1访问的是R2路由器;而R4则访问的是R3路由器;而这就是任播地址。

image-20220105215112193

注:这里还要多说一句、任播地址只能作为目标地址、不能作为源地址。

2.3、组播地址

IPv6的组播地址通常是为IPv6的组播服务,而IPv6通信的核心大量的使用了组播,IPv6不再使用广播,这与IPv4的通信不同,然而要理解IPv6的组播,首先需要明白三个关键点:第一、任何节点都能够成为一个多播组成员也叫做组播组成员;第二、源节点可以发送数据包到多播组,第三、在一个多播组的节点都能收到发往该组播组的数据。在IPv4中如果我们想和一个目标地址通信;我们首先会知道目标IP地址是多少;但是在数据链路层会对这些数据进行封装、例如封装源MAC地址、目标MAC地址等信息。但是如果我们不知道目标的MAC地址怎么办呢?我们可以针对目标IP进行广播、这样我们就可以知道目标的MAC地址了。而在IPv6中这些都被称为:被请求节点组播地址。在IPv6中、不知道目标的MAC地址、发送的不是广播;而是组播报文。这个组播博文的格式前104位是固定的,即FF02::1:FF00:0000/104,后面的24位是单播或任播地址的低24位(换句话说就是目标地址的最后24位)。这样我们就有源地址了、但是组播地址到MAC地址的映射时怎么处理的呢?组播地址到MAC地址的映射时前16位为固定的十六进制3333,然后再加上组播地址的低32位,构成了48位MAC地址。

通俗点讲:被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。被请求节点组播地址由前缀FF02::1:FF00:0/104和单播地址的最后24位组成。

推荐文章