NetCalcLab

IPv6 计算器

以精确的 128 位运算展开、压缩并分析 IPv6 地址。可获得网络前缀、地址范围内的首地址与末地址、地址数量,以及其中能容纳多少个 /64 网络 —— 支持 /0 到 /128 的任意前缀。

支持带 :: 的压缩写法、完整的 8 组写法、::ffff:192.168.1.1 这类内嵌 IPv4 地址,以及区域索引(zone index)。

取值 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 规定的规范形式。

  1. 去掉每组的前导零。 0db8 变成 db8。全零的组写成单个 0,除非它属于被压缩的连续零组。
  2. 把一段连续的零组替换成 ::。必须选择最长的一段;若两段长度相同,压缩靠前的那一段。
  3. 单个零组不要压缩。 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 前缀尺寸

常见 IPv6 前缀长度及其用途
前缀地址数/64 数量典型用途
/03.4 × 10^382^64默认路由 —— 整个地址空间
/34.25 × 10^372^61全局单播分配(2000::/3)
/165.19 × 10^342^48分配给注册机构的超大地址块
/327.9 × 10^282^32标准运营商分配 —— 通常是注册机构给的 /32
/481.2 × 10^1565,536标准站点或企业分配(16 位子网位)
/564.7 × 10^15256标准家庭宽带分配(8 位子网位)
/641.8 × 10^191单个局域网段 —— SLAAC 要求的尺寸
/11265,536—小于 /64 的前缀,仅用于特殊设计
/1281—单个接口或主机路由

IPv6 地址类型

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::/166to4已弃用过渡机制,已不推荐使用
::ffff:0:0/96IPv4 映射地址内部使用在双栈套接字上表示 IPv4 对端
64:ff9b::/96NAT64是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 开头的地址段被保留,目前完全不用于单播,为将来扩展留出了余量。