1 Summary Statistics
Of the 100,000 hosts surveyed, 36,864 (36.9%) were fully reachable over IPv6, meaning they had a AAAA DNS record and responded to an HTTPS request issued over an IPv6 connection. A further 1,212 hosts (1.2%) published AAAA records but failed reachability checks, likely due to misconfiguration or firewall policy. The remaining 61,924 hosts (61.9%) had no AAAA record at all. Common barriers to enabling IPv6 include the cost of upgrading legacy network hardware and software, the complexity of running a dual-stack environment, a lack of perceived urgency while IPv4 still works (often extended by carrier-grade NAT), and insufficient IPv6 expertise within operations teams.
(36,864 hosts)
(1,212 hosts)
(61,924 hosts)
Hosts that publish a AAAA record but fail reachability checks are rare: 96.8% of hosts with a AAAA record responded successfully to an IPv6 probe. Operators who have deployed IPv6 DNS appear to have generally completed the rest of the stack.
2 Adoption by Rank Bracket
IPv6 adoption correlates with harmonic centrality rank. Hosts at the top of the link graph are more likely to support IPv6 than those in the long tail. The pattern probably reflects the operational maturity of larger operators, and the fact that major CDN providers have offered IPv6 by default for several years.
Adoption does not decline smoothly. Around ranks 2,500–10,000 it holds at 46–50% before dropping again in the deeper tail. A likely contributor is Cloudflare, which enables IPv6 by default on all hosted domains. A concentration of Cloudflare-hosted properties in this rank band would push the measured rate up regardless of whether operators have done anything deliberate.
These results also matter for connection performance. Modern clients implement the Happy Eyeballs algorithm (RFC 8305, building on RFC 6555), which races an IPv6 connection attempt against a slightly delayed IPv4 fallback. Users with dual-stack connectivity will prefer IPv6 automatically, without waiting for a timeout if IPv6 is unavailable. In practice, Happy Eyeballs makes the difference between "has a AAAA record" and "is reachable over IPv6" critical: a host that publishes a AAAA record but has a broken IPv6 path imposes a ~250 ms penalty on every new connection while the client falls back to IPv4. The 1.2% of hosts in our survey that have AAAA records but failed reachability checks are actively harming connection latency for dual-stack users. Conversely, hosts that are fully reachable over IPv6 give dual-stack clients a faster path; Happy Eyeballs will select the IPv6 route when it wins the race, avoiding the overhead of a stalled connection.
3 Notable Hosts
Among the 100 highest-ranked hosts by harmonic centrality, 29 have no IPv6 reachability. Several are household names.
- #1www.facebook.com
- #2fonts.googleapis.com
- #3www.google.com
- #4www.googletagmanager.com
- #5www.youtube.com
- #6www.instagram.com
- #8www.linkedin.com
- #9fonts.gstatic.com
- #11play.google.com
- #18en.wikipedia.org
- #7twitter.com
- #10gmpg.org
- #14x.com
- #19github.com
- #25bit.ly
- #31www.tiktok.com
- #41vimeo.com
- #58www.reddit.com
- #81web.archive.org
- #82openai.com
Both twitter.com (rank 7) and x.com (rank 14) have no IPv6,
nor does www.twitter.com at rank 33. github.com at rank 19
is also without IPv6, as are web.archive.org at rank 81 and
openai.com at rank 82.
4 Top 1,000 Hosts
The table below shows the top 1,000 hosts by harmonic centrality with their IPv6 status. Use the search and filter controls to explore the data.
| HCRank | Host | IPv6 status |
|---|
5 Methodology
Data source
Host rankings are from the Common Crawl Web Graph release cc-main-2025-26-dec-jan-feb, a hyperlink graph built from three constituent crawls: CC-MAIN-2025-51 (December 2025, 4–17 Dec), CC-MAIN-2026-04 (January 2026, 12–25 Jan), and CC-MAIN-2026-08 (February 2026, 6–19 Feb). Further statistics for this and other Web Graph releases are available at the cc-webgraph-statistics project. The host-level ranks file provides harmonic centrality scores for each host. Harmonic centrality measures the average inverse shortest-path distance from all other nodes, reflecting how quickly a host can be reached from anywhere in the link graph. It handles disconnected components better than closeness centrality and correlates reasonably well with general web prominence.
The ranks file is pre-sorted by harmonic centrality descending, allowing the top N hosts to be extracted by streaming the first N rows. The compressed file is approximately 5 GiB; streaming avoids a full download.
# Stream the top N hosts from the compressed ranks file.
# The file is ~5 GiB; we close the connection after N rows.
# Columns are tab-separated: rank, centrality, pr_pos, pr_val, host_rev
def fetch_top_hosts(n: int) -> list[str]:
req = urllib.request.Request(RANKS_URL,
headers={"User-Agent": "CCF-ipv6-survey/1.0"})
with urllib.request.urlopen(req) as resp:
with gzip.GzipFile(fileobj=resp) as gz:
for raw_line in gz:
line = raw_line.decode("utf-8").rstrip("\n")
parts = line.split("\t")
host_rev = parts[4].strip() # e.g. com.facebook.www
hosts.append(unreverse(host_rev))
if len(hosts) >= n:
break # connection closes here
return hosts
IPv6 measurement
Each host was assessed in two stages. First, a DNS AAAA query was issued using dig +short AAAA.
A response containing one or more IPv6 addresses indicates the operator has published IPv6 DNS records.
This stage requires no IPv6 connectivity on the measurement host.
# Stage 1: DNS AAAA lookup via asyncio subprocess
# Returns a list of IPv6 addresses; empty means no AAAA record.
async def check_aaaa(host: str, sem: asyncio.Semaphore) -> list[str]:
async with sem:
proc = await asyncio.create_subprocess_exec(
"dig", "+short", "+time=3", "+tries=2", "AAAA", host,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.DEVNULL,
)
stdout, _ = await proc.communicate()
lines = stdout.decode(errors="replace").splitlines()
return [l.strip() for l in lines if ":" in l.strip()]
Hosts with a AAAA record were then probed for reachability: a curl -6 --head HTTPS
request was issued with a 10-second timeout, following up to three redirects. Any HTTP response,
including client and server errors, was recorded as reachable, since a response demonstrates
end-to-end IPv6 connectivity. Connection failures and timeouts were recorded as unreachable.
Probes were issued from a host with native IPv6 connectivity located in northwestern Santa Clara County, California.
# Stage 2: IPv6 reachability probe via curl -6
# Any HTTP response (including 4xx/5xx) counts as reachable;
# only connection failures and timeouts are negative.
async def check_curl6(host: str, sem: asyncio.Semaphore, timeout: int = 10):
async with sem:
proc = await asyncio.create_subprocess_exec(
"curl",
"-6", # force IPv6
"--max-time", str(timeout),
"--head", # HEAD request only
"--silent",
"--output", "/dev/null",
"--write-out", "%{http_code}",
"--location", # follow redirects
"--max-redirs", "3",
f"https://{host}",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.DEVNULL,
)
stdout, _ = await proc.communicate()
code = int(stdout.decode().strip())
return code > 0, code
DNS lookups ran at up to 100 concurrent tasks; curl probes at up to 50 concurrent, to
limit load on both the measurement host and individual targets. Concurrency was managed
with asyncio.Semaphore:
# Concurrency: asyncio.Semaphore limits parallel subprocesses.
# DNS lookups run 100-wide; curl probes run 50-wide.
dns_sem = asyncio.Semaphore(100) # max concurrent DNS lookups
curl_sem = asyncio.Semaphore(50) # max concurrent curl probes
# Phase 1: launch all DNS tasks (semaphore throttles internally)
dns_tasks = [
asyncio.create_task(check_aaaa(h, dns_sem))
for h in hosts
]
# Phase 2: probe only hosts that have AAAA records
aaaa_hosts = [h for h in hosts if dns_results[h]]
curl_tasks = [
asyncio.create_task(check_curl6(h, curl_sem))
for h in aaaa_hosts
]
Limitations
Harmonic centrality measures link-graph importance, not user traffic or audience size. The population of top-ranked hosts skews towards infrastructure (CDNs, analytics, fonts), well-established media, and institutional sites. Results should not be interpreted as representative of the broader web.
The measurement does not distinguish native IPv6 from CDN-mediated IPv6. A host proxied through Cloudflare, Fastly, or a similar provider may appear as IPv6-capable even if the origin server has no IPv6 connectivity. Separating these cases would require comparing the measured AAAA address against known CDN address ranges, which is left as future work.
The "AAAA but unreachable" category (1.2%) includes hosts with misconfigured IPv6 stacks, inbound firewall rules blocking IPv6 traffic, TLS issues specific to the IPv6 path, or transient failures during the probe window. No retries were performed.
All probes originated from a single location in northwestern Santa Clara County, California. IPv6 routing is not uniform across the internet: a host that is reachable over IPv6 from that vantage point may be unreachable from elsewhere, and vice versa. Results should be understood as reflecting reachability from a well-connected North American network, not a global view. A follow-up study using probe nodes distributed across multiple continents is planned for the near term, which will make it possible to observe where IPv6 routing diverges geographically.