22.7.3.1. 分配地址
一个IPv4地址是一个32位值, 它通常的表示法是以 ““.”” 分成4个部分, 它的每个 “1/4” 部分表示一个字节,数值在0和255之间, 例如:
127.0.0.1
目前在理论上允许 232 或约四十亿台主机连接到Internet上. 由于分组, 目前并非所有的地址全可以使用。
IPv6地址使用128位, 也就是理论上允许 2128 台主机可以分配地址. 这允许相当大数量的机器可以被标记地址, 它可以轻松地允许目前的所有需要,甚至也能毫不费力地将今后全部的PDA和IP手机计算在内。 在描述IPv6时, 它们通常被分成8个16位组, 而它们由冒号分隔. 一个例子是:
fe80::2a0:d2ff:fea5:e9f5
这里告诉你一个特殊的规则 - 在IPv6地址里一组连续的0可以简化为一个单独的 “::” ,但这种简化只能用一次. 上面的地址等同于 fe80:0:00:000:2a0:d2ff:fea5:e9f5 - 在组内以0开头的值可以省略0, 而且在IPv6地址中只能使用一次 “::” 。
为了便于地址管理, 它们被分成两部分, 一部分位用来标识主机所在的网络, 余下的位标识主机在(子)网络上的位置. 这些位也被称为网络位和主机位, 无论是IPv4还是IPv6, 网络位全在 “左边”, 是IP地址更重要的位, 而主机位在 “右边”, 是不太重要的位, 就像 图 22.4, “IPv6地址也被分成重要一些的网络位和不太重要的主机位” 描述的那样。
图 22.4. IPv6地址也被分成重要一些的网络位和不太重要的主机位
在IPv4中, 子网掩码帮助我们确定网络范围, 它可以掩饰所有的网络/主机位. 典型的例子是255.255.0.0,它使用16位标识网络,16位标识机器, 或者255.255.255.0,它用另外的8位允许在一个B类网内标识256个子网。
当地址从有类别地址切换到CIDR路由时, 网络位和主机位之间的边界不再是8位, 而且导致子网掩码很难看而且实在不便于管理. 作为替代,一般用数字的网络位给出网络地址并表示边界,例如
10.0.0.0/24
等同于一个255.255.255.0 (24 1-bits)的子网掩码. IPv6也使用同样的方案:
2001:638:a01:2::/64
它告诉我们这里使用的地址前(最左)64位表示网络地址,而后(最右)64位用来标识在网络中的位置。网络位通常是指 (网路) “prefix”, 而这里的 “prefixlen” 是64位。
在IPv4中常见的常见的寻址方案是(旧)B类和C类网. 对于一个典型的C类网(/24), 你的供应商分配给你24位,并留下了8位供你指定. 如果你想增加子网, 你将终止于 “uneven” 的子网掩码,这需要一定的技巧来处理. 这种情况下B类(/16)网更容易些, 因为它仅有16位由供应商指派, 并允许组建子网, 也就是把最右边的那些位分成两部分。一个写现场的子网的地址, 另一个写该子网上主机的地址. 通常, 这是以字节(8位)分界。 使用一个子网掩码255.255.255.0 (或 /24 prefix),这样甚至可以灵活地管理大一些的网络. 当然每个子网有254台机器的限制,以及只能有256个子网。
因为IPv6有128位寻址, 使用的是同一个方案, 只不够区域更宽了. 提供商通常指派 /48 网络, 它留下16位给一个子网和64位的主机位。
Figure 22.5. IPv6地址和B类网地址很相似
尽管现在网络和子网的空间很充足, 但是使用64位来标识主机地址看起来像是一种浪费. 你不太可能想在你的单个子网内布置数十亿台主机, 那么它背后的理念是什么呢?
固定宽度为64位宽的主机标识符背后的理念是不用像目前IPv4网络那样手动为其指派IP地址。而是, IPv6主机的地址推荐(非强制性!)采用被称为EUI64的地址. EUI64地址是 —— 就像它的名字描述的 —— 64位宽度, 并从其底层网络接口的MAC地址衍生出来。 也就是说,例如, 六个字节(48位) MAC地址全部由16进制位 “fffe” 构成,并且其中一些被设定为全球唯一的地址(适用于以太网), 例如MAC地址
01:23:45:67:89:ab
得出的EUI64地址
03:23:45:ff:fe:67:89:ab
这又给出了IPv6地址的主机位
::0323:45ff:fe67:89ab
这些主机位现在可以自动地被用于给计算机指派IPv6地址, 它支持IPv6主机的自动配置 —— 要得到一个完整的IPv6地址,仅需要前面(网络/子网络)的位, 并且IPv6也提供了一个自动指派这些位的解决方法。
在一个用IP交流网络中, 通常有一个路由器充当网关负责对外的网络服务. 在IPv6领域, 这台路由器将发送 “路由器广告” 信息, 无论是客户端操作中接收还是在系统启动时需要获得的. 路由器的广告的信息包含了路由器的地址数据, 以及其前缀路由的地址. 通过这个信息和主机产生的EUI64地址, 一台IPv6主机可以计算出其地址, 这样就无须手动为其指派地址. 当然在路由器上仍需要进行一些配置。
路由器的广告信息是邻居发现协议(NDP, 参 [RFC2461])的一部分, 它被用来取代IPv4的ARP协议。相对于ARP, NDP不仅检查MAC地址(邻居邀请/广告的部分)的IPv6地址, 而且还提供了一个路由器的类似服务,并且提供哦呢了前缀, 这个前缀如上个段落所述用来自动配置IPv6主机。
22.7.3.2. 多重地址
在IPv4里如果IP堆栈支持,每个网络接口甚至一台主机通常只有一个IP地址. 只有在非常少的应用中,像提供web服务器的机器里可能有一个以上的IP地址. 在IPv6里就不同了, 对每个接口来说, 并非仅有一个全球唯一的IP地址, 而是还有其它两个有趣的地址: 链接本地地址和站点本地地址。 链接本地地址有一个前缀fe80::/64, 而主机位由接口的EUI64地址构成。 这个链接本地地址仅用于联络同一网络内的主机和路由器, 这个地址在不同的子网上看不到或无法访问。 如果要访问, 只能选择使用全球地址(由提供商分配), 或者使用站点本地地址。 站点本地地址被指派为fec0::/10, 则子网和主机可以被寻址,就像提供商指派的网络一样. 唯一的不同是, 这些地址对外面的机器不可见, 因为这些地址位于不同的网络, 而且它们的 “站点本地” 地址处于不同的物理网络上(如果所有权是指派的). 就像IPv4中的10/8网络, 可以使用站点本地地址, 但并非必须. 对IPv6来说, 它通常有一个主机指派的链接本地地址和一个全球IP地址。站点本地地址在目前并不常见, 并且在需要全球唯一地址时它不能作为替代。
22.7.3.3. 多播
在IP世界里, 有三种方法可以与一台主机通讯: 单播、广播和多播. 最常用的一个是使用单播地址直接和它通讯。 在IPv4里, 单播地址是给某台主机指派了所有的地址位的 “普通” IP地址. 广播地址用来定位同一个IP子网的网络位设置为网络地址的所有主机, 还有所有的主机位设置为 “1” (这可以通过子网掩码和少许操作轻松实现)的主机. 多播地址用来联系位于同一多播组内的一些主机, 属于这个多播组的机器可能位于整个internet上的任何地方. 机器必须明确地加入多播组, 并且有特别的IPv4地址用做多播地址, 由224/8子网分配. 多播在IPv4里用的不多, 只有很少的应用程序像MBone audio 和 video broadcast 工具使用它。
在IPv6里, 单播地址的使用和IPv4一样, 没有特别之处 - 所有的网络位和主机位被指派以识别目标网络和机器. IPv6里不能使用在IPv4里的广播方式, 但多播接管了这个特性. 地址为ff::/8的网络是留给多播应用的, 并且有两个特殊的多播地址取代了IPv4的广播地址. 一个是 “所有路由器” 的多播地址, 另一个是为 “所有主机”的。 这些地址对子网来说是明确的, 例如:一个路由器连接到连个不同的子网,它可以寻址所连接的网络上任意一个子网的主机/路由器. 这里的地址是:
- ff0X::1 指所有主机,而
- ff0X::2 指所有路由器,
图 22.6. 几个接口附加到一个连接上使这个连接只有一个scope ID
“all hosts” 多播的一个用途是:在NDP的邻机请求代码中, 想与另一台机器通讯的任何机器发送一个请求到 “all hosts” 组, 被请求的机器将按预期回应。
22.7.3.4. IPv6中的名称解析
作者唠叨了这么长时间的IPv6地址, 还能挺着看到这里的读者都希望用一种合适的方式将所有这些长的 & 丑陋的IPv6地址抽象为友善的主机名,就像在IPv4中那样, 当然有这种方式了。
在IPv4中主机名到IP地址的解析一般通过三种方式实现: 使用一个简单的表 /etc/hosts, 通过使用网络信息服务(NIS,以前的YP) 或通过域名系统(DNS)。
在我写这篇文章时, 目前可用在IPv6上的 NIS/NIS+ 只在Solaris 8上提供, 两个数据库的内容和传送都是用一个 RPC 扩展。
在所有的IPv6堆栈中支持一个简单的 地址<->名称 的映射,就像 /etc/hosts 。 随着NetBSD使用了KAME, /etc/hosts 同时包含了IPv6地址和IPv4地址. 一个简单的例子: “localhost” 选项在默认的NetBSD安装中:
127.0.0.1 localhost::1 localhost对于DNS, 这不算全新的概念. IPv6的名称解析通过 AAAA 记录完成 —— 这里的AAAA顾名思义 —— 指向一个实体,它的大小是A记录的4倍. AAAA记录将主机名放在左边, 就像A记录, 而在右边有一个IP6地址, 例如
noon IN AAAA 3ffe:400:430:2:240:95ff:fe40:4385做反向解析时, IPv4使用in-addr.arpa区域, 在其下写入的字节(以十进制)用相反的顺序, 也就是说越重要的字节越在右边. 而IPv6也类似, 区别只是使用16进制数代表4位代替了10进制数, 而且resource记录也在一个不同的域下, ip6.int。
所以要给上面的主机做反向解析, 你要向 /etc/named.conf 添加一些内容,像:
zone "0.3.4.0.0.0.4.0.e.f.f.3.IP6.INT" { type master; file "db.reverse";};而在区域文件 db.reverse 中。你也要添加一些内容 (除了常用的记录,像SOA和NS):
5.8.3.4.0.4.e.f.f.f.5.9.0.4.2.0.2.0.0.0 IN PTR noon.ipv6.example.com.这里的地址是被反向的, 并且在一个16进制数后面写另一个,从最不重要的开始写(右边是最重要的), 16进制数以点分割, 就像区域文件中通常的做法。
当你位IPv6设置DNS时有件事要注意,就是要检查一下使用的DNS软件的版本。BIND 8.x 确实明白 AAAA 记录, 但它不通过IPv6提供名称解析. 你要用BIND 9.x才行. 除此之外, BIND 9.x 支持一系列的resource记录,这些记录正处于讨论阶段,还未经官方正式公布. 这里最引人注目的一个就是 A6 记录,它允许简便的修改供应商/前缀。
总而言之, 本小节讨论了IPv4与IPv6之间寻址和名称解析的技术差异. 一些细节像IP头选项, QoS 和 flows 特意没有说明,主要是不想让此文档没必要的过分复杂。