浅谈 IPv6 地址设计与分配
免责声明
以下仅为个人观点,实际以 RFC 为准。
关于 IPv6 地址设计思想?
地址总长度的选择
我们都知道,传统的 IP 地址(也就是 IPv4 地址)只有 32 位,其中的公网可用部分已经在前些年完全分配完毕。
IPv6 的提出,一方面要尽可能的缓解地址短缺的问题,另一方面也要尽力的缓解路由碎片化的问题,减少广域网骨干路由表的大小。
如果回到 IPv6 设计之初,尝试从问题推导解决方案呢?
首先要考虑的问题,就是我们的整个地址长度需要多长才足够。
那么显然的,根据计算机的字长那一套习惯,我们不会选择一个64, 128 和 256 以外的数字。如果选择 256,那么未免太长,而且目前的计算机对于 256 bits 数据比较和操作的支持还是比较慢的(目前常见的计算机都是 32bits 或者 64 bits的,你用XMM指令集或专有硬件的话,成本又起来了);
那么问题变成选 64 还是 128。考虑选 64,似乎已经提供了足够的地址,我们得到了整整 640k ought to be enough for anybody?)
我们还知道,一个地址要可达,那么是需要进行路由的,而当前比较成熟的方案是前缀路由。如果选择 64 位地址,如果每个人分配一段地址,那么后缀将最大 31 位,前缀卡在了一个很奇怪的数字 33 上,正好比 32 多了 1。这样一来,32 位机器为了决定路由而要为了这多出来的一位做一次额外的操作,似乎不太经济;进一步讲,最终地址不够的时候,就又把无类域间路由那一套搬回来,而这套东西已经足够造成严重的路由碎片化了。
综上,128 是一个现阶段比较合适的选择,地址空间足够大,允许我们浪!
如何规划子网并路由
下一个问题是,我们如何路由这些地址,也就是如何划分前缀和子网。我们仍然可以沿用 IPv4 时代的几条经验:
- 层次化路由:我们有核心-汇聚-接入三层甚至更多层的路由
- 路由聚合:相邻的子网可以聚合到一个大块宣告路由,以减少上级路由表的大小
在 IPv4 时代,我们一般是根据主机数量来确定一个子网大小,然后从现有的地址块里面选择一个容易聚合的区段来分配。然后,当我们的主机数量持续增长时,我们采取的策略是额外分配另外的一块地址,然后向上级宣告一条新的(很可能是不可聚合的)路由。这就很容易造成路由的碎片化,尤其是后来无类域间路由引入以后,实际上允许我们使用任意大小的子网(理论上最小是/30,但是后来点对点链路允许去掉广播和本网地址,也就把/31也包含进来了),而这些更小的无规则的子网数量就比原来的按类分配(A类/8,B类/16,C类/24)要多得多,也就造成了严重的由碎片化。
那么不如退一步考虑,从“按主机量确定子网大小”倒退一步,谁确定主机量呢?那就是业务用途,我们如果能够为每个用途分配一个几乎不可能用完的地址,那么就可以不考虑后续因为某一业务扩增导致主机量增长而重新申请一块新地址的问题。鉴于我们有 128 位地址,按照字节边界,主要有 32|96,64|64 和 96|32 这三种选择。首先,业务量不会大于主机量,所以 96|32 应该不是一个好选择。其次,32|96 留下的前缀(或者说可规划的子网数)太少,扩展性不足。所以,选择 64|64 这种折中方案似乎能够取得一个比较好的平衡。
综上所述,这样选择其实体现了一种哲学的改变,就是从一个限制条件去推导我们解决问题的最小资源分配量,变成了根据需求直接预留超量的资源。这种做法在 IPv6 的设计上似乎是贯彻始终的(地址够多就是硬气),而且也带来了额外的好处:
- 基本子网比 MAC 地址长,可以基于 MAC 地址直接生成一个本网地址而不太需要担心冲突问题 (SLAAC 的理念)
- 一个设备可以在一个子网内拥有多个地址,可能是完全随机的、一段时间就失效的,增强隐私 (隐私扩展)
一点额外的见解?
为什么全球 IPv6 地址分配以 /32 前缀为一块?
在确定了以用途划分子网的哲学和最小子网是 /64 以后,我们转向思考的是,一个块内要预留多少用途(子网)。采取朴素的想法,IPv4 当时就是可以每个人好几个主机地址,那我们 IPv6 就做到一个块内可以容纳原来 IPv4 那么大量的子网量!然后我们的最前面的 32 位还可以做全球路由,显现出无比的扩展性!
IPv6 会是 IP 的终极版本吗?
不会,绝对性的说法基本都是错误的。IPv6 是未来很长一段时间内的主流协议,但是最终会被更先进的协议取代。这是因为:
- 它在大块地址分配的时候仍然遵守了地址块和地理位置绑定的做法,这种做法是简化的,即子网内的地址只有一个流量出口;
- 一般的服务容灾考虑都有多个上游运营商/多个地区接入,而每个地区和 ISP 拿到的地址块 (也叫 PA 地址块)前缀是不一样的,
- 这样就要解决内部地址和外部地址不一样的问题,
- 要么做多 WAN NPT(网络前缀转换),不会引入额外的公网路由,但是需要边界网关有更好的性能
- 要么就独立申请一个新的公网服务地址块(即 PI 地址块,提供商商无关的)和 AS 号,然后做 BGP 来宣告路由。
- 随着业务发展和 IPv6 的普及,PI 地址块的需求都还在那里,无论分配的 PI 地址块有多大,都会给公网路由增加额外的负担
- 随着时间推移,公网路由数量将会逐渐增多,最后的结局大概率还是超过公网路由器的承载能力。
看起来要彻底解决这种问题,还是要把 IP 地址和地理位置/提供商分割开来,但是这样的移动性管理又是个大难题;幸运的是,我们的 IPv6 看起来足够优秀,能够完成它的历史使命 😃
Fin ~