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

一、介绍 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) {
   
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆业聪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值