网络标识符速查表
MAC 地址、IPv4 私有地址、IPv6 全球单播、ULA、链路本地——这些标识符的位数、格式和有效范围各不相同,混用是网络配置里最常见的错误来源。本页把它们放在一起对照,并列出 IPv6 的常用前缀类型。
原理解析
联网设备有多个「地址」,分别工作在不同层级:MAC 地址是数据链路层的硬件标识(烧录于网卡,用于局域网内寻址);IP 地址是网络层的逻辑标识(可随网络变更);端口是传输层区分应用的入口。
更高层还有主机名(人类可读,经 DNS 解析为 IP)与 UUID(应用层全局唯一标识,如设备/会话 ID)。一套完整通信由「IP + 端口」四元组定位会话,MAC 与 UUID 则分别在链路层与应用层提供身份。
什么时候该查这张表
这张表在你要识别某个网络地址或标识符的用途时有用。它把 IPv6 各类地址(环回、单播、链路本地、唯一本地、组播)、以及各类标识符按前缀、位数、范围与「由谁分配」并列。排查网络问题或做地址规划时查它。
不该查的情况:你在做完整的子网划分、路由配置或 BGP 设计。这些需要结合组织实际的地址块规划与运维体系,表里的前缀知识只是基础。
判断标准:看前导位。IPv6 高位十六进制的首位决定类别:0–7 多为单播(2000::/3 是全球单播),c 开头的 fc00::/7 是唯一本地,fe80::/10 是链路本地,ff 开头是组播。记住「2000::/3 是公网」这一条能解决 80% 的判断。
特别注意 IPv4 映射地址:形如 ::ffff:192.168.1.1 的地址是 IPv4 映射的 IPv6 地址,用于兼容目的,不是真正的 IPv6 通信。双栈应用中看到这类地址要能正确识别,否则会出现「明明是 IPv4 却走 IPv6 路径」的排查困惑。
边界与常见陷阱
fe80::/10 链路本地地址不能跨网段使用
链路本地地址(fe80::/10)只在同一二层链路上有效,路由器不会转发它。常见错误:把 fe80:: 开头的地址写进配置文件当固定地址,换个网络就连不上;或在容器/VM 里配置 fe80:: 地址指望外部访问。正确做法是链路本地地址只用于邻居发现(NDP)与 「ping6 fe80::1%eth0」 这类带 zone index 的测试。
CIDR 前缀的位数记错会导致完全不同的网络
/64 与 /128 差 64 位,是两个不同量级的网络;IPv6 里最常见的约定是每个用户 /64(可挂 2^64 台设备),而 /128 是单个接口。不能把 IPv4 的直觉套到 IPv6 上:IPv4 是「按需划分」,IPv6 通常「固定 /64 分配」。做地址规划时这是根本原则 —— 分配粒度决定了后续的子网划分空间。
组播地址与 ff02::/16 的 zone 需求
IPv6 组播地址按作用域分层:ff01::/16 是节点本地、ff02::/16 是链路本地、ff05::/16 是站点本地、ff0e::/16 是全局。ff02::2(全部节点)之类的链路本地组播地址同样需要 zone index 才能指定从哪个网卡发出,跨接口会失败。配置 mDNS/SSDP 或写组播探测脚本时,漏掉 「%eth0」 是最常见的错误。
与相邻内容的分工
要查具体地址的归属地或 WHOIS 信息,属外部数据查询,本表不覆盖。
要处理子网划分、CIDR 计算与路由配置,属网络工程范畴,本表只给地址类别的识别方法。
要查端口与协议对应关系,用站内「常用端口」页,与本页的地址标识是两个维度。
若目的是排查连通性问题,先分清是 DNS 解析失败、地址类别用错、还是链路/作用域限制 —— 本页的类别知识能帮快速缩小范围。
实战片段
要点:① IPv6 地址类别由前导位决定,fc00::/7 是唯一本地、fe80::/10 是链路本地、ff 开头是组播、2000::/3 是全球单播;② fe80::/10 链路本地地址只在同一二层链路有效,路由器不转发,写进配置文件当固定地址换个网络就连不上,测试时要带 zone index(%eth0);③ 形如 ::ffff:192.168.1.1 的是 IPv4 映射地址,用于兼容而非真正的 IPv6,双栈应用里要能正确识别;④ ff02::/16 等链路本地组播同样需要 zone index,配置 mDNS/SSDP 时漏掉是最常见错误;⑤ IPv6 通常固定分配 /64 给用户,分配粒度决定了后续子网划分空间。
// ① 按前导位判断 IPv6 地址类别
function classifyIPv6(addr) {
const a = addr.toLowerCase().split('%')[0] // 去掉 zone index
if (a === '::1') return { kind: 'loopback', note: '本机环回' }
if (a === '::') return { kind: 'unspecified', note: '未指定' }
if (a.startsWith('::ffff:')) {
// 🔴 IPv4 映射地址:兼容用,不是真正的 IPv6 通信
const v4 = a.slice(7)
const isMapped = /^d{1,3}(.d{1,3}){3}$/.test(v4)
return { kind: isMapped ? 'ipv4-mapped' : 'nat64', v4, note: 'IPv4 映射/兼容地址' }
}
const first = parseInt(a[0], 16) // 首个十六进制位
if ((first & 0xfe) === 0xfc) return { kind: 'unique-local', cidr: 'fc00::/7', note: '唯一本地' }
if (a.startsWith('fe8') || a.startsWith('fe9') || a.startsWith('fea') || a.startsWith('feb')) {
return { kind: 'link-local', cidr: 'fe80::/10', note: '链路本地(仅同链路,跨网段不通)' }
}
if (first === 0xff) {
const second = parseInt(a.split(':')[1] || '0', 16)
const scope = second === 0x01 ? 'node' : second === 0x02 ? 'link' : second === 0x05 ? 'site' : 'global'
return { kind: 'multicast', scope, note: '组播(链路本地需 zone index)' }
}
if (a.startsWith('200')) return { kind: 'global-unicast', cidr: '2000::/3', note: '全球单播' }
if (a.startsWith('64:ff9b')) return { kind: 'nat64', cidr: '64:ff9b::/96', note: 'NAT64' }
return { kind: 'other', first: first.toString(16) }
}
console.log(classifyIPv6('::1')) // loopback
console.log(classifyIPv6('2001:db8::1')) // global-unicast
console.log(classifyIPv6('fe80::1')) // link-local
console.log(classifyIPv6('fc00::1')) // unique-local
console.log(classifyIPv6('ff02::1')) // multicast / link
console.log(classifyIPv6('::ffff:192.168.1.1')) // ipv4-mapped
// ② 链路本地与组播必须带 zone index(网卡名)
// ✅ ping6 fe80::1%eth0
// ❌ ping6 fe80::1 —— 多网卡时无法确定从哪块发出
// ③ 分配粒度:IPv6 通常固定 /64 给用户
// /64 = 2^64 个地址 ⇒ 不需要再分子网给设备
// /128 = 单个接口(loopback 用)
// 🔴 分配粒度决定后续扩展空间,错了无法回收实践注解
- MAC 地址在跨网段时会被改写MAC 只在同一广播域内有意义,数据包经过三层设备时源/目的 MAC 会被逐跳替换。因此不能把 MAC 当作跨网络的设备标识,也不要用它做授权。
- 私有地址段重叠是内网互联的常见坑10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 被大量组织重复使用,两家公司做 VPN 互联时经常撞段。规划时应预留不冲突的地址段,或使用 NAT 做转换。
- IPv6 的单播地址要区分链路本地与全局fe80::/10 是链路本地地址,带 zone id(如 fe80::1%eth0),同一地址在不同接口上含义不同;2000::/3 才是全局可路由。把链路本地地址写进配置或日志会导致无法定位。
数据来源
- IEEE 802 (MAC addresses)
- RFC 1918 (IPv4 private ranges)
- RFC 4291 (IPv6 addressing)
- RFC 4193 (unique local addresses)
- RFC 3849 (documentation prefix 2001:db8::/32)
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
五类标识符对照
| 标识符 | 位数 | 格式示例 | 有效范围 | 由谁分配 |
|---|---|---|---|---|
| MAC 地址 | 48 | 00:1A:2B:3C:4D:5E | 同一链路(二层)内唯一 | 网卡厂商烧录,前 24 位是 OUI |
| IPv4 私有地址 | 32 | 192.168.1.10 | 局域网内,出网需 NAT | 由管理员或 DHCP 分配 |
| IPv6 全球单播 | 128 | 2001:db8::1 | 全球可路由的公网地址 | 由运营商或 RIR 分配 |
| IPv6 唯一本地(ULA) | 128 | fd12:3456::1 | 站点内部,不得上公网路由 | 随机生成 40 位全局 ID |
| IPv6 链路本地 | 128 | fe80::1 | 仅单条链路,不可跨路由 | 接口启用 IPv6 时自动生成 |
IPv6 常见前缀类型
| 前缀 | 类型 | 说明 |
|---|---|---|
| ::1/128 | 回环地址 | 本机自身,等价于 IPv4 的 127.0.0.1 |
| 2000::/3 | 全球单播 | 公网可路由地址,目前实际分配在此范围内 |
| fc00::/7 | 唯一本地 ULA | 站点内部使用,fd 开头才是本地生成的 |
| fe80::/10 | 链路本地 | 仅限于同一链路,路由器不转发 |
| ff00::/8 | 组播 | 一对多通信,已取代 IPv4 的广播 |
| 2002::/16 | 6to4 | 过渡机制,现已基本弃用 |
常见问题
通过 MAC 地址能定位到具体某台设备吗?
在公网层面不能。MAC 地址只在同一个二层链路内有效,数据包经过路由器后源 MAC 就会被改写,所以外部看不到你设备的真实 MAC。能做的只是通过前 24 位的 OUI 查到网卡厂商,比如某个前缀属于某家手机或路由器厂商。真正能跨网段追踪的是 IP 地址、浏览器指纹和账号体系,而不是 MAC。顺带一提,现代操作系统默认开启随机 MAC,在扫描 Wi-Fi 时会使用随机地址,进一步削弱了基于 MAC 的追踪。
IPv6 的 ULA 和 IPv4 的私有地址是一回事吗?
设计目的相似,细节差别很大。两者都用于内部网络、都不应该在公网路由。但 IPv4 私有地址只有固定的三段(10/8、172.16/12、192.168/16),不同组织的地址必然重复,合并网络时经常冲突。ULA 的 fc00::/7 前缀后面还有 40 位全局 ID,规范要求用随机数生成,因此两个组织撞号的概率极低,网络合并时基本不需要重新编址。实际部署中常见做法是 ULA 与全球单播地址并存:ULA 保证内部通信永远可达,全球单播用于对外通信。
为什么 IPv6 地址里是 fd 开头,而不是 fc?
fc00::/7 这个前缀实际被拆成两半:fc00::/8 保留给未来由中央机构分配,fd00::/8 才是给本地自行生成的。RFC 4193 规定本地生成 ULA 时必须把第八位(L 位)置为 1,也就是前缀必须以 fd 开头。所以你在本地工具里生成的 ULA 地址一定以 fd 打头;如果看到 fc 开头,要么是保留用途,要么是配置有误。
IPv6 为什么没有广播地址?
IPv6 取消了广播,改用组播加任播来替代。原因是广播会打扰网段内所有主机,每台设备都必须中断处理这个包,在大型网络里浪费明显。组播则只投递给加入对应组的主机,未被投递的主机完全不受影响。原本靠广播完成的地址解析,在 IPv6 里由邻居发现协议(NDP)用 ICMPv6 组播实现。这也是 IPv6 里看不到 255.255.255.255 这类地址的原因。