How IPv6 Adoption Impacts DNS: A Practical Support Report and Test Guide
This article presents a comprehensive IPv6 support report, outlines global deployment milestones, evaluates operating‑system and application IPv6 readiness, and details DNS‑related testing in pure IPv4, dual‑stack, and IPv6‑only environments, highlighting key findings and best‑practice recommendations.
1. IPv6 Support Report
IPv6 Overview
IPv6 (Internet Protocol version 6) is the IETF‑designed successor to IPv4, using a 128‑bit address space that provides roughly 3.4 × 10 38 addresses—about 8 × 10 28 times more than IPv4. An IPv6 address consists of a 64‑bit network prefix and a 64‑bit interface identifier, often generated automatically (EUI‑64).
Global IPv6 Deployment Updates
2008 – EU publishes the “European IPv6 Deployment Action Plan”.
2009 – Japan releases its IPv6 Action Plan.
2010 – United States government issues an IPv6 Action Plan.
2010 – South Korea launches the “Next‑Generation Internet Protocol (IPv6) Promotion Plan”.
2012 – Canada publishes its IPv6 Strategy.
2017 – China’s State Council issues the “IPv6 Large‑Scale Deployment Action Plan”.
Operating‑System IPv6 Support
Application Software IPv6 Support
Client Software
Server Software
Program Development Tools
Databases
Summary
IPv6 is the foundational protocol for the interconnected, intelligent era, but transitioning a massive IPv4‑only network to pure IPv6 will take considerable time. The data show that most core and application software already support IPv6, though domestic infrastructure still needs improvement; the Ministry of Industry and Information Technology has issued a large‑scale deployment plan to accelerate adoption.
2. DNS Tests in IPv6 Environments
Background
Terminology
A record – maps a domain name to an IPv4 address.
<code>A record is a domain‑to‑IPv4 mapping, e.g.
ipv6test.ntes53.netease.com. 1800 IN A 123.58.166.70</code>AAAA record – maps a domain name to an IPv6 address.
<code>AAAA record maps a domain to an IPv6 address, e.g.
ipv6test.ntes53.netease.com. 1800 IN AAAA 2403:c80:100:3000::7b3a:a646</code>Cache DNS server – the resolver used directly by clients (e.g., 8.8.8.8, 114.114.114.114).
<code>Cache DNS server examples: 8.8.8.8, 114.114.114.114</code>Authoritative DNS server – serves zones it owns and rejects queries for other zones.
<code>Authoritative DNS servers answer only for their own domains.</code>Dual‑stack network – hosts that have both IPv4 and IPv6 addresses.
<code>Dual‑stack means a machine has both IPv4 and IPv6 addresses.</code>Test Scenarios
All tests use the programs described in the test methods section.
1. Pure IPv4 environment, add AAAA record
When an existing domain with only an A record receives an AAAA record, existing programs continue to work normally.
Conclusion
Adding an AAAA record does not affect programs in a pure IPv4 environment.
2. Dual‑stack client environment
With both A and AAAA records present, most programs operate correctly. An exception occurs when a program uses
gethostbynameand
options inet6is set in
resolv.conf, causing incorrect resolution.
RFCs and most implementations prefer IPv6 for connections.
In dual‑stack mode, IPv4 and IPv6 cache DNS servers return consistent results.
3. Pure IPv6 client environment
When only IPv6 is available (DNS must be dual‑stack), a domain with both A and AAAA records can still be accessed, but
gethostbynamemay return wrong results depending on
resolv.conf. Windows shows partial failures; specifying an IPv6 socket works.
Android 6.0+ supports IPv6, but many domestic devices lack native support.
4. DNS resolution priority
When both authoritative and cache servers support IPv6, the cache server prefers the IPv6 path; otherwise IPv4 is used.
Overall Conclusions
The
gethostbynamefunction does not support IPv6 and may produce errors; use
getaddrinfoinstead.
Adding an AAAA record to an existing domain generally does not disrupt client or server behavior, except when
gethostbynameis used with
options inet6in
resolv.conf.
In dual‑stack networks, IPv6 is preferred for DNS queries, connection establishment, and address selection (Happy Eyeballs algorithm).
References
Connecting with IPv6 in Windows 8 – link
IPv6 fallback to IPv4 discussion – link
Happy Eyeballs algorithm – link (RFC 6555)
Test Methods
Domain Resolution
C / C++
gethostbyname <code>#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(void) {
struct hostent *phost = gethostbyname("IPv6test.ntes53.netease.com");
printf("%s", inet_ntoa(*((struct in_addr*)phost->h_addr)));
return 0;
}</code>Windows version uses
#include <winsock.h>and similar calls.
getaddrinfo <code>#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int lookup_host() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
int err = getaddrinfo("IPv6test.ntes53.netease.com", NULL, &hints, &res);
if (err) { perror("getaddrinfo"); return -1; }
while (res) {
char addrstr[100];
void *ptr;
if (res->ai_family == AF_INET)
ptr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
else
ptr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
inet_ntop(res->ai_family, ptr, addrstr, 100);
printf("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4, addrstr, res->ai_canonname);
res = res->ai_next;
}
return 0;
}
int main(void) { lookup_host(); }
</code>Python
socket.gethostbyname
<code>import socket
result = socket.gethostbyname("IPv6test.ntes53.netease.com")
print(result)</code>socket.getaddrinfo
<code>import socket
print(socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_INET6))
print(socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_INET))
print(socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_UNSPEC))
</code>HTTP Requests
Python (requests)
<code>import requests
response = requests.get("http://IPv6test.ntes53.netease.com:8000", stream=True)
print(response.raw._fp.fp._sock.getpeername())
</code>C++ (libcurl)
<code>#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://IPv6test.ntes53.netease.com:8000");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
CURLcode res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
</code>Efficient Ops
This public account is maintained by Xiaotianguo and friends, regularly publishing widely-read original technical articles. We focus on operations transformation and accompany you throughout your operations career, growing together happily.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.