Network Identifiers Cheat Sheet
MAC addresses, IPv4 private ranges, IPv6 global unicast, ULA and link-local all differ in bit width, notation and scope — and confusing them is one of the most common sources of network misconfiguration. This page puts them side by side and lists the IPv6 prefix types you will actually meet.
How It Works
Connected devices carry several addresses at different layers: a MAC address is the data-link hardware id (burned into the NIC, used within a LAN); an IP address is the network-layer logical id (can change with the network); a port distinguishes applications at the transport layer.
Higher up sit hostnames (human-readable, resolved to IP by DNS) and UUIDs (application-layer globally-unique ids for devices/sessions). A full conversation is pinned by the IP+port 4-tuple, while MAC and UUID provide identity at the link and application layers respectively.
When to Use This Table
This table is for identifying what a network address or identifier is for. It lays out IPv6 address classes — loopback, unicast, link-local, unique local, multicast — with their prefixes, bit counts, ranges and who assigns them. Consult it when troubleshooting networking or planning address space.
When not to consult it: you are doing subnet division, routing configuration or BGP design. Those depend on an organisation’s actual address block planning and operations setup; the prefix knowledge here is only the foundation.
Rule of thumb: look at the leading bits. The first hex digit of an IPv6 address determines its class: 0–7 is mostly unicast (with 2000::/3 being global unicast), an fc00::/7 prefix is unique local, fe80::/10 is link-local, and an ff prefix is multicast. Remembering that 2000::/3 is public resolves most cases.
Mind IPv4-mapped addresses: a form such as ::ffff:192.168.1.1 is an IPv4-mapped IPv6 address used for compatibility, not genuine IPv6 communication. Correctly recognising it matters in dual-stack applications, otherwise you get the puzzle of an IPv4 endpoint taking an IPv6 code path.
Boundaries and Common Pitfalls
fe80::/10 link-local addresses cannot cross segments
Link-local addresses (fe80::/10) are only valid on the same L2 link and routers never forward them. A common mistake is writing an fe80:: address into a config file as a fixed address, which then fails on a different network; another is configuring fe80:: inside a container or VM and expecting external access. The correct use is neighbour discovery (NDP) and scoped tests such as ping6 fe80::1%eth0, where the zone index is required.
Misremembering CIDR prefix length yields an entirely different network
A /64 and a /128 differ by 64 bits and represent entirely different sized networks. The usual IPv6 convention gives each user a /64 (room for 2^64 devices) while /128 addresses a single interface. IPv4 intuition does not transfer: IPv4 is allocated on demand, whereas IPv6 is typically handed out in fixed /64 blocks. This allocation granularity is the foundational principle of address planning, because it determines the room left for future subnetting.
Multicast addresses and the zone requirement of ff02::/16
IPv6 multicast is scoped by range: ff01::/16 node-local, ff02::/16 link-local, ff05::/16 site-local and ff0e::/16 global. Link-local multicast addresses such as ff02::2 (all nodes) likewise require a zone index to select the outgoing interface, and fail across interfaces. When configuring mDNS, SSDP or writing multicast probe scripts, omitting %eth0 is the most common mistake.
How This Relates to Neighbours
Looking up address ownership or WHOIS records is an external data query, out of scope here.
Subnetting, CIDR arithmetic and routing configuration belong to network engineering; this page only provides a way to identify address classes.
For port and protocol mappings, use the in-site common ports page — that is a different dimension from address identification.
If the goal is debugging connectivity, first separate DNS resolution failure, wrong address class, and link or scope limits; the class knowledge here narrows the search quickly.
Practical Snippet
Key points: (1) IPv6 address classes are determined by the leading bits — fc00::/7 unique local, fe80::/10 link-local, ff for multicast, 2000::/3 global unicast; (2) fe80::/10 link-local addresses are valid only on the same L2 link and are never forwarded, so writing one into a config as a fixed address fails on a different network, and tests need a zone index such as %eth0; (3) a form like ::ffff:192.168.1.1 is an IPv4-mapped address used for compatibility rather than real IPv6, and dual-stack applications must recognise it; (4) link-local multicast such as ff02::/16 also needs a zone index, and omitting it is the most common mDNS/SSDP mistake; (5) IPv6 typically allocates a fixed /64 per user, and that granularity determines room for later subnetting.
// ① 按前导位判断 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 用)
// 🔴 分配粒度决定后续扩展空间,错了无法回收Practical Notes
- MAC addresses are rewritten across network segmentsA MAC address only means something inside one broadcast domain; each layer-3 hop replaces the source and destination MAC. Never treat a MAC as a cross-network device identifier or as an authorization factor.
- Overlapping private ranges break site-to-site links10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 are reused everywhere, so two organisations connecting over VPN frequently collide. Plan non-overlapping ranges up front, or translate with NAT.
- IPv6 unicast must distinguish link-local from globalfe80::/10 is link-local and carries a zone id such as fe80::1%eth0, so the same address means different things per interface; only 2000::/3 is globally routable. Logging or configuring link-local addresses makes problems untraceable.
Data Sources
- 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)
Codes, names and definitions above come from public specifications; we claim no originality over the specification data itself. The arrangement, Chinese annotations and practical notes on this page are written by us.
Five Identifier Types
| Identifier | Bits | Example | Scope | Assigned By |
|---|---|---|---|---|
| MAC address | 48 | 00:1A:2B:3C:4D:5E | Unique within a single link (layer 2) | Burned in by the NIC vendor; first 24 bits are the OUI |
| Private IPv4 address | 32 | 192.168.1.10 | Inside a LAN; requires NAT to reach the internet | Assigned by an administrator or DHCP |
| Global unicast IPv6 | 128 | 2001:db8::1 | Globally routable public address | Assigned by the ISP or an RIR |
| IPv6 unique local (ULA) | 128 | fd12:3456::1 | Site-internal; must not be routed on the internet | Generated with a random 40-bit global ID |
| IPv6 link-local | 128 | fe80::1 | A single link only; never forwarded by a router | Auto-configured when IPv6 is enabled on the interface |
Common IPv6 Prefix Types
| Prefix | Type | Description |
|---|---|---|
| ::1/128 | Loopback | The host itself, equivalent to IPv4 127.0.0.1 |
| 2000::/3 | Global Unicast | Publicly routable addresses; current allocations fall here |
| fc00::/7 | Unique Local | Site-internal; only those starting with fd are locally generated |
| fe80::/10 | Link-Local | Confined to one link; routers do not forward it |
| ff00::/8 | Multicast | One-to-many delivery; replaces IPv4 broadcast |
| 2002::/16 | 6to4 | Transition mechanism, now largely deprecated |
Frequently Asked Questions
Can a MAC address be used to locate a specific device?
Not across the public internet. A MAC address is only meaningful within a single layer-2 link; once a packet crosses a router the source MAC is rewritten, so outsiders never see your real MAC. All you can do is look up the vendor from the first 24 bits, the OUI — a prefix may belong to a particular phone or router maker. What actually tracks devices across networks are IP addresses, browser fingerprints and account systems. Modern operating systems also randomise MAC addresses when probing Wi-Fi, further weakening MAC-based tracking.
Are IPv6 ULAs the same thing as IPv4 private addresses?
The intent is similar but the details differ considerably. Both are for internal use and neither should be routed publicly. IPv4, however, offers only three fixed blocks — 10/8, 172.16/12 and 192.168/16 — so different organisations inevitably reuse the same addresses and mergers cause conflicts. ULA reserves a 40-bit global ID after the fc00::/7 prefix, and the standard requires it to be generated randomly, so collisions between organisations are vanishingly unlikely and merging networks rarely requires renumbering. In practice many networks run ULA alongside global unicast: ULA keeps internal communication always reachable, global unicast handles the outside world.
Why do IPv6 addresses start with fd rather than fc?
The fc00::/7 prefix is effectively split in two: fc00::/8 is reserved for future central allocation, while fd00::/8 is for locally generated addresses. RFC 4193 requires locally generated ULAs to set the eighth bit, the L bit, to 1, which means the prefix must begin with fd. Addresses produced by a local tool therefore always start with fd; an fc prefix is either reserved or a misconfiguration.
Why does IPv6 have no broadcast address?
IPv6 dropped broadcast in favour of multicast and anycast. Broadcast disturbs every host on the segment, and each one must interrupt what it is doing to process the packet, which is wasteful on large networks. Multicast is delivered only to hosts that joined the relevant group, leaving everyone else untouched. Address resolution, which relied on broadcast in IPv4, is handled in IPv6 by the Neighbour Discovery Protocol using ICMPv6 multicast. That is why you will never see an equivalent of 255.255.255.255 in IPv6.