IPv6 in the Wild: A Field Reference
Audience: on-call engineers, SOC analysts, network operators, and FinOps practitioners who need to parse and classify an IPv6 address at speed — from a log line, a firewall rule, a cloud console, or a ticket — without reading the full protocol specification. Assumes basic IPv4 fluency. If you want the ground-up protocol tour, start with Designing the Next Internet: An Introduction to IPv6.
Last updated: April 2026
Table of Contents
- Introduction
- The Four-Bit Decoder
- One Hex Character, Four Bits
- Expanding a Compressed Address
- The Prefix-Spotting Matrix
- Three Walk-Throughs
- Where This Fits in the Knowledge Base
- References
1. Introduction
Most IPv6 writing is aimed at the engineer designing a network: address planning, scopes, SLAAC, routing. The majority of the time, though, IPv6 reaches an engineer through a very different channel — a log line in an incident, a source address in a firewall denial, a billing row in a cloud console, a row in a ticket queue. The question in that moment is not "how should I design this?" It is "what am I looking at?"
This article is a field reference for that moment. The goal is to move from a raw address like
fe80::1a2b:3cff:fed4:5566
to a confident classification — link-local, stays on this switch, never routed — in under thirty seconds, without reaching for a manual. The three skills you need are decoding a hex character to binary, expanding the compressed notation, and classifying the address by its leading bits. Everything else can wait until you are back at a whiteboard.
If you are entirely new to IPv6, the companion article Designing the Next Internet: An Introduction to IPv6 covers the same ground from first principles and explains why the protocol is shaped this way. This article is the cheat sheet you tab to when the pager goes off.
2. The Four-Bit Decoder
Every hexadecimal character in an IPv6 address is four binary bits. The position values are fixed and double from right to left:
| Position | 4 | 3 | 2 | 1 |
|---|---|---|---|---|
| Place value | 8 | 4 | 2 | 1 |
| Switch state | on/off | on/off | on/off | on/off |
A hex character is the sum of the place values whose switches are on. The binary encoding is the on/off pattern read left-to-right. Four switches, sixteen combinations, one character each. That is the entire mapping:
flowchart LR
subgraph s["Four binary switches → one hex character"]
direction LR
P8["8"]
P4["4"]
P2["2"]
P1["1"]
end
P8 --> Sum["sum of on switches"]
P4 --> Sum
P2 --> Sum
P1 --> Sum
Sum --> Char["hex character 0–F"]
The useful property: because each hex character occupies exactly four bits, you can
decode a character in isolation without tracking carries across the address. A
firewall rule restricting traffic to fd00::/8 depends only on the first two hex
characters; you can verify compliance by eye.
3. One Hex Character, Four Bits
To decode a hex character into binary, find the largest place value that fits the
target, subtract, and repeat until nothing is left. For D (decimal 13):
| Step | Remaining | Switch | Action | Contribution |
|---|---|---|---|---|
| 1 | 13 | 8 |
on — fits | 8 |
| 2 | 5 | 4 |
on — fits | 4 |
| 3 | 1 | 2 |
off — would exceed | 0 |
| 4 | 1 | 1 |
on — fits | 1 |
Summing: 8 + 4 + 0 + 1 = 13, and reading the switch column top-to-bottom gives
D = 1101. The reverse direction works the same way — given 1011, add the place
values of the on switches (8 + 0 + 2 + 1 = 11) to recover B.
The full table, committed to memory, removes the arithmetic entirely:
| Dec | Hex | Binary | Dec | Hex | Binary | |
|---|---|---|---|---|---|---|
| 0 | 0 |
0000 |
8 | 8 |
1000 |
|
| 1 | 1 |
0001 |
9 | 9 |
1001 |
|
| 2 | 2 |
0010 |
10 | A |
1010 |
|
| 3 | 3 |
0011 |
11 | B |
1011 |
|
| 4 | 4 |
0100 |
12 | C |
1100 |
|
| 5 | 5 |
0101 |
13 | D |
1101 |
|
| 6 | 6 |
0110 |
14 | E |
1110 |
|
| 7 | 7 |
0111 |
15 | F |
1111 |
In practice you rarely need to drop to binary for a whole address. You drop to
binary when a prefix length falls mid-nibble — a /52 or a /60 — and you need to
see which bit of which character is a network bit. The
address-planning guide
covers the mid-nibble case in full; for field work, the classification in
§5 is almost always enough.
4. Expanding a Compressed Address
Addresses in the wild are almost always compressed. Two rules apply, and reversing them is deterministic.
Rule 1. Leading zeros within any hextet are dropped. 2001:0db8:0000:0000:0000:0000:0000:0001 becomes 2001:db8:0:0:0:0:0:1.
Rule 2. A single run of all-zero hextets may be replaced with ::. The double
colon appears at most once in any address; two would create an unresolvable
ambiguity about how many zero hextets each one represents. 2001:db8:0:0:0:0:0:1
becomes 2001:db8::1.
To expand a compressed address to its full 128-bit form, three steps:
- Count the visible hextets. The ones you can see.
- Pad each visible hextet to four hex characters. Leading zeros, not trailing.
- Inflate the
::. Insert(8 − visible)zero hextets at the::marker.
Worked example — expanding fe80::1a2b:3cff:fed4:5566:
| Step | Detail | Result |
|---|---|---|
| 1. Visible hextets | fe80, 1a2b, 3cff, fed4, 5566 |
5 visible |
| 2. Pad leading zeros | Each hextet already four characters | — |
3. Inflate :: |
8 − 5 = 3 zero hextets at :: |
fe80:0000:0000:0000:1a2b:3cff:fed4:5566 |
The process is deterministic because :: is unique. An address with only a :: —
::1, ::, fe80:: — collapses or expands the same way.
5. The Prefix-Spotting Matrix
The single most useful table in IPv6 operations. Read the first one or two hex characters of an address and the category is fixed:
| Address Type | Starts With | Prefix | Primary Function |
|---|---|---|---|
| Global Unicast | 2 or 3 |
2000::/3 |
Public Internet routing. This is an isp6 allocation when you hold one. |
| Anycast | 2 or 3 |
2000::/3 |
Indistinguishable from Global Unicast by bits alone — assigned to multiple devices; the network routes to the nearest. |
| Unique Local | fc or fd |
fc00::/7 |
Intra-organisation only. Not routed on the public Internet. |
| Link-Local | fe8, fe9, fea, feb |
fe80::/10 |
Same-link only. Required on every active interface. Used by Neighbor Discovery and SLAAC. |
| Multicast | ff |
ff00::/8 |
One-to-group delivery. Replaces IPv4 broadcast. |
| Unspecified | — | ::/128 |
No address yet — used as source during DAD. |
| Loopback | — | ::1/128 |
Local machine only. Replaces 127.0.0.1. |
Two sharp edges worth internalising:
- Anycast has no distinguishing prefix. You cannot tell from the address alone that it is anycast; you need routing context.
- ULA is not a private Global Unicast. It is its own scope, and on a dual-stack
host RFC 6724 deprioritises it
below IPv4. Seeing
fc00::/7in a destination address is a useful signal that the traffic was never supposed to leave the organisation.
The legacy Site-Local scope (fec0::/10) was deprecated by
RFC 3879 and should not appear on a
modern network. If you see it, the device is either very old or misconfigured.
6. Three Walk-Throughs
6.1 fe80::1a2b:3cff:fed4:5566
- Starts with
fe8→ Link-Local (fe80::/10). - Interpretation. Traffic on the local link only. A router will not forward it.
The
ff:fein the middle of the Interface ID is the EUI-64 signature — this address was auto-generated from a MAC rather than assigned by Privacy Extensions. - Action in an incident. If this shows up as a source in an external firewall log, something is wrong with the device or the logging pipeline. Link-Local traffic cannot cross a router.
6.2 2001:db8:a1b2:c3d4::42
- Starts with
2→ Global Unicast (2000::/3). - Expand. Five visible hextets → three zero hextets at
::→2001:0db8:a1b2:c3d4:0000:0000:0000:0042. - The
/64split. Network prefix2001:db8:a1b2:c3d4::/64, Interface ID::42. - Interpretation. Publicly routable. Global Unicast is the address type isp6 provisions for its members — a /48 or /44 drawn from isp6's RIPE pool, registered in the RIPE Database, and portable across any network you announce it from.
- A caveat on this specific block.
2001:db8::/32is the RFC 3849 documentation prefix. Seeing it in a production log means either documentation has leaked into runtime or someone is running deliberate test traffic — it is never a real customer.
6.3 ff02::1:ff00:42
- Starts with
ff→ Multicast (ff00::/8). - The second character —
02— is the multicast scope: link-local. - The
ffnibble inside the address is the Solicited-Node multicast signature:ff02::1:ffXX:XXXX, where the last 24 bits come from the target unicast address. - Interpretation. A host is performing Neighbor Discovery or Duplicate Address
Detection for a target whose low-order 24 bits are
00:00:42. This is SLAAC working as designed. See §9 of the introduction for the full bootstrap.
7. Further Reading
- Protocol fundamentals. Designing the Next Internet: An Introduction to IPv6 — the ground-up tour: address anatomy, scopes, SLAAC, Neighbor Discovery, minimal router configuration.
- Designing an allocation. Planning Your isp6 Allocation — the estimate / procure / implement arc, the nibble discipline, bisection, and hardening point-to-point links and loopbacks.
- IPv4 reflexes that break IPv6. Stop Thinking in IPv4: Misconceptions That Sabotage Your IPv6 Deployment — the six habits to unlearn, including the ICMPv6 allow-list you will need before any SLAAC traffic flows.
- Bringing your isp6 allocation to a cloud. AWS · Azure · Google Cloud.
8. References
| RFC | Title | Relevance |
|---|---|---|
| RFC 4291 | IP Version 6 Addressing Architecture | Address format, prefixes, scopes |
| RFC 5952 | A Recommendation for IPv6 Address Text Representation | Canonical compression rules used by every parser |
| RFC 4193 | Unique Local IPv6 Unicast Addresses | Defines fc00::/7 |
| RFC 3879 | Deprecating Site Local Addresses | Why fec0::/10 should not appear on a modern network |
| RFC 3849 | IPv6 Address Prefix Reserved for Documentation | 2001:db8::/32 |
| RFC 6724 | Default Address Selection for IPv6 | Why ULA is deprioritised below IPv4 on dual-stack hosts |
| RFC 4861 | Neighbor Discovery for IPv6 | Solicited-Node multicast and the ff02::1:ffXX:XXXX pattern |
This document is provided for informational purposes. Protocol specifications and cloud provider behaviour are subject to change. Consult the linked RFCs and vendor documentation for authoritative, up-to-date information before making architectural decisions.