文章

IP 地址:从 IPv4 到 IPv6

IP 地址:从 IPv4 到 IPv6

IPv4

IPv4的表示方法

IPv4 规定 IP 地址长度为 32 位(二进制),用 4 个字节就能存储。

一个字节可以存储 8 个二进制位,也就是 11111111[^解释],它在内存中就占一个字节(byte),4 个字节就是 4 个 8 位二进制的数。假设 IP 地址从 0 开始分配,一直分配到最大的那个数字:

1
2
3
4
# 二进制能表示的第一个地址
00000000 00000000 00000000 00000000
# 二进制能表示的最后一个地址
11111111 11111111 11111111 11111111

然后再用.来分隔每个字节

1
2
3
4
# 二进制能表示的第一个地址
00000000.00000000.00000000.00000000
# 二进制能表示的最后一个地址
11111111.11111111.11111111.11111111

但是二进制太难记了,再将二进制转换成十进制

1
2
3
4
# 二进制能表示的第一个地址
0.0.0.0
# 二进制能表示的最后一个地址
255.255.255.255

IPv4 可以分配给多少台设备

假设不考虑广播地址等其他情况,假设每个地址都是一台设备,那么:

固定前三位 255,最后一位从 0 分配到 255,可以分配给 256 台设备:

255.255.255.0 ~ 255.255.255.255256 台设备

固定前两位 255,最后两位从 0.0 分配到 255.255,可以分配给 65,536 台设备:

255.255.0.0 ~ 255.255.255.255256² = 65,536 台设备

固定前一位 255,后面三位从 0.0.0 分配到 255.255.255,可以分配给 16,777,216 台设备:

255.0.0.0 ~ 255.255.255.255256³ = 16,777,216 台设备(约一千六百万)

不固定任何位,直接从 0.0.0.0 分配到 255.255.255.255,可以分配给 4,294,967,296 台设备:

0.0.0.0 ~ 255.255.255.255256⁴ = 4,294,967,296 台设备(约四十三亿)

全球人口有 77 亿之多,43 亿根本不够分!

IPv4 地址分类

A 类地址:范围 1.0.0.0 ~ 127.255.255.255,主要分配给有大量主机的大型网络。第一段范围 1~127(127 个),后三段各 256 个值,共 127 × 256³ = 2,130,706,432 个 IP 地址。

B 类地址:范围 128.0.0.0 ~ 191.255.255.255,一般用于国际性大公司和政府机构。第一段范围 128~191(64 个),共 64 × 256³ = 1,073,741,824 个 IP 地址。

C 类地址:范围 192.0.0.0 ~ 223.255.255.255,用于一般小公司、校园网、研究机构等。第一段范围 192~223(32 个),共 32 × 256³ = 536,870,912 个 IP 地址。

D 类地址:范围 224.0.0.0 ~ 239.255.255.255,用于特殊用途,又称组播地址。第一段范围 224~239(16 个),共 16 × 256³ = 268,435,456 个 IP 地址。

E 类地址:范围 240.0.0.0 ~ 255.255.255.255,暂时保留。第一段范围 240~255(16 个),共 16 × 256³ = 268,435,456 个 IP 地址。

五类地址合计约 42.9 亿个 IP,减去 E 类保留地址后约 40.3 亿个可用。

中国租用了多少 IP 地址

IPv4 地址由国际互联网络信息中心(ICANN)统一分配,机构主体在美国。我国接入国际网络需要向 ICANN 租用 IP 网段,租到之后由工信部管理(无线电频率、卫星轨道、手机号码网段、MAC 地址、在中国注册的域名都归工信部负责),再分配给各大网络服务运营商:中国电信、中国联通、中国移动、中国教育和科研计算机网、中国科技网、中国国际经济贸易互联网。

中国具体租用了多少地址,官方数据不太好找,但从 chnroutes2 项目可以找到一份中国大陆路由表,更新还算及时。从中筛选出约 3184 条中国大陆路由信息(不含中国台湾、中国香港、中国澳门),可以算个大概。

路由信息由 IP 网段和子网掩码位数组成,比如 1.1.8.0/24,用 2^(32 - 子网掩码位数) 就能算出这条路由下包含多少个 IP:

1
2
3
4
1.1.8.0/24   # 2^(32-24) = 256
1.24.0.0/13  # 2^(32-13) = 524,288
1.45.0.0/16  # 2^(32-16) = 65,536
……

把这 3184 条数据的子网掩码位数分别计算再相加,得出中国大陆路由下的 IP 总数:

约 298,987,008 个(约 3 亿个 IP)。

私有 IP 地址

私有 IP 地址不会在公网上路由,只能在局域网内部使用,这样可以大幅缓解 IPv4 地址不足的问题:

  • A 类私有地址10.0.0.0 ~ 10.255.255.255,即 10.0.0.0/8,共约 1677 万个地址
  • B 类私有地址172.16.0.0 ~ 172.31.255.255,即 172.16.0.0/12,共约 104 万个地址
  • C 类私有地址192.168.0.0 ~ 192.168.255.255,即 192.168.0.0/16,共约 6.5 万个地址

还能无动于衷吗?

从上面的数据可以看出,IPv4 的地址数量明显不够用。实际上在 2011 年,IPv4 地址就已经分配完毕。由于 IPv4 地址分类等原因,全球一共分配了约 36 亿个 IP 地址,其中中国分配了约 3.36 亿个,占全部的 9.28%。

2019 年中国网民已达 8.5 亿,尽管私有 IP 和 NAT 技术缓解了大部分设备的上网需求,但 3.3 亿个公网 IP 在中国的确不够用。为此,工信部在 2020 年 3 月 23 日发布了《工业和信息化部关于开展 2020 年 IPv6 端到端贯通能力提升专项行动的通知》(工信部通信函〔2020〕57 号),全面推进 IPv6 部署。

IPv6

IPv6 是 IPv4 的下一代协议,最根本的变化就是把地址长度从 32 位扩展到了 128 位,从根本上解决了地址枯竭的问题。

IPv6 的表示方法

IPv6 地址长度为 128 位,用 16 个字节存储。为了便于书写和阅读,IPv6 采用十六进制表示法,每 16 位(2 个字节)为一组,用冒号 : 分隔,共 8 组:

1
2
0000:0000:0000:0000:0000:0000:0000:0000  (最小地址)
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF  (最大地址)

每组 FFFF 对应的二进制是 1111111111111111,共 16 位。8 组 × 16 位 = 128 位。

IPv6 的地址空间

IPv6 的地址总量是 2^128,也就是:

1
(65535 + 1)^8 = 2^128 ≈ 3.4 × 10^38

写成完整数字就是:

1
340,282,366,920,938,463,463,374,607,431,768,211,456

这个数字大到什么程度?有人形象地说过:IPv6 可以让地球上的每一粒沙子都分配到一个 IP 地址。相比 IPv4 的 43 亿,IPv6 的地址空间几乎可以说是无限的。

IPv6 地址的简写规则

由于 IPv6 地址很长,RFC 定义了两种简写方式:

前导零省略:每组中前导的 0 可以省略

1
2
2001:0db8:0000:0000:0000:0000:0000:0001
→ 2001:db8:0:0:0:0:0:1

连续零压缩:连续的多个全零组可以用 :: 代替,但一个地址中只能使用一次

1
2
2001:db8:0:0:0:0:0:1
→ 2001:db8::1

再看几个例子:

1
2
3
0000:0000:0000:0000:0000:0000:0000:0001  →  ::1(本地回环地址,类似 IPv4 的 127.0.0.1)
0000:0000:0000:0000:0000:0000:0000:0000  →  ::(未指定地址,类似 IPv4 的 0.0.0.0)
2001:0db8:0000:0000:0000:0000:0000:0001  →  2001:db8::1

IPv4 和 IPv6 的对比

特性IPv4IPv6
地址长度32 位(4 字节)128 位(16 字节)
地址数量约 43 亿约 3.4 × 10³⁸
表示方式点分十进制(如 192.168.1.1冒号分隔十六进制(如 2001:db8::1
地址分配手动配置或 DHCP支持无状态自动配置(SLAAC)
NAT 依赖大量依赖 NAT 缓解地址不足理论上不再需要 NAT
本文由作者按照 CC BY 4.0 进行授权