Inspired by xkcd's version. Data provided by IANA.
Address space represented along an Hilbert Curve, using the hilbert-chart D3 component.
See also the IPv4 version or the AS numbers version.
| license: mit |
Inspired by xkcd's version. Data provided by IANA.
Address space represented along an Hilbert Curve, using the hilbert-chart D3 component.
See also the IPv4 version or the AS numbers version.
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Hilbert IPv6 Address Map</title> | |
| <script src="//cdnjs.cloudflare.com/ajax/libs/d3/4.2.0/d3.min.js"></script> | |
| <script src="//unpkg.com/[email protected]"></script> | |
| <script src="//unpkg.com/hilbert-chart"></script> | |
| <style> | |
| body { | |
| margin: 0; | |
| text-align: center; | |
| } | |
| #ipv6-chart { display: inline-block; } | |
| .info-note { | |
| font-size: 11px; | |
| font-family: Sans-serif; | |
| opacity: 0.5; | |
| position: absolute; | |
| bottom: 10px; | |
| left: 50%; | |
| transform: translate(-50%); | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="ipv6-chart"></div> | |
| <div class="info-note">(use mouse-wheel/drag to zoom/pan)</div> | |
| <script> | |
| document.addEventListener("DOMContentLoaded", function() { | |
| // Get the whole IPv6 data | |
| d3.csv('./ipv6-address-space.csv', function(globalData) { | |
| // Get the IPv6 unicast data | |
| d3.csv('./ipv6-unicast.csv', function(unicastData) { | |
| data = globalData.concat(unicastData); | |
| data.forEach(function(row) { | |
| // Downsize to 32 bit space to prevent overflow | |
| row.prefix = shiftPrefix(new Ip.Prefix(row.Prefix || row['IPv6 Prefix']), -96).toString(); | |
| row.name = row.Designation || row.Allocation; | |
| }); | |
| HilbertChart() | |
| .hilbertOrder(32 / 2) | |
| .data(parseIpData(data)) | |
| .rangePadding(0.03) | |
| .valFormatter(ipFormatter) | |
| .rangeTooltipContent(d => `<b>${d.name}</b>: ${prefixFormatter(d)}`) | |
| (document.getElementById("ipv6-chart")); | |
| }); | |
| }); | |
| }); | |
| // | |
| function parseIpData(ipData) { | |
| var prefixes = [], | |
| ignoreNames = ['global unicast']; | |
| ipData.map(function(row) { | |
| var pref = new Ip.Prefix(row.prefix); | |
| return { | |
| start: pref.firstIp().toNum(), | |
| length: Math.max(1, Math.pow(2, 128 - pref.cidr)), | |
| name: getName(row.name), | |
| infos: [row] | |
| }; | |
| }).filter(function(prefix) { | |
| // Remove unicast placeholder | |
| return ignoreNames.indexOf(prefix.name.toLowerCase()) === -1; | |
| }).forEach(function(prefix) { | |
| var last; | |
| if (prefixes.length | |
| && (last = prefixes[prefixes.length - 1]) | |
| && last.name === prefix.name | |
| && (last.start + last.length === prefix.start)) { | |
| last.length += prefix.length; | |
| last.infos.push(prefix.infos[0]); | |
| } else { | |
| prefixes.push(prefix); | |
| } | |
| }); | |
| return prefixes; | |
| // | |
| function getName(designation) { | |
| var name = designation; | |
| if (name.indexOf('Administered by') > -1) { | |
| name = "Various Registries"; | |
| } | |
| return name; | |
| } | |
| } | |
| function ipFormatter(d) { | |
| return shiftIp(new Ip.Addr(d), 96).toString(); | |
| } | |
| function prefixFormatter(d) { | |
| var ipRange = new Ip.Range(d.start, d.start + d.length - 1), | |
| prefixes = ipRange.toPrefixes(); | |
| if (ipRange.isIPv4()) { | |
| // Move CIDR to v6 range for low number prefixes | |
| prefixes[0].cidr += 96; | |
| } | |
| return (prefixes.length===1 | |
| ? shiftPrefix(prefixes[0], 96) | |
| : shiftRange(ipRange, 96) | |
| ).toString(); | |
| } | |
| // bits: positive shifts up, negative shifts down | |
| function shiftIp(ip, bits) { | |
| var bin = ip.toBin(); | |
| if (bits < 0) { | |
| bin = bin.slice(0, bin.length + bits); | |
| if (!bin.length) bin = '0'; | |
| } else { | |
| for (;bits;bits--) { bin += '0'; } | |
| } | |
| return new Ip.Addr(parseInt(bin, 2)); | |
| } | |
| function shiftPrefix(pref, bits) { | |
| return new Ip.Prefix(shiftIp(pref.firstIp(), bits), pref.cidr - bits); | |
| } | |
| function shiftRange(pref, bits) { | |
| return new Ip.Range(shiftIp(pref.firstIp(), bits), shiftIp(pref.lastIp(), bits)); | |
| } | |
| </script> | |
| </body> | |
| </html> |
| IPv6 Prefix | Allocation | Reference | Notes | |
|---|---|---|---|---|
| 0000::/8 | Reserved by IETF | [RFC4291] | [1] [2] [3] [4] [5] | |
| 0100::/8 | Reserved by IETF | [RFC4291] | 0100::/64 reserved for Discard-Only Address Block [RFC6666]. Complete registration details are found in [IANA registry iana-ipv6-special-registry]. | |
| 0200::/7 | Reserved by IETF | [RFC4048] | Deprecated as of December 2004 [RFC4048]. Formerly an OSI NSAP-mapped prefix set [RFC4548]. | |
| 0400::/6 | Reserved by IETF | [RFC4291] | ||
| 0800::/5 | Reserved by IETF | [RFC4291] | ||
| 1000::/4 | Reserved by IETF | [RFC4291] | ||
| 2000::/3 | Global Unicast | [RFC4291] | The IPv6 Unicast space encompasses the entire IPv6 address range with the exception of ff00::/8, per [RFC4291]. IANA unicast address assignments are currently limited to the IPv6 unicast address range of 2000::/3. IANA assignments from this block are registered in [IANA registry ipv6-unicast-address-assignments]. [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] | |
| 4000::/3 | Reserved by IETF | [RFC4291] | ||
| 6000::/3 | Reserved by IETF | [RFC4291] | ||
| 8000::/3 | Reserved by IETF | [RFC4291] | ||
| a000::/3 | Reserved by IETF | [RFC4291] | ||
| c000::/3 | Reserved by IETF | [RFC4291] | ||
| e000::/4 | Reserved by IETF | [RFC4291] | ||
| f000::/5 | Reserved by IETF | [RFC4291] | ||
| f800::/6 | Reserved by IETF | [RFC4291] | ||
| fc00::/7 | Unique Local Unicast | [RFC4193] | For complete registration details, see [IANA registry iana-ipv6-special-registry]. | |
| fe00::/9 | Reserved by IETF | [RFC4291] | ||
| fe80::/10 | Link-Scoped Unicast | [RFC4291] | Reserved by protocol. For authoritative registration, see [IANA registry iana-ipv6-special-registry]. | |
| fec0::/10 | Reserved by IETF | [RFC3879] | Deprecated by [RFC3879] in September 2004. Formerly a Site-Local scoped address prefix. | |
| ff00::/8 | Multicast | [RFC4291] | IANA assignments from this block are registered in [IANA registry ipv6-multicast-addresses]. |
| Prefix | Designation | Date | WHOIS | RDAP | Status | Note | |
|---|---|---|---|---|---|---|---|
| 2001:0000::/23 | IANA | 1999-07-01 | whois.iana.org | ALLOCATED | 2001:0000::/23 is reserved for IETF Protocol Assignments [RFC2928]. 2001:0000::/32 is reserved for TEREDO [RFC4380]. 2001:1::1/128 is reserved for Port Control Protocol Anycast [RFC7723]. 2001:2::/48 is reserved for Benchmarking [RFC5180]. 2001:3::/32 is reserved for AMT [RFC7450]. 2001:4:112::/48 is reserved for AS112-v6 [RFC7535]. 2001:5::/32 is reserved for EID Space for LISP [draft-ietf-lisp-eid-block]. 2001:10::/28 is deprecated (previously ORCHID) [RFC4843]. 2001:20::/28 is reserved for ORCHIDv2 [RFC7343]. 2001:db8::/32 is reserved for Documentation [RFC3849]. For complete registration details, see [IANA registry iana-ipv6-special-registry]. | ||
| 2001:0200::/23 | APNIC | 1999-07-01 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2001:0400::/23 | ARIN | 1999-07-01 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | ||
| 2001:0600::/23 | RIPE NCC | 1999-07-01 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:0800::/23 | RIPE NCC | 2002-05-02 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:0a00::/23 | RIPE NCC | 2002-11-02 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:0c00::/23 | APNIC | 2002-05-02 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | 2001:db8::/32 reserved for Documentation [RFC3849]. For complete registration details, see [IANA registry iana-ipv6-special-registry]. | |
| 2001:0e00::/23 | APNIC | 2003-01-01 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2001:1200::/23 | LACNIC | 2002-11-01 | whois.lacnic.net | https://rdap.lacnic.net/rdap/ | ALLOCATED | ||
| 2001:1400::/23 | RIPE NCC | 2003-02-01 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:1600::/23 | RIPE NCC | 2003-07-01 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:1800::/23 | ARIN | 2003-04-01 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | ||
| 2001:1a00::/23 | RIPE NCC | 2004-01-01 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:1c00::/22 | RIPE NCC | 2004-05-04 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:2000::/20 | RIPE NCC | 2004-05-04 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:3000::/21 | RIPE NCC | 2004-05-04 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:3800::/22 | RIPE NCC | 2004-05-04 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:3c00::/22 | IANA | RESERVED | 2001:3c00::/22 is reserved for possible future allocation to the RIPE NCC. | ||||
| 2001:4000::/23 | RIPE NCC | 2004-06-11 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:4200::/23 | AFRINIC | 2004-06-01 | whois.afrinic.net | https://rdap.afrinic.net/rdap/http://rdap.afrinic.net/rdap/ | ALLOCATED | ||
| 2001:4400::/23 | APNIC | 2004-06-11 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2001:4600::/23 | RIPE NCC | 2004-08-17 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:4800::/23 | ARIN | 2004-08-24 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | ||
| 2001:4a00::/23 | RIPE NCC | 2004-10-15 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:4c00::/23 | RIPE NCC | 2004-12-17 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:5000::/20 | RIPE NCC | 2004-09-10 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2001:8000::/19 | APNIC | 2004-11-30 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2001:a000::/20 | APNIC | 2004-11-30 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2001:b000::/20 | APNIC | 2006-03-08 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | ||
| 2002:0000::/16 | 6to4 | 2001-02-01 | ALLOCATED | 2002::/16 is reserved for 6to4 [RFC3056]. For complete registration details, see [IANA registry iana-ipv6-special-registry]. | |||
| 2003:0000::/18 | RIPE NCC | 2005-01-12 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | ||
| 2400:0000::/12 | APNIC | 2006-10-03 | whois.apnic.net | https://rdap.apnic.net/ | ALLOCATED | 2400:0000::/19 was allocated on 2005-05-20. 2400:2000::/19 was allocated on 2005-07-08. 2400:4000::/21 was allocated on 2005-08-08. 2404:0000::/23 was allocated on 2006-01-19. The more recent allocation (2006-10-03) incorporates all these previous allocations. | |
| 2600:0000::/12 | ARIN | 2006-10-03 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | 2600:0000::/22, 2604:0000::/22, 2608:0000::/22 and 260c:0000::/22 were allocated on 2005-04-19. The more recent allocation (2006-10-03) incorporates all these previous allocations. | |
| 2610:0000::/23 | ARIN | 2005-11-17 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | ||
| 2620:0000::/23 | ARIN | 2006-09-12 | whois.arin.net | https://rdap.arin.net/registryhttp://rdap.arin.net/registry | ALLOCATED | ||
| 2800:0000::/12 | LACNIC | 2006-10-03 | whois.lacnic.net | https://rdap.lacnic.net/rdap/ | ALLOCATED | 2800:0000::/23 was allocated on 2005-11-17. The more recent allocation (2006-10-03) incorporates the previous allocation. | |
| 2a00:0000::/12 | RIPE NCC | 2006-10-03 | whois.ripe.net | https://rdap.db.ripe.net/ | ALLOCATED | 2a00:0000::/21 was originally allocated on 2005-04-19. 2a01:0000::/23 was allocated on 2005-07-14. 2a01:0000::/16 (incorporating the 2a01:0000::/23) was allocated on 2005-12-15. The more recent allocation (2006-10-03) incorporates these previous allocations. | |
| 2c00:0000::/12 | AFRINIC | 2006-10-03 | whois.afrinic.net | https://rdap.afrinic.net/rdap/http://rdap.afrinic.net/rdap/ | ALLOCATED | ||
| 2d00:0000::/8 | IANA | 1999-07-01 | RESERVED | ||||
| 2e00:0000::/7 | IANA | 1999-07-01 | RESERVED | ||||
| 3000:0000::/4 | IANA | 1999-07-01 | RESERVED | ||||
| 3ffe::/16 | IANA | 2008-04 | RESERVED | 3ffe:831f::/32 was used for Teredo in some old but widely distributed networking stacks. This usage is deprecated in favor of 2001::/32, which was allocated for the purpose in [RFC4380]. 3ffe::/16 and 5f00::/8 were used for the 6bone but were returned. [RFC5156] | |||
| 5f00::/8 | IANA | 2008-04 | RESERVED | 3ffe::/16 and 5f00::/8 were used for the 6bone but were returned. [RFC5156] |