IPv6 编址
IPv6 和 IPv4 最明显的区别就是地址大小。IPv6 的地址长度是 128 位,是 IPv4 地址长度的四倍。一个 32 位地址空间允许 232 即 4,294,967,296 个可能的地址。一个 128 位地址空间允许 2128 即 340,282,366,920,938,463,463,374,607,431,768,211,456(或 3.4x1038)个可能的地址。
IPv4 地址空间是二十世纪七十年代末设计的,当时几乎没有人(如果有的话,也只是极少数)会想到那些地址会用完。但是,由于基于 Internet 地址类别的网络 ID 的原始分配和近来 Internet 中主机的迅速增长,IPv4 地址空间就要耗尽了;到 1992 年,情况已经非常明朗,实施替代方案已经是势在必行。
对于 IPv6 来说,我们甚至更难想像到 IPv6 地址空间有一天也会用完。用一种更形象的说法,即一个 128 位的地址空间为地球表面每平方米面积提供了 655,570,793,348,866,943,898,599 (6.5x1023) 个地址。当然,人们决定将 IPv6 地址设置为 128 位的长度,并不是因为地球表面每平方米可能会有 655,570,793,348,866,943,898,599 (6.5x1023) 个地址。之所以设计如此大的 IPv6 地址空间,是为了进行高效的地址分配和路由来反映现代 Internet 拓扑,也是为了满足较新的网络技术使用的 64 位媒体访问控制 (MAC) 地址的需要。使用 128 位的地址为分层寻址和路由的设计提供了多层结构和灵活性,而这正是基于 IPv4 的 Internet 所缺少的。
RFC 3513 描述了 IPv6 编址体系结构。
IPv6 地址语法
IPv4 地址是以点分十进制表示形式来表示的。对于 IPv6,128 位的地址是按每 16 位 1 个分界线来分隔的,每个 16 位块转换成 4 个十六进制数(基16 计数系统),相邻的 16 位块以半角冒号隔开。生成的表示形式叫做冒号十六进制表示形式。
下面是一个二进制形式的 IPv6 地址:
0011111111111110001010010000000011010000000001010000000000000000
0000001010101010000000001111111111111110001010001001110001011010
每 16 位用 1 个分界线来分割此 128 位地址:
0011111111111110 0010100100000000 1101000000000101 0000000000000000 0000001010101010 0000000011111111 1111111000101000 1001110001011010
每个 16 位块都转换成十六进制,相邻的块用半角冒号隔开。结果为:
3FFE:2900:D005:0000:02AA:00FF:FE28:9C5A
通过删除每个 16 位块内的前导零,还可以进一步简化 IPv6 表示形式。不过,每个块必须最少有一个数字。删除前导零后,此地址就变成了:
3FFE:2900:D005:0:2AA:FF:FE28:9C5A
在二进制数和十六进制数之间转换
十六进制计数系统在表示一个数时使用数字 0 至 9,字母 A、B、C、D、E 和 F,以及 16 的指数幂。表 3-4 列出了数字 0 至 15 的十进制、十六进制和二进制表示形式。
十进制 十六进制 二进制
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
表 3-4 十进制、十六进制和二进制之间的转换
要将十六进制数转换成二进制数,应将每个十六进制数字转换成对等的 4 位二进制数字。例如,要将十六进制数 0x03D8 转换成二进制,应将各个十六进制数字(0、3、D 和 8)分别转换成二进制。这样,0x03D8 就是 0000 0011 1101 1000 或 0000001111011000。
要将二进制数转换成十六进制数,应从低序位开始将二进制数分割成包含 4 位的块。然后,将每个包含 4 位的块转换成与其相等的十六进制形式。例如,要将二进制数 0110000110101110 转换成十六进制,应首先将整个数分割成 4 位一块的数字块,即 0110 0001 1010 1110。然后,将每块转换成十六进制数字,即 0x61AE。
虽然您可以使用 Windows Server 2003 或 Windows XP 中的计算器在十六进制和二进制之间进行转换,但如果您手动执行转换会帮助您更好地理解此操作。要在十进制和十六进制之间进行转换(IPv6 地址不需要经常执行此操作),请使用 Windows 计算器。
压缩零
某些类型的地址包含一长串零。要进一步简化 IPv6 地址的表示形式,您可以将以冒号十六进制格式表示的一串连续的、设置为 0 的 16 位块压缩成“::”(叫做双冒号)。
例如,您可以将单播 IPv6 地址 FE80:0:0:0:2AA:FF:FE9A:4CA2 压缩成 FE80::2AA:FF:FE9A:4CA2,可以将多播 IPv6 地址 FF02:0:0:0:0:0:0:2 压缩成 FF02::2。
您只能使用零压缩来压缩以冒号十六进制表示形式表示的一个连续的 16 位块序列。您不能对 16 位块的一部分进行零压缩。例如,您无法将 FF02:30:0:0:0:0:0:5 表示为 FF02:3::5。
要确定“::”代表多少位零,您可以计算压缩地址中的块数,用 8 减去此数,然后将结果乘以 16。例如,地址 FF02::2 有两个块(“FF02”块和“2”块),这意味着其他六个 16 位块(总共 96 位)已被压缩。
在一个给定的地址中,您只能使用一次零压缩。否则,您就无法确定每个“::”代表多少位零。如果一个地址包含同样长的两个零块序列,则应通过转换将左边的零块序列表示为“::”。
IPv6 地址前缀
您可以按照使用前缀长度表示形式表示 IPv4 地址范围的方式,将 IPv6 地址范围表示为地址前缀。例如,FF00::/8 是一个地址范围,3FFE:FFFF::/32 是一个路由前缀,3FFE:FFFF:0:2F3B::/64 是一个子网前缀。您不能使用 IPv4 子网掩码的冒号十六进制表示形式来表示一个地址前缀。
IPv6 地址类型
IPv6 有三种地址类型:
• 单播
单播地址标识单播地址类型范围中的一个接口。使用适当的单播路由拓扑,定址到单播地址的数据包将被传送到单个接口。单播地址用于从一个源到单个目标进行通信。
• 多播
多播地址标识多个接口。使用适当的多播路由拓扑,定址到多播地址的数据包将被传送到由该地址标识的所有接口。多播地址用于从一个源到多个目标进行通信,数据会传送到多个接口。
• 任意广播
任意广播地址标识多个接口。使用适当的路由拓扑,定址到任意广播地址的数据包将被传送到单个接口,即该地址标识的最近的接口。“最近的”接口是指最近的路由距离。任意广播地址用于从一个源到多个目标之一进行通信,数据将传送到单个接口。
IPv6 地址总是标识接口,而不标识节点。节点由分配给其接口之一的任意单播地址标识。
RFC 3513 没有定义任何类型的广播地址,而换用了 IPv6 多播地址。例如,IPv4 的子网和有限的广播地址被保留的 IPv6 多播地址 FF02::1 取代。 |