Fundamentals 17 min read

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.

Efficient Ops
Efficient Ops
Efficient Ops
How IPv6 Adoption Impacts DNS: A Practical Support Report and Test Guide

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

gethostbyname

and

options inet6

is 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

gethostbyname

may 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

gethostbyname

function does not support IPv6 and may produce errors; use

getaddrinfo

instead.

Adding an AAAA record to an existing domain generally does not disrupt client or server behavior, except when

gethostbyname

is used with

options inet6

in

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(&amp;hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    int err = getaddrinfo("IPv6test.ntes53.netease.com", NULL, &amp;hints, &amp;res);
    if (err) { perror("getaddrinfo"); return -1; }
    while (res) {
        char addrstr[100];
        void *ptr;
        if (res->ai_family == AF_INET)
            ptr = &amp;((struct sockaddr_in *)res->ai_addr)->sin_addr;
        else
            ptr = &amp;((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>
IPv6DNSDual-StackHappy Eyeballsgetaddrinfo
Efficient Ops
Written by

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.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.