系统 DNS 与 HTTPDNS:原理、特性及其应用场景

发布于:2024-10-17 ⋅ 阅读:(9) ⋅ 点赞:(0)

一、介绍 DNS 和 HTTPDNS

1.1 域名解析基础知识

域名解析是将用户可读的网址,转换为计算机可识别的 IP 地址的过程。这是因为计算机在网络中的通信是通过 IP 地址实现的,人们通常使用更易记忆的域名来访问网站。

1.2 什么是系统 DNS?

系统 DNS 是指操作系统内置的域名解析服务。当我们输入一个 URL 的时候,系统 DNS 会从缓存或者远程 DNS 服务器上查询该 URL 对应的 IP 地址。

DNS 查询过程是通过一系列步骤将域名解析为 IP 地址的过程。以下是一个典型的 DNS 查询过程:

  1. 本地缓存查询:当用户输入一个 URL 时,操作系统会首先检查本地缓存(包括浏览器缓存和系统缓存)中是否已经有该域名对应的 IP 地址。如果找到了匹配的 IP 地址,DNS 查询过程结束,直接使用缓存中的 IP 地址进行访问。如果没有找到匹配的 IP 地址,进入下一步。

  2. 向本地 DNS 服务器发送查询请求:如果本地缓存中没有找到对应的 IP 地址,系统会向配置的本地 DNS 服务器(通常是 ISP 提供的 DNS 服务器或者家庭 Wi-Fi 路由器)发送查询请求。

  3. 迭代查询:本地 DNS 服务器接收到查询请求后,会进行迭代查询。首先查询根 DNS 服务器,根据返回的顶级域(如 .com, .org 等)的权威 DNS 服务器地址,继续查询。接着,本地 DNS 服务器会向权威 DNS 服务器发送查询请求,权威 DNS 服务器会返回对应的域名的权威 DNS 服务器地址。最后,本地 DNS 服务器会向该域名的权威 DNS 服务器发送查询请求,获取对应的 IP 地址。

  4. 返回 IP 地址:本地 DNS 服务器获取到域名对应的 IP 地址后,会将 IP 地址返回给客户端。同时,本地 DNS 服务器会将该 IP 地址缓存一段时间,以便后续查询可以直接从缓存中获取。

  5. 客户端访问网站:客户端收到 IP 地址后,就可以通过 IP 地址访问网站。整个 DNS 查询过程结束。

1.3 什么是 HTTPDNS?

HTTPDNS 是一种通过 HTTP 协议进行域名解析的技术,它可以绕过本地 DNS 服务器,直接从 DNS 服务商处获取域名解析结果,从而避免了一些传统 DNS 所面临的问题。

1.4 Android中如何用C代码查询系统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 和 HTTPDNS 的特点及比较

2.1 系统 DNS 的特点和优势

系统 DNS 主要优点在于它是操作系统的一部分,无需额外安装;它使用 UDP 协议,速度快,效率高。

2.2 系统 DNS 的局限性

系统 DNS 存在一些局限性,如易受 DNS 污染影响,容易受到中间人攻击,缺乏负载均衡等:

  1. 易受 DNS 污染影响:DNS 污染是一种故意篡改 DNS 解析结果的行为,通常用于封锁特定网站或服务。在 DNS 污染的情况下,攻击者会将用户的 DNS 请求重定向到错误的 IP 地址,导致用户无法访问目标网站。由于系统 DNS 通常使用公共的 DNS 服务器进行域名解析,容易受到 DNS 污染的影响。

  2. 容易受到中间人攻击:由于系统 DNS 使用无连接的 UDP 协议进行通信,且通信内容未经加密,攻击者可以在中间截获、篡改或伪造 DNS 请求和响应,导致用户被引导到恶意网站。这种类型的攻击称为中间人攻击(Man-in-the-Middle Attack,MITM)。

  3. 缺乏负载均衡:系统 DNS 在解析域名时,通常只返回一个 IP 地址。然而,大型网站或服务可能部署在多个服务器上,这就需要实现负载均衡,以便将流量分散到不同的服务器,提高服务的可用性和稳定性。传统的系统 DNS 无法根据用户的实际网络状况和服务端的负载情况提供动态的负载均衡。

2.3 HTTPDNS 的特点和优势

HTTPDNS 通过使用 HTTP 协议进行域名解析,可以防止 DNS 污染和中间人攻击。同时,由于它直接从 DNS 服务商获取解析结果,可以提供更精准的负载均衡和全球调度。

2.4 HTTPDNS 的局限性

HTTPDNS 的主要局限在于它需要依赖特定的服务商,而且由于使用 HTTP 协议,其解析速度可能会慢于系统 DNS。

三、HTTPDNS 的应用场景

3.1 解决 DNS 污染问题

由于 HTTPDNS 可以绕过本地 DNS 服务器进行域名解析,因此它能有效防止 DNS 污染。

3.2 提高域名解析速度

HTTPDNS 通常会将解析结果进行缓存,这样可以大大提高域名解析的速度。

3.3 实现智能负载均衡和全球调度

HTTPDNS 能够根据用户的实际网络环境和服务端的负载情况,返回最优的解析结果,从而实现智能负载均衡和全球调度。

3.4 提高应用程序的稳定性和可靠性

HTTPDNS 可以提供 failover 机制,当主 DNS 服务器无法访问时,可以自动切换到备用服务器,从而提高应用程序的稳定性和可靠性。

四、如何在应用程序中整合和实现 HTTPDNS

4.1 选择合适的 HTTPDNS 服务商

选择 HTTPDNS 服务商时,需要考虑其服务质量、覆盖范围、价格等因素。

4.2 集成 HTTPDNS SDK

大多数 HTTPDNS 服务商都会提供 SDK,开发者只需将 SDK 集成到应用程序中,即可开始使用 HTTPDNS。

4.3 配置和使用 HTTPDNS

使用 HTTPDNS 通常需要在应用程序初始化时进行一些配置,比如设置 DNS 服务器地址,启用或禁用某些功能等。

4.4 监控和优化 HTTPDNS 的性能

为了确保 HTTPDNS 能提供稳定可靠的服务,开发者需要定期监控其性能,如解析速度,解析成功率等。当遇到性能问题时,可以通过调整配置,优化网络环境等方式进行优化。

五、介绍在国内比较好的 DNS 列表

在实际应用中,选择一个优质的 DNS 服务商对于提高域名解析速度和提升用户体验至关重要。国内外有很多优秀的 DNS 服务商,它们各自具有不同的特点和优势。接下来,我们将介绍一些在国内比较好的 DNS 列表,供大家在实际应用中参考和选择。

腾讯

腾讯的 DNS : 119.29.29.29

AliDNS 阿里

首选: 223.5.5.5 备用: 223.6.6.6

114 DNS

常规公共 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

百度 BaiduDNS

IPv4 地址: 180.76.76.76
IPv6 地址: 2400:da00::6666

360 DNS

首选(电信/移动/铁通): 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 服务商列表供大家参考选择。