最近公司搬了新办公区,为相应号召,抛弃ipv4全面拥抱ipv6,于是简单研究了一番,发现一些有趣的事。

(一)IPv6地址总数相当夸张

IPv4 地址长度为 32 位,总数约为 43 亿个。

IPv6 地址的长度是 128 位,地址总数有 2128 个,数值展开后约等于 34 万亿亿亿亿 个。

IPv6 地址总数是 IPv4 的足足 296 倍,这个数量足以给地球上每一粒沙子分配数万亿个独立的 IPv6 地址。

IPv4 和 IPv6 是两套并行的网络协议,一台设备可以同时配置 IPv4 和 IPv6 地址(双栈模式),但这两个地址之间没有内在关联,只是同时绑定在同一个网络接口上。

为了解决 IPv4 和 IPv6 网络互通的问题,人们设计了一些过渡技术,实现了 “伪映射”,但这不是协议本身的对应关系:

IPv4 映射的 IPv6 地址:一种特殊的 IPv6 地址格式,格式为::ffff:w.x.y.z,其中w.x.y.z 是 IPv4 地址。例如 IPv4 地址 192.168.1.1 对应的映射 IPv6 地址是 ::ffff:192.168.1.1。这种地址仅用于双栈主机内部的协议转换,并非全局有效的 IPv6 地址。

NAT64/DNS64:通过网关设备将 IPv6 网络的流量转换为 IPv4 流量,实现 IPv6 主机访问 IPv4 资源,但这是网关层面的地址转换,不是地址本身的对应。

(二)IPv6地址的格式

IPv6 标准格式为 8 组 16 位十六进制数,组间用 : 分隔,例如

fe80:0000:0000:0000:0000:0000:0000:0001

由于这种地址规律,为了简化地址记忆,可以使用零压缩语法连续≥1 组全零段可用 :: 替代,且整个地址仅能使用一次 ::(避免歧义,确保能还原为 8 组)

例如:

  • 原始地址:fe80:0000:0000:0000:0000:0000:0000:0001

  • 前导零省略后:fe80:0:0:0:0:0:0:1

  • 零压缩后:fe80::1(最简洁写法)

为什么不沿用 IPv4 的点号(.)?

点号的用途早已被占满:它已经被赋予了三层含义:

  1. 十进制计数法标识

  2. IPv4 字节段的边界分隔符

  3. DNS 域名层级分隔符(例如 example.com

使用点号,可能会引起歧义。

为什么不用逗号(,)?

逗号是列表分隔符,而非结构化分隔符:

  • 编程语言中:a, b, c(用于分隔多个独立元素)

  • 配置文件中:用于标记值列表

  • 逗号分隔值文件(CSV)的核心分隔符

除此之外,逗号还有几个致命问题:

  • 容易被人眼忽略

  • 常被解析程序过滤剔除

  • 存在地域使用差异(在许多国家,逗号是十进制小数点

为什么偏偏是冒号(:)?

早在 IPv6 诞生之前,冒号就有了广泛应用:

  • MAC 地址:aa:bb:cc:dd:ee:ff

  • 时间格式:时:分:秒(HH:MM:SS)

  • 比例与命名空间标识也会用到冒号

符合使用惯例,是有历史和技术原因的,而非拍脑袋定的。

(三)过渡与阵痛

IPv6作为相对较新的标准,各大操作系统为了兼容 IPv6 均采用过一些过渡措施或临时适配方案,核心都是在不彻底重构旧系统的前提下,解决 IPv6 与 IPv4 共存、格式冲突、协议互通等问题。

微软UNC为适配IPv6推出临时机制

UNC(通用命名约定)是 Windows 系统中访问局域网共享资源的标准路径格式。

核心语法为:\\服务器名或IP\共享文件夹\子文件

比如访问局域网内 IP 为 192.168.1.1 的共享文件夹 Docs,路径就是 :\\192.168.1.1\Docs

问题就出在:UNC 路径的语法规则里,不允许出现冒号(:—— 冒号在 Windows 中有特殊用途,比如用于区分驱动器盘符(C:\)、端口号等。

微软的解决方案是做一层地址转换映射,创建了 ipv6-literal.net 这个特殊的伪域名后缀,专门用来兼容 IPv6 地址的 UNC 路径访问。

把 IPv6 地址中的冒号(:)全部替换成连字符(-),再加上后缀 .ipv6-literal.net。示例:IPv6 地址 fe80::1 → 转换后为 fe80--1.ipv6-literal.net