2.1.1 IPv6 地址结构定义
1. IPv6地址表示
IPv6地址包括 128bit,使用由冒号分隔的 16bit的十六进制数表示。16bit的十六进制数对大小写不敏感。例如,FEDC:BA98:7654:3210:FEDC:BA98:7654:3210。
另外,对于中间比特连续为0的情况,还提供了简易表示方法——把连续出现的0省略掉,用“::”代替(注意“::”只能出现一次,否则不能确定到底有多少省略的0),如下所示。
① 1080:0:0:0:8:800:200C:417A等价于 1080::8:800:200C:417A。
② FF01:0:0:0:0:0:0:101等价于FF01::101。
③ 0:0:0:0:0:0:0:1等价于::1。
④ 0:0:0:0:0:0:0:0等价于::。
2. IPv6地址前缀表示
和 IPv4类似,IPv6的子网前缀和链路关联。多个子网前缀可分配给同一链路。IPv6地址前缀表示:ipv6-address/prefix-length。其中,ipv6-address为十六进制表示的 128bit地址;prefix-length为十进制表示的地址前缀长度。
3. IPv6地址类型
RFC2373为 IPv6定义了多种地址格式,IPv6地址大致分为单播地址、泛播地址和多播地址。与IPv4相比,IPv6取消了广播地址类型,用更丰富的多播地址代替, 同时增加了泛播地址类型。
(1) IPv6单播地址
IPv6单播地址标识了一个接口,由于每个接口属于一个节点,因此每个节点的任何接口上的单播地址都可以标识这个节点。发往单播地址的报文,由此地址标识的接口接收。每个接口上至少要有一个链路本地单播地址,另外还可分配任何类型
(单播、泛播和多播)或范围的 IPv6地址。
所有格式前缀不是多播格式前缀(11111111)的 IPv6地址都是 IPv6单播格式
(泛播和IPv6单播格式相同)。IPv6单播地址和 IPv4单播地址一样可聚合。目前定义了多种IPv6单播地址格式,包括可聚合全球单播地址、NSAP地址、IPX层次地址、站点本地地址、链路本地地址和具有IPv4能力的主机地址(嵌入 IPv4地址的 IPv6地址)。广泛使用的是可聚合全球单播地址、站点本地地址和链路本地地址。
如图 2-4所示,IPv6单播地址由子网前缀和接口 ID两部分组成。子网前缀由IANA、ISP和各组织分配。接口 ID目前定义为 64bit,可以由本地链路标识生成或采用随机算法生成以保证唯一性。
图2-4 IPv6单播地址格式
(2) IPv6泛播地址
IPv6泛播地址格式和 IPv6单播地址格式相同,用来标识一组接口的地址。一般这些接口属于不同的节点。发往泛播地址的报文被送到这组接口中与其最近的接口(由使用的路由协议判断哪个是最近的)。IPv6 泛播地址的用途之一是标识属于同一提供因特网服务的组织的一组路由器。这些地址可在 IPv6路由头中作为中间转发路由器,以使报文能够通过特定的一组路由器进行转发。另一个用途就是标识特定子网的一组路由器,报文只要被其中一个路由器接收即可。其中有些泛播地址是已经定义好的,如子网路由器泛播地址。
子网路由器泛播地址中的“子网前缀”域用来标识特定链路,如图2-5所示。发送到子网路由器泛播地址的报文会被送到子网中的一个路由器。所有路由器都必须支持子网泛播地址。子网路由器泛播地址用于节点需要和远端子网上所有路由器中的一个路由器进行通信(不关心具体是哪一个)。例如,一个移动节点需要和它 的“家乡”子网上的所有移动代理中的一个路由器进行通信。
图2-5 子网路由器泛播地址格式
(3) IPv6多播地址
IPv6多播地址用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于 0到多个多播组。发往多播地址的报文被多播地址标识的所有接口接收,如图2-6所示。注意:IPv6多播中不使用跳数限制域(相当于IPv4的TTL)。
图2-6 IPv6多播地址格式
其中,11111111占用 8bit,标识此地址为多播地址;Scope用来标记此多播组的应用范围;GroupID标识多播组(可能是永久的,也可能是临时的,范围由Scope定义)。
目前 IPv6永久分配的多播地址如表 2-1所示。
表2-1 IPv6多播地址表
保留的多播地址 |
FF00:: ~ FF0F:: |
(共 16个地址) |
所有节点的多播地址 |
FF01:0:0:0:0:0:0:1 |
(节点本地) |
FF02:0:0:0:0:0:0:1 |
(链路本地) |
|
所有路由器的多播地址 |
FF01:0:0:0:0:0:0:2 |
(节点本地) |
FF02:0:0:0:0:0:0:2 |
(链路本地) |
|
FF05:0:0:0:0:0:0:2 |
(站点本地) |
|
被请求节点的多播地址 |
FF02:0:0:0:0:1:FFXX:XXXX |
|
上述地址通过被请求节点的单播或泛播地址形成:取被请求节点单播或泛播地 址的低 24bit,在前面增加前缀 FF02:0:0:0:0:1:FF00::/104构成。例如,和 IPv6地址4037::01:800:200E:8C6C对应的被请求节点的多播地址是FF02::1:FF0E:8C6C。此地址用在 IPv6邻居发现协议和邻居请求报文中,由于只有后24bit单播地址相同的节点才会接收目的地址为此地址的报文,因此减少了通信流量(和 IPv4ARP相比)。
(4) IPv6中特殊的地址
IPv6中还规定了以下几种特殊的地址。
未指定的 IPv6地址:格式 0::0。未指定的 IPv6地址不能分配给任何接口,未分配 IPv6地址的节点表示其没有 IPv6地址。例如,一个节点启动后没有 IPv6地址,发送报文时填充源地址全0表示自身没有 IP地址。未指定的 IPv6地址不能在 IPv6报文头或路由头中作为目的地址出现。
IPv6环回地址:格式 ::1。此地址与 IPv4中的 127.0.0.1类似,一般在节点发报文给自身时使用,不能分配给物理接口。IPv6环回地址不能作为源地址使用,目的地址为 IPv6环回地址的报文不能发送到源节点外,也不能被 IPv6路由器转发。
(5) IPv4与 IPv6的兼容性
在 IPv6地址框架内使用 IPv4地址主要通过以下两种技术方式来实现。
IPv4兼容的 IPv6地址:如图 2-7所示,这种地址在低32bit携带 IPv4地址,前96bit全为 0,主要用在一种自动隧道技术,目的地址为这种地址的报文会被自动IPv4隧道封装(隧道的端点为自IPv6报文中的IPv4地址),由于这种技术不能解决地址耗尽的问题,已经逐渐被废弃。
图2-7 IPv4兼容的IPv6地址格式
IPv4映射的 IPv6地址:如图 2-8所示,这种地址最前80bit全为 0,中间 16bit全为 1,最后 32bit为 IPv4地址。这种地址通过 IPv6地址表示只支持 IPv4的节点。在支持双栈的 IPv6节点上,IPv6应用发送目的报文是这种地址时,实际上发出的报文为 IPv4报文(目的地址是“IPv4映射的 IPv6地址”中的 IPv4地址)。
图2-8 IPv4映射的IPv6地址格式
(6) 节点和路由器必须支持的 IPv6地址
节点必须支持的 IPv6地址包括自身接口的链路本地地址、分配的单播地址、环回地址、所有节点的多播地址、每个分配的单播或多播地址对应的被请求节点的多播地址、此主机所属的其他多播组地址。
路由器必须支持的 IPv6地址包括节点必须支持的 IPv6地址、接口配置为路由器接口的子网路由器的泛播地址、任何其他路由器配置的泛播地址、所有路由器的多播地址、此路由器所属的其他多播组地址。