📚 第四章 IP协议
📄 一句话概括

fc00::/7 是 IPv6 的「私有地址」,实际只用 fd00::/8。 和 IPv4 私网地址最大的不同是「中间 40 位随机」,所以合并网络不会撞。

📝 本节和前面几节的关系

4.3.8 讲了 IPv4 的私有地址,这里是 IPv6 的对应物。 4.6.5 的全局地址是「出门用」,ULA 是「家里用」。

一、它长什么样

前 8 位固定:fc00::/7 里的第 8 位是 1,所以实际用 fd00::/8。 剩下 120 位分三段:40 位全局 ID、16 位子网 ID、64 位接口标识。

部分 位数 谁定
前缀 8 位 协议规定 fd
全局 ID 40 位 自己随机抽
子网 ID 16 位 自己划
接口标识 64 位 主机自己生成

第二行「40 位随机」是整个设计的核心: 2 的 40 次方约 1.1 万亿,所以「两家公司抽到同一个」的概率可以忽略。 这就是它叫「唯一本地」而不是「私有」的原因。 第三行「16 位子网」够划 65536 个网:大企业按楼层、按部门分都够用。

二、和 IPv4 私网地址的关键区别

表面看都是「内网用的地址」,但性质完全不同:

项 IPv4 私网 IPv6 ULA
前缀来源 RFC 固定三段 自己随机抽
会不会撞 一定会 几乎不会
合并网络 必须改地址 直接通
能否上网 要 NAT 要 NAT 或代理

第三行是 ULA 真正的价值: 两家公司合并,各自的 10.0.0.0/8 都要重编——这是并购里最烦的活之一。 而 ULA 因为前缀不同,直接就能互访。 第四行要注意「不能直接上网」:ULA 地址不能在公网上路由, 所以要出门还是得有全局地址——常见做法是「内网 ULA、出口全局」,双栈并行。

三、什么时候该用

三种典型场景:

场景 用 ULA 的好处 注意
纯内网 不依赖运营商 换运营商不用重编
多园区互联 地址不冲突 要规划全局 ID
过渡期双栈 内网先用起来 出口仍走 IPv4

第一行「不依赖运营商」很实际:全局地址是运营商给的,换一家就变; 内网如果用 ULA,换运营商时内网一行配置都不用改。 这是运维喜欢 ULA 的主要原因。 第二行「要规划全局 ID」是个提醒:别随手 fd00::/8 一刀切, 每个园区抽一个不同的 40 位,互联时才不会撞。

四、一个容易踩的坑

有些系统会把 ULA 当成「公网地址」处理:因为它不在 fe80 里,看起来像全球地址。 结果是「内网流量试图走默认路由出去」,然后被丢。 解决办法是「在边界路由器上明确不转发 ULA」:这条规则几乎所有 IPv6 的边界配置里都有。 另一个坑是「DNS 返回 AAAA 记录」: 如果内网服务只配了 ULA,而客户端拿到的是全局地址,就连不上。 所以双栈环境里,DNS 要按「客户端在哪儿」返回不同的记录——这一块比 IPv4 时代复杂。

五、动手 Demo:唯一本地地址,自己划一块内网

算一下 40 位随机能抽多少个全局 ID,再看每个全局 ID 之下有多少容量。 注意「一家撞上别人的概率」那一行:9.09e-06。

rand = 2 ** 40
n = 1000 * 10000
print(rand, rand / 1e12)
print('%.2e' % (n / rand))
print('%.1e' % (rand * 65536))

实跑输出:

--------------------------------------------------------------------
唯一本地地址,自己划一块内网
--------------------------------------------------------------------
**IPv6 里对应「私有地址」的是「唯一本地地址」(ULA)**:**fc00::/7,实际只用 fd00::/8。**
**它和 IPv4 私网地址的区别是:中间 40 位要随机,避免两家公司撞车。**

  部分                 取值          说明
  -----------------------------------------------------
  唯一本地地址总段     fc00::/7      1 位表示「本地」
  实际可用             fd00::/8      第 8 位固定为 1
  全局 ID              40 位随机     每家公司自己抽
  子网 ID              16 位         能切 65536 个子网

**算一下「40 位随机够不够」**:
**1099511627776 个不同的全局 ID**(约 1.1 万亿)
**假设全球 1000 万家企业各抽一个,一家撞上别人的概率约 9.09e-06**
**这个概率低到「不用协调」**——**这就是 ULA 和 IPv4 私网地址最大的不同。**
**IPv4 的 10.0.0.0/8 是「全世界共用」,一合并网络就冲突**;**ULA 是「各抽各的」,基本不会撞。**

**每个全局 ID 之下的容量**:
**65536 个 /64,每个 /64 里 1.84e+19 个地址**——
**合计 7.2e+16 个 /64**

**有一点要注意**:**ULA 地址不能在公网上路由**,
**所以「内网用 ULA、出口用全局地址」是常见搭配**——
**和 IPv4 的「内网 192.168、出口公网 IP」是一个套路。**

1.1 万亿个全局 ID 这个数量级,足够「每家公司随便抽」: 就算全球有一千万家企业各抽一个,撞上的概率也只有百万分之一量级。 所以 ULA 不需要「统一分配机构」——这是它和 IPv4 私网地址的根本区别。 「合计 7.2e16 个 /64」这个数说明 ULA 的容量也大到用不完: 它不是为了「省」设计的,是为了「不冲突」设计的。 这一点和 IPv4 私网地址的思路完全相反。 实测一句:本机 ipconfig 里能看到 WLAN 的 fe80 地址, 但没有 fd 开头的地址——因为 Windows 默认不给网卡配 ULA,要手工加。 这也说明「ULA 是可选的」,不像 fe80 那样必需。

30 秒实验

  1. 算一下:一个 40 位全局 ID 之下能切多少个 /64?
  2. 想一下:为什么 ULA 不需要「统一的分配机构」?
  3. 想一下:双栈环境里 DNS 要注意什么?

常见误区

  1. 以为「ULA 就是 IPv6 的私有地址,一回事」。 机制不同,ULA 靠随机避免冲突, 私网地址靠约定然后忍受冲突。
  2. 以为「ULA 能直接上网」。 不能,公网不路由这个前缀。
  3. 以为「ULA 前缀随便写 fd00::/8 就行」。 多园区要各抽一段,否则互联时会撞。
自测三问(点开对答案) 1. 唯一本地地址的前缀是什么? —— **fc00::/7**,实际用 **fd00::/8**。 2. ULA 中间那 40 位是干什么的? —— **全局 ID,随机抽取**,用来避免不同组织的地址撞车。 3. ULA 和 IPv4 私网地址最大的区别是什么? —— **ULA 的前缀是随机抽的,合并网络不会冲突**; IPv4 私网地址是全世界共用同一段,一合并就要重编。

下一节讲 IPv6 的分片:只有源端能分。

相关笔记