域名解析是将用户可读的网址,转换为计算机可识别的 IP 地址的过程。这是因为计算机在网络中的通信是通过 IP 地址实现的,人们通常使用更易记忆的域名来访问网站。
系统 DNS 是指操作系统内置的域名解析服务。当我们输入一个 URL 的时候,系统 DNS 会从缓存或者远程 DNS 服务器上查询该 URL 对应的 IP 地址。
DNS 查询过程是通过一系列步骤将域名解析为 IP 地址的过程。以下是一个典型的 DNS 查询过程:
HTTPDNS 是一种通过 HTTP 协议进行域名解析的技术,它可以绕过本地 DNS 服务器,直接从 DNS 服务商处获取域名解析结果,从而避免了一些传统 DNS 所面临的问题。
笔者所在项目中的网络层是使用跨平台的C++实现的,在C++中可以使用getaddrinfo
解析系统DNS。getaddrinfo
用于将主机名和服务名解析为一组 socket 地址。这个函数支持 IPv6 地址和服务名解析。以下是一个使用 getaddrinfo
的 C 代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
struct addrinfo hints, *res, *p;
int status;
char ipstr[INET6_ADDRSTRLEN];
char hostname[] = "www.example.com";
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return 2;
}
printf("IP addresses for %s:\n", hostname);
for(p = res; p != NULL; p = p->ai_next) {
void *addr;
char *ipver;
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
ipver = "IPv6";
}
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
printf(" %s: %s\n", ipver, ipstr);
}
freeaddrinfo(res); // free the linked list
return 0;
}
在这个示例中,我们首先调用 getaddrinfo
函数来解析域名。然后,我们遍历返回的地址列表,对于每个地址,我们使用 inet_ntop
函数将其转换为字符串,然后打印出来。最后,我们使用 freeaddrinfo
函数释放地址列表。
系统 DNS 主要优点在于它是操作系统的一部分,无需额外安装;它使用 UDP 协议,速度快,效率高。
系统 DNS 存在一些局限性,如易受 DNS 污染影响,容易受到中间人攻击,缺乏负载均衡等:
HTTPDNS 通过使用 HTTP 协议进行域名解析,可以防止 DNS 污染和中间人攻击。同时,由于它直接从 DNS 服务商获取解析结果,可以提供更精准的负载均衡和全球调度。
HTTPDNS 的主要局限在于它需要依赖特定的服务商,而且由于使用 HTTP 协议,其解析速度可能会慢于系统 DNS。
由于 HTTPDNS 可以绕过本地 DNS 服务器进行域名解析,因此它能有效防止 DNS 污染。
HTTPDNS 通常会将解析结果进行缓存,这样可以大大提高域名解析的速度。
HTTPDNS 能够根据用户的实际网络环境和服务端的负载情况,返回最优的解析结果,从而实现智能负载均衡和全球调度。
HTTPDNS 可以提供 failover 机制,当主 DNS 服务器无法访问时,可以自动切换到备用服务器,从而提高应用程序的稳定性和可靠性。
选择 HTTPDNS 服务商时,需要考虑其服务质量、覆盖范围、价格等因素。
大多数 HTTPDNS 服务商都会提供 SDK,开发者只需将 SDK 集成到应用程序中,即可开始使用 HTTPDNS。
使用 HTTPDNS 通常需要在应用程序初始化时进行一些配置,比如设置 DNS 服务器地址,启用或禁用某些功能等。
为了确保 HTTPDNS 能提供稳定可靠的服务,开发者需要定期监控其性能,如解析速度,解析成功率等。当遇到性能问题时,可以通过调整配置,优化网络环境等方式进行优化。
在实际应用中,选择一个优质的 DNS 服务商对于提高域名解析速度和提升用户体验至关重要。国内外有很多优秀的 DNS 服务商,它们各自具有不同的特点和优势。接下来,我们将介绍一些在国内比较好的 DNS 列表,供大家在实际应用中参考和选择。
腾讯的 DNS : 119.29.29.29
首选:223.5.5.5
备用:223.6.6.6
常规公共 DNS (干净无劫持)
首选:114.114.114.114
备选:114.114.115.115
拦截钓鱼病毒木马网站 (保护上网安全)
首选:114.114.114.119
备用:114.114.115.119
拦截色情网站 (保护儿童)
首选:114.114.114.110
备用:114.114.115.110
IPv4 地址:180.76.76.76
IPv6 地址:2400:da00::6666
首选(电信/移动/铁通):101.226.4.6
备选(电信/移动/铁通):218.30.118.6
首选(联通):123.125.81.6
备选(联通):140.207.198.6
CloudFlare DNS: 1.1.1.1
以上就是关于系统 DNS 和 HTTPDNS 的介绍,包括它们的特点,应用场景,以及如何在实际项目中使用。希望本文能帮助你更好地理解这两种技术,并根据实际需求选择合适的域名解析方案。同时,我们提供了一些国内外优秀的 DNS 服务商列表供大家参考选择。