IPv4 协议是目前广泛部署的因特网协议,在因特网发展初期,IPv4 以其协议简单、易于实现、互操作性好的优势而得到快速发展。但是众所周知目前使用的 IPv4地址长度为 32 位,2 的 32 次方大约 43 亿个 IP 地址,已无法满足互联网发展的需要,于是需要更高版本的 IP 协议更多数量的 IP 地址。IPv6 地址扩充为 128 位,能产生 2 的 128 次方个 IP 地址,其资源几乎是无穷的,号称可以为每一粒沙子分配一个地址。那么这海量的IPv6地址空间是如何进行运用的呢,本篇先详细介绍一下 IPv6 地址的格式以及它的分类。
IPv6 地址表示方法
IPv6 地址由网络前缀和接口标识两个部分组成。网络前缀有 n 位,相当于 IPv4 地址中的网络 ID;接口标识有(128-n)比特,相当于 IPv4 地址中的主机 ID。
IPv6 地址长度为 128 位,表示为”X:X:X:X:X:X:X:X”, 每个 X 代表 4 个十六进制值字符,以冒号分隔,一共被分为 8 组。为了书写方便,IPV6 地址支持地址压缩格式,压缩规则如下:
- 每段的前面的 0 可以省略。比如:FE80:0210:1100:0006:0030:A4FF:000C:0097/64 压缩后的书写格式为 FE80:210:1100:6:30:A4FF:C:97/64。
- 地址中一个或多个全 0 字段 0000 可以用双冒号“::”来代替。比如:FF02:0000:0000:0000:0000:0000:0000:0001/64 压缩后的书写格式为 FF02::1/64。
注意:在一个 IPv6 地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成 128 位时,无法确定每个“::”代表 0 的个数。
IPv6 地址分类
IPv6 地址分为单播地址、任播地址、组播地址三种类型。和 IPv4 相比,取消了广播地址类型,同时增加了任播地址类型。
1. IPv6 单播地址(Unicast)
IPv6 定义了多种单播地址,目前常用的单播地址有:
(1)全球单播地址:全球单播地址是带有全球单播前缀的 IPv6 地址,其作用类似于 IPv4 中的公网地址。其格式如下图所示:
全球单播地址由全球路由前缀(Global routing prefix)、 子网 ID(Subnet ID)和接口标识(Interface ID)组成:
- 全球路由前缀:由提供商指定给一个组织机构,通常全球路由前缀至少为 48 位。目前已经分配的全球路由前缀的前 3bit 均为 001。
- 子网 ID:组织机构可以用子网 ID 来构建本地网络(Site)。子网 ID 通常最多分配到第 64 位。子网 ID 和 IPv4 中的子网号作用相似。
- 接口标识:用来标识一个设备(Host),与 IPv4 中的主机 ID 作用相似。
举例:IPv6 地址 2001:1111:2222:ABCD::1/64,全球路由前缀为 2001:1111:2222,子网 ID 为 ABCD,接口 ID 为::1,网络前缀为 2001:1111:2222:ABCD
(2)链路本地地址:链路本地地址是 IPv6 中的应用范围受限制的地址类型, 只能在连接到同一本地链路的节点之间使用,它相当于 IPv4 里面的 169.254.0.0/16 地址。它使用了特定的本地链路前缀 FE80::/10(最高 10 位值为 1111111010),默认情况下从 11bit 到 64bit 设置为 0,而剩下的 64bit,使用接口的 MAC 地址扩展为 64 位进行填充标识。链路本地地址的格式如下图所示:
接口 MAC 地址原本是 48 位,如何将 48 位的 MAC 地址扩展为 64 位进行填充呢?
IPv6 基于 EUI-64 地址接口标识符的配置如下:
MAC 地址的前 24 位代表厂商 ID,后 24 位代表制造商分配的唯一扩展标识。MAC 地址的第七高位叫 G/L 位(Global/Local),值为 0 时表示 MAC 地址全局唯一,值为 1 时表示 MAC 地址本地唯一。在 MAC 地址向 EUI-64 格式的转换过程中,MAC 地址的前 24 位和后 24 位之间插入了 16 比特的 FFFE,并将 G/L 位的值从 0 变成了 1,这样就生成了一个 64 比特的接口 ID,且接口 ID 的值全局唯一。这样网络前缀和接口 ID 一起组成接口地址。
举例:路由器某接口启动了 IPV6 协议栈之后,只配置全球单播地址前缀,该接口的全球单播地址和链路本地地址可以根据 EUI-64 自动生成,假设该接口 MAC 地址为:707b-e83e-5007,全球单播前缀配置 2021:: /64,通过 EUI-64 生成的全球单播地址为:2021::727b:e8ff:fe3e:5007,链路本地地址为:FE80::727b:e8ff:fe3e:5007 。
(3)站点本地地址:站点本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。类似 IPv4 中的私网地址,IPv6 公网地址虽多,但是部分企业或机构不想让自己部分内网设备被外网访问(该设备也无需访问外网),此时可以使用站点本地地址组建自己的内网,站点本地地址只能用于内网,不能在公网被路由。站点本地地址是由固定 10bit 地址前缀 FEC0::/10、54bit 子网标识以及 64bit 的扩展 MAC 地址组成。其格式如下图所示:
(4)未指定地址:IPv6 中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。该地址可以表示某个接口或者节点还没有 IP 地址,可以作为某些报文的源 IP 地址。源 IP 地址是::的报文不会被路由设备转发。
(5)环回地址:IPv6 中的环回地址即 0:0:0:0:0:0:0:1/128 或者::1/128。环回与 IPv4 中的 127.0.0.1 作用相同,主要用于设备给自己发送报文。该地址通常用来作为一个虚接口的地址(如 Loopback 接口)。实际发送的数据包中不能使用环回地址作为源 IP 地址或者目的 IP 地址。
2. IPv6 组播地址(Multicast)
IPv6 的组播与 IPv4 相同,用来标识一组接口,发往组播地址的报文被组播地址标识的所有接口接收。其格式如下图所示:
一个 IPv6 组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组 ID(Global ID)4 个部分组成:
- 前缀:IPv6 组播地址的前缀是 1111 1111,即 FF00::/8。
- 标志字段:长度 4bit,目前只使用了最后一个比特(前三位必须置 0),当该位值为 0 时,表示当前的组播地址是由 IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)所分配的一个永久分配地址;当该值为 1 时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。
- 范围字段:长度 4bit,用来限制组播数据流在网络中发送的范围。
- 组播组 ID:长度 112bit,用以标识组播组,比如是全部节点,全部的路由器等等。目前,建议仅使用该 112 位的最低 32 位作为组播组 ID,将剩余的 80 位都置 0。
举例:
FF01::1 ,表示当前节点所有接口地址;
FF02::1,表示当前链路所有节点的接口地址;
FF02::2,表示当前链路所有路由器的接口地址;
FF02::5,表示当前链路所有运行 OSPFv3 协议路由器的接口地址;
FF02::9,表示当前链路所有运行 RIPng 协议路由器的接口地址;
FF05::1,表示当前站点内所有节点的接口地址。
3. IPv6 任播地址(Anycast)
单播是一对一,组播是一对多,广播是一对全体,那么任意播就是一对最近的通信方式。任播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能。目前,任播地址的使用通过共享单播地址方式来完成。将一个单播地址分配给多个节点或者主机,这样在网络中如果存在多条该地址路由,当发送者发送以任播地址为目的 IP 的数据报文时,发送者无法控制哪台设备能够收到,这取决于整个网络中路由协议计算的结果。
任播地址是 IPv6 特有的地址类型,用来标识一组网络接口。IPv6 任播地址仅可以被分配给路由设备,不能应用于主机。任播地址不能作为 IPv6 报文的源地址,仅用作目标地址,目的为任播地址的报文会被送到最近的一个被标识接口,这里所谓的“最近”是通过路由协议的开销来判断的。另外任播地址与单播地址使用相同的地址空间,因此任播与单播的表示无任何区别,配置时须明确表明是任播地址,以此区别单播和任播。例如在华为路由器接口配置指明 IPv6 任播地址命令为:ipv6 address 2002:12::1 64 anycast(最后加上 anycast 参数表示这是一个任播地址)。