IPv6 计算器
以精确的 128 位运算展开、压缩并分析 IPv6 地址。可获得网络前缀、地址范围内的首地址与末地址、地址数量,以及其中能容纳多少个 /64 网络 —— 支持 /0 到 /128 的任意前缀。
IPv6 地址的结构
IPv6 地址是 128 位,写成用冒号分隔的八组四位十六进制数。每组 16 位,所以 8 × 16 = 128。与 IPv4 不同,它没有点分十进制的替代写法,也不存在地址分类。
2001:0db8:1234:5678:9abc:def0:1234:5678 ├──────────────┤├──────────────────────┤ 64 位 64 位 网络前缀 接口标识符 2001:0db8:1234:5678 : 9abc:def0:1234:5678 └─── 路由前缀 ───┘ └── 子网 ──┘ 48 位 16 位
实际划分通常是:运营商分配一个 /48,每个局域网一个 /64,其余 64 位留给该局域网内的主机。这样一个 /48 就能切出 65,536 个 /64 网络 —— 远超任何站点的需求,这也是运营商把 /48 作为标准企业分配粒度的原因。
压缩规则
IPv6 地址很长,于是有了两种简写。两者都在 RFC 4291 中定义、并在 RFC 5952 中细化;本计算器输出的正是 RFC 5952 规定的规范形式。
- 去掉每组的前导零。 0db8 变成 db8。全零的组写成单个 0,除非它属于被压缩的连续零组。
- 把一段连续的零组替换成 ::。必须选择最长的一段;若两段长度相同,压缩靠前的那一段。
- 单个零组不要压缩。 RFC 5952 要求 :: 至少代表两组,所以 2001:db8:0:1::1 中那个单独的 0 要保留。
示例:2001:0db8:0000:0000:0000:0000:0000:0001
第 1 步 —— 去掉前导零:
2001:db8:0:0:0:0:0:1
第 2 步 —— 最长的连续零组覆盖第 3 到第 7 组,共五组:
2001:db8::1
展开是反向操作:数出已写出的组数(两组)和 :: 隐含的组数(六组),得到完整的八组形式。
为什么前缀运算需要 128 位数字
一个 /64 包含 2^64 个地址,即 18,446,744,073,709,551,616。JavaScript 的数字是 IEEE 754 双精度浮点数,只能精确表示到 2^53 的整数,而位运算符一次只处理 32 位。任何建立在 Number 之上的 IPv6 计算器,都会在大前缀上静默地返回错误结果。
本计算器把每个地址转换成 BigInt 并在 BigInt 上完成掩码运算,因此 /0、/64 与 /128 都能返回精确的十进制计数。/0 的地址数会显示为完整的 39 位数字,而不是四舍五入后的近似值。
常见 IPv6 错误
- 把局域网划分成 /64 以外的尺寸。 SLAAC 会失效,隐私扩展不再工作,某些操作系统干脆拒绝配置地址。
- 在一个地址里用两个 ::。 2001::db8::1 是非法地址,因为解析器无法判断每个压缩标记各代表多少组零。
- 还想着节约地址。 每个 VLAN 一个 /64 才是正确的默认值。为了“省空间”把多个 VLAN 塞进一个 /120,只会带来麻烦而没有任何收益。
- 以为链路本地地址可路由。 fe80::/10 永远不会离开本链路;当设备有多个接口时,还必须加上 fe80::1%eth0 这样的区域索引(zone index)才能唯一确定。
IPv6 前缀尺寸
| 前缀 | 地址数 | /64 数量 | 典型用途 |
|---|---|---|---|
| /0 | 3.4 × 10^38 | 2^64 | 默认路由 —— 整个地址空间 |
| /3 | 4.25 × 10^37 | 2^61 | 全局单播分配(2000::/3) |
| /16 | 5.19 × 10^34 | 2^48 | 分配给注册机构的超大地址块 |
| /32 | 7.9 × 10^28 | 2^32 | 标准运营商分配 —— 通常是注册机构给的 /32 |
| /48 | 1.2 × 10^15 | 65,536 | 标准站点或企业分配(16 位子网位) |
| /56 | 4.7 × 10^15 | 256 | 标准家庭宽带分配(8 位子网位) |
| /64 | 1.8 × 10^19 | 1 | 单个局域网段 —— SLAAC 要求的尺寸 |
| /112 | 65,536 | — | 小于 /64 的前缀,仅用于特殊设计 |
| /128 | 1 | — | 单个接口或主机路由 |
IPv6 地址类型
| 前缀 | 类型 | 可否路由 | 说明 |
|---|---|---|---|
| ::1/128 | 环回地址 | 否 | 相当于 IPv4 的 127.0.0.1 |
| ::/128 | 未指定地址 | 否 | 配置完成前仅用作源地址 |
| 2000::/3 | 全局单播 | 是 | 当前唯一已分配的全局单播地址段 |
| 2001:db8::/32 | 文档用地址 | 否 | RFC 3849 —— 仅用于示例与文档 |
| fc00::/7 | 唯一本地地址 | 否 | RFC 4193 私有地址空间,类似于 RFC 1918 |
| fe80::/10 | 链路本地地址 | 否 | 每个接口自动配置,永不被路由 |
| ff00::/8 | 组播地址 | 否 | 完全取代 IPv4 的广播 |
| 2002::/16 | 6to4 | 已弃用 | 过渡机制,已不推荐使用 |
| ::ffff:0:0/96 | IPv4 映射地址 | 内部使用 | 在双栈套接字上表示 IPv4 对端 |
| 64:ff9b::/96 | NAT64 | 是 | RFC 6052 定义的知名转换前缀 |
关于每种地址类型的详细说明与使用时机,请参阅 IPv6 地址类型指南。
常见问题
如何展开一个 IPv6 地址?
把 :: 替换成足够多的零组以凑满八组,再把每组补齐到四个十六进制位。以 2001:db8::1 为例,已写出两组,一个 :: 代表六组,所以展开形式是 2001:0db8:0000:0000:0000:0000:0000:0001。
如何压缩一个 IPv6 地址?
去掉每组的前导零,再把最长的一段连续全零组替换成 ::。每个地址只能用一个 ::,因为两个会产生歧义。RFC 5952 还规定单个零组不应被压缩,所以 2001:db8:0:1::1 中那个单独的零组要保留。
为什么 /64 是 IPv6 的标准子网尺寸?
无状态地址自动配置(SLAAC)用低 64 位生成接口标识符,因此设备需要一个 /64 才能自动配置。/64 上的路由器通告(RA)也让主机可以使用完整的 64 位标识符空间,隐私扩展正依赖于此。在局域网上使用 /64 以外的尺寸会破坏这些机制。
一个 IPv6 /64 里有多少个地址?
2^64 个,即 18,446,744,073,709,551,616 个地址 —— 大约是整个 IPv4 地址空间的 43 亿倍。这个数字无法用 JavaScript 的 Number 精确表示,所以本页所有运算都使用 BigInt。
:: 和 0:0:0:0:0:0:0:0 有什么区别?
它们是同一个地址,只是写法不同。:: 是未指定地址,仅在接口尚未获得地址之前用作源地址,绝不能用作目的地址。
IPv4 映射的 IPv6 地址长什么样?
IPv4 映射地址写作 ::ffff:a.b.c.d,例如 ::ffff:192.168.1.1。前 80 位为零,接下来 16 位全为 1,最后 32 位承载 IPv4 地址。双栈套接字表示 IPv4 对端时会出现这种地址,它与已弃用的 IPv4 兼容地址 ::a.b.c.d 不同。
IPv6 地址空间中真正用于全局单播的占多少?
全局单播地址从 2000::/3 中分配,这只占整个地址空间的八分之一。以 000 开头的地址段被保留,目前完全不用于单播,为将来扩展留出了余量。