IPv4 地址耗尽,为什么 IPv6 没有广泛将其取代?
IPv6 vs. IPv4
IPv6没有子网掩码
1111:2222:3333:4444:5555:6666:7777:8888
IPv6 不使用 NAT 技术
接下来我们继续探讨IPv6的特性:
IPv6地址具备自动配置功能
操作系统(特别是操作系统的IPv6堆栈)会生成一个64位的设备标识符,通常是随机生成的,比如5555:6666:7777:8888,这个标识符构成了你的IPv6地址INTERFACE_ID部分。
操作系统会在该INTERFACE_ID前加上fe80,这是仅限本地使用的IPv6网络前缀。因此,你现在得到的 IPv6 地址是:fe80::5555:6666:7777:8888。(请注意这里的”a::b”语法表示的是:“在’a’和’b’之间存在所有值为零的段”。关于这点我们稍后再详细介绍。) 你的设备会将一个数据包发送到本地网络上指定的邻居多播组,以确保没有其他设备使用相同的IPv6地址,这被称为重复地址检测(DAD)。而分配到重复地址的几率很小。 设备将它获取到的本地地址发送给路由器(与IPv4不同,在IPv6中,路由器始终可以通过组播地址ff02::2被访问到),并通过发送一个RS(路由请求)ICMPv6数据包来请求路由器的实际前缀。路由器收到请求后,会通过RA(路由通告)数据包回应,并用回复的实际前缀替换掉fe80,设备随后开始使用这个新的地址作为其永久地址。这就是你现在的IPv6互联网地址。
IPv6的“神话”
IPv6也有一些夸大的说法,我们一起梳理澄清下:
你设备只有一个IPv6地址,可用于在所有地方
为宇宙中每个原子分配一个IP地址
每个设备的通用连接
从我看来,在某些情况下,IPv6的表现甚至不如IPv4:
IPv6的不足之处
在IPv4环境下,我们习以为常的一些功能,当过渡到IPv6后可能会让你怀念,例如:
依赖 ISP 提供子网划分服务
IPv6地址在URI中需要额外编码
http://[aaaa:bbbb:cccc:dddd:eeee:ffff:1111:2222]/path/?query
注意地址两边的方括号。但这还不是最糟糕的部分,因为:
IPv6地址难以记忆
IPv6地址复杂
IPv6地址在表示形式上也有类似的多样性。以下是其一些特征:
IPv6地址中的零值前缀不会显示,因此2600:00ab
实际上显示为2600:ab
。
这些都是有效的IPv6地址:
:: 表示所有零,即0:0:0:0:0:0:0:0.
2600::相当于2600:0:0:0:0:0:0:0.
::ffff:1.1.1.1 等同于IPv4地址1.1.1.1 。
最终,在地址栏中输入的IPv6地址可能看起来像下面这个人为构造的例子:
https://[542b:b2ae:ed5c:cb5a:e38b:2c49:123:192.168.1.1%25eth3]
我可记不住这么长的地址。
通过这次学习,让我对IPv6的相关知识有了更清晰的认识。例如,我以前不知道IPv6地址是通过无状态协议自动配置的,也不知道IPv6中没有NAT技术,更不了解地址空间是如何恰好被便捷地划分为两半的。
IPv6并未对终端用户提供实质好处
技术人怎么看?
@lxgr 在学习这篇文章后,针对作者提到的一些看法,有不同的意见:
针对“IPv6没有子网掩码”的说法,他认为绝对是有子网掩码的,只不过在IPv6中它们被称为前缀长度。/64前缀刚好适合与SLAAC(无状态地址自动配置)配合使用。
防火墙穿越比NAT穿越更可预测且成功率更高。像VoIP、Tailscale等服务在IPv6环境下相比跨越一层或多层NAT的成功率大大提高。
家里的所有设备都可以获取公网地址,他可以通过路由器上的防火墙规则选择性地开放入站连接。 移动网络上的路由更为直接,从而降低了延迟(IPv4常常需要通过一系列昂贵且具有状态的CG-NAT设备,在使用的移动网络服务商部署IPv6的地区,这种情况得以避免)。