Mental model
IPv4 has ~4 billion addresses, which is much less than the number of devices that want to be online. IPv6 has 128 bits of address space — 340 undecillion addresses (3.4 × 10³⁸). For practical purposes, infinite.
The pain: 128-bit addresses are unreadable in binary or decimal. IPv6 uses hex notation in 8 groups of 4 digits, separated by colons:
2001:0db8:acad:0001:0000:0000:0000:0005
That’s a lot to type. Two shortcuts make it bearable:
- Drop leading zeros within a group:
0db8→db8,0001→1. - One
::per address collapses a run of zero groups:0000:0000:0000:0005→::5.
Final compressed form:
2001:db8:acad:1::5
The standard split: /64 prefix + /64 interface ID
By convention (and protocol requirement for SLAAC), every IPv6 subnet is /64:
- First 64 bits = network prefix
- Last 64 bits = host (interface ID)
That gives every subnet 2⁶⁴ ≈ 18 quintillion hosts — wildly excessive, by design. The math is simple. Don’t overthink it.
Three address types you need to know
| Type | Range | Purpose |
|---|---|---|
| Global Unicast | 2000::/3 (mostly 2001::/16) | Routable on the public internet. Like IPv4 public. |
| Link-Local | fe80::/10 | Only valid on a single link. Auto-assigned. Every IPv6 interface has one. |
| Unique Local (ULA) | fc00::/7 | Internal use, not routed on the public internet. Like IPv4 private (RFC 1918). |
| Multicast | ff00::/8 | Groups. IPv6 has no broadcast — multicast replaces it. |
| Loopback | ::1/128 | localhost. Same role as 127.0.0.1. |
| Unspecified | ::/128 | ”I don’t have an address yet.” Like 0.0.0.0. |
For CCNA: focus on Global Unicast, Link-Local, and Multicast. ULA is the IPv6 RFC 1918 equivalent — not used as widely as you’d expect.
Link-Local — the address every IPv6 interface auto-gets
Every IPv6 interface generates a link-local address as soon as it comes up — without configuration. Format: fe80:: + a 64-bit interface identifier (often derived from the MAC).
It’s only valid on the local link (one switch / one cable). Routers don’t forward link-local traffic between subnets.
Why it matters: routing protocols (OSPFv3, EIGRPv6) and Neighbor Discovery use link-local addresses for peering — not the global ones. This trips up engineers who configure global IPv6 but forget link-local will be present too.
SLAAC — hosts pick their own address
In IPv4, hosts almost always get their IP from DHCP. In IPv6, there’s a built-in alternative: SLAAC (Stateless Address Autoconfiguration).
How it works:
- Router periodically advertises the /64 prefix on the link.
- Host hears it, takes the prefix, and generates its own /64 interface ID (random or based on MAC).
- Host checks no one else is using that full address (Duplicate Address Detection).
- Done — host has a unique IPv6, no DHCP server involved.
SLAAC doesn’t hand out DNS or domain info. For that, you either use DHCPv6 in parallel or rely on RDNSS options in Router Advertisements.
Commands
Enable IPv6 + assign addresses
R1(config)# ipv6 unicast-routing ! enable IPv6 globally
R1(config)# interface GigabitEthernet0/0
R1(config-if)# ipv6 address 2001:db8:acad:1::1/64 ! global unicast
R1(config-if)# ipv6 address autoconfig ! or let SLAAC do it
R1(config-if)# ipv6 enable ! creates link-local even without a global
Verify
R1# show ipv6 interface brief
R1# show ipv6 interface GigabitEthernet0/0
R1# show ipv6 neighbors ! IPv6 equivalent of ARP table
R1# show ipv6 route
Common mistakes
-
Forgetting
ipv6 unicast-routing. Without it, the router has IPv6 addresses but won’t route between them. Always enable globally. -
Using
::twice in one address. RFC says one::per address only.2001::1::5is ambiguous (couldn’t tell how many zero groups each side has). -
Confusing IPv6 link-local with IPv4 APIPA. APIPA (169.254.x.x) means “DHCP failed, here’s a self-assigned address.” IPv6 link-local (fe80::/10) is always present, always valid, and used by routing protocols. Different beasts.
-
Treating IPv6 like a larger IPv4. Some IPv4 reflexes don’t apply. There’s no broadcast in IPv6 (use multicast). There’s no NAT in standard IPv6 (every device has a globally unique address). ARP is replaced by Neighbor Discovery.
-
Forgetting that 2001:db8::/32 is reserved for documentation. Never use it in production — it’s the equivalent of 192.0.2.0/24 in examples. Picking it for a real network → public internet doesn’t route it.
-
Skipping IPv6 because “we’re not there yet.” Most cellular networks are IPv6-primary today. Major cloud providers, content delivery networks, and ISP backbones run IPv6 heavily. CCNA tests IPv6; production runs it. Time to learn.
Lab to try tonight
- Take any IPv6 address in long form. Practice compressing it to short form by hand. Verify with a calculator.
- On a router, enable
ipv6 unicast-routing. Configureipv6 address 2001:db8:acad:1::1/64on an interface. Confirm withshow ipv6 interface brief. - Connect a PC. Set it to “Auto” for IPv6. Observe it pick up an address via SLAAC.
- Run
ping 2001:db8:acad:1::1from the PC. Verify reachability. show ipv6 neighborson the router — should show the PC’s MAC and IPv6.- Bonus: configure OSPFv3 between two routers on a /64 link. Note that neighbor adjacencies form using link-local (fe80::) addresses, not the global ones you configured.
Cheat strip
| Concept | Plain English |
|---|---|
| 128 bits | 8 hex groups, 4 digits each |
| :: | Collapse one run of all-zero groups. Once per address. |
| /64 | Standard subnet prefix length |
| Global Unicast | 2000::/3 — routable, like IPv4 public |
| Link-Local | fe80::/10 — local-link only, always present |
| Multicast | ff00::/8 — groups. Replaces IPv4 broadcast. |
| SLAAC | Hosts auto-generate IPv6 from router advertisements |
ipv6 unicast-routing | Must be on for the router to forward IPv6 |
| 2001:db8::/32 | Reserved for examples / documentation. Never production. |