相较于IPv4地址的分类情况,IPv6地址有以下3个重要变化。IPv6地址不再有网络地址和广播地址,广播被组播替代,减少了广播风暴对网络性能的影响。不再有A、B、C、D、E类地址,而是固定特定的地址段用于特殊的网络或环境。一个接口一般会有多个IPv6地址,每个地址有不同的用途。

根据RFC 4291的定义,IPv6地址分为3类:单播、任播和多播。IPv6中还有特殊的未指定地址和环回地址。

1、单播地址

单播地址用于标识一定范围内唯一的网络接口,发送给单播地址的数据包将最终发送到由该地址标识的网络接口。单播地址具有两个特点:在一定范围内唯一存在;一个地址只能配置在一个接口上。

一个单播地址包括N位网络标识符和128−N位接口标识符,且通常情况下前缀长度(即网络标识符位数)和接口标识符都是64位。单播地址又可继续分为4类:可聚合全球单播地址、链路本地单播地址、站点本地单播地址、内嵌IPv4地址的兼容地址。

1)可聚合全球单播地址

可聚合全球单播地址即可用在全球IPv6互联网中且可聚合、可路由的地址,它类似于IPv4的公网地址,在IPv6网络中可相互直接通信。当然,这样的地址也是需要向专门的地址分配机构——互联网数字分配机构(Internet Assigned Numbers Authority,IANA)去申请才能获得。虽然IPv6的地址很多,但目前可聚合的全球单播地址仅限于前3位是“001”的地址,即2000::/3,其范围为2000::~3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF。尽管可聚合全球单播地址数量众多,但IANA将来仍有可能会把其他未分配的地址段重新定义为全球单播地址。

2)链路本地单播地址

链路本地单播地址是以fe80::/64打头的地址,它在IPv6通信中是受限制的,其作用范围仅限于连接到同一本地链路的节点之间,即以路由器为界的单一链路范围内,路由器网关并不会将来自本地链路的数据转发到别的出口。也可以简单地认为链路本地地址只用来在不跨网段的局域网内通信。链路本地单播地址在局域网通信中有着重要的作用,自动配置机制、邻居发现机制等都会用到链路本地单播地址。通常情况下,链路本地单播地址都是自动配置的,即只要接口启用了IPv6协议,就会自动生成fe80::/64+64位接口ID(可为EUI-64格式,也可遵循私密性扩展,对接口ID进行随机化处理)形式的IPv6地址。该地址也可进行手动修改。

3)站点本地单播地址

站点本地单播地址是IPv6中的私网地址,它类似于RFC 1918中定义的不可路由到互联网上的私网IPv4地址。早期的站点本地单播地址的前缀是FEC0::/10,其后的54位用于子网ID,最后64位用于主机ID。后来该地址被IANA收回,并重新采用RFC 4193中定义的唯一本地地址段FC00::/7来替代站点本地单播地址。按照子网划分的原则,FC00::/7可以划分为FC00::/8和FD00::/8,其中FC00::/8为保留地址段,FD00::/8为站点本地范围内的单播地址。换言之,站点本地单播地址已由早期的FEC0::/10更换成FD00::/8了。

4)内嵌IPv4的兼容地址

在IPv6过渡技术中,经常会使用内嵌了IPv4地址的兼容地址。兼容地址一般用于在IPv4网络中建立IPv6自动隧道,从而将各个IPv6孤岛连接起来。IPv6过渡技术的工作原理是部署双协议栈节点(路由器网关或主机本身),在IPv6侧使用兼容地址,在IPv4侧提取兼容地址中的IPv4地址信息,构建IPv4报头,然后对IPv6进行封装,从而在IPv4网络中通过这种自动隧道实现IPv6孤岛的互联。常见的IPv6兼容地址有::FFFF/96+32位IPv4地址;6to4使用的兼容地址为2002(16位)+IPv4地址(32位)+子网ID(16位)+接口ID(64位);ISATAP隧道使用的兼容地址为固定前缀(64位)+0000:5EFE(32位)+IPv4地址(32位)。

2、任播地址

任播地址在地址格式上与单播地址别无二致,但用途不同。单播地址用于一个源地址到一个目的地址的通信,即一个单播地址只能用于一个接口,而任播地址是同一个地址用在网络中多个节点、多个接口之上。换句话说,任播地址用于表示一组不同节点的接口。

若某个数据包的目的地址是任播地址,该数据包将被发送到路由意义上最近的一个网络接口。为了与单播地址区分,任播地址一般约定64位接口ID全是0。这有点类似于IPv4的主机位为0的网络地址,只不过IPv4主机位全是0的网络地址和主机位全是1的广播地址是不能分配给设备使用的,而IPv6中主机位全是0的任播地址和主机位全是1的地址都能供设备使用。

注意,在使用任播地址时一定要谨慎,一定要事先约定哪些地址作为任播地址,并作为特殊用途,不然网络中就会出现地址冲突。比如,移动IPv6就需要任播地址,使客户主机不管在什么位置,都能就近访问由任播地址标识的接入点。

3、组播地址

IPv6中的组播地址用来标识多个接口,它对应于一组接口的地址,且这些接口通常分属于不同的节点。由源节点发送到组播地址的数据包会被由该地址标识的每个接口所接收。由此可见,组播地址只能用作目的地址。组播地址的前8位必须全是1。

标志位目前只定义了十六进制的0和1,其中0经常使用,表示永久;1较少使用,表示临时。IPv6不像IPv4那样使用TTL来限制范围,而是使用组播地址中的范围字段来定义和限制。目前,范围字段定义的十六进制数包括:“1”表示本地接口范围;“2”表示本地链路范围;“3”表示本地子网范围;“4”表示本地管理范围;“5”表示本地站点范围;“8”表示组织机构范围;“E”表示全球范围。其中“2”表示的本地链路范围较为常用。

在IPv6中,由于组播替代了广播,所以即便网络中没有组播应用,也常常见到一些组播地址。

4、未指定地址和本地环回地址

未指定地址就是128位全是0的地址,可以表示为“::/128”,其用途与IPv4的全0地址一样,可在接口还未自动获取到IPv6地址时,用作源地址。环回地址则是除了最后一位是1外,其余位全是0,可以表示为“::1/128”。本地环回地址跟IPv4的本地环回地址一样,用于测试网络协议是否正常。发送给本地环回地址的数据包并不会从本机网络接口发送出去,而是由本机自己响应。Windows等主机默认设有本地环回地址,可以在命令提示符下执行netsh interface ipv6 show interface查看环回地址,也可以在主机上自行ping本地环回地址。