在我们通过浏览器打开页面时,幕后都在使用 DNS。那么什么是 DNS 呢?DNS 代表域名系统。它允许我们打开网站而无需记住访问网站的 IP 地址。当我们访问 www.baidu.com
时,浏览器是不知道 baidu.com
是什么。它只识别 110.242.68.66
等 IP 地址。DNS 帮助我们将 www.baidu.com
等人类可读的域名转换为其实际 IP 地址(110.242.68.66
),以便我们可以访问该网站。它是将域名转换为 IP 地址的互联网目录。我们访问的每个网站都会经过 DNS,但它的速度非常快,以至于我们在日常生活中甚至没有注意到它。有没有想过它在幕后是如何运作的?本文,我们将探索这一个过程的所有步骤,从浏览器开始,直到 DNS 返回 IP 地址。但在这之前,我们首先需要了解域名的结构,了解这一点对于理解 DNS 是如何有效工作是至关重要的。
域名的结构
我们已 www.baidu.com
为例,来分解域名的 3 个部分。
- 子域名:这是域名的最前面部分,没有提及时默认为
www
。例如我们上述域名的子域名就是www
。 - 域名:实际域名的名称,例如我们上述域名的域名名称就是
baidu
。 - 顶级域名:域名最后一个点之后的最后一段。它们是域名层次结构的顶层。例如我们上述域名的顶级域名就是
.com
。
下文中我们将会用到这些术语,所以需要对其有一个基本的了解。
DNS 如何工作
以下是 DNS 工作原理的分步过程:
- Local Cache:本地缓存。首先,浏览器会检查自己的缓存,看是否有网站的 IP 地址。对于经常访问的网站或流行的网站,如 Baidu、Google 等,浏览器将使用缓存的 IP。如果浏览器在其缓存中找不到该 URL,它将询问操作系统缓存中是否有该域的 IP 地址。缓存由浏览器和操作系统共同维护(例如 cURL 等工具)。
- DNS Query:DNS 查询。当两个缓存都没有返回任何结果时,操作系统会将 DNS 查询发送给 DNS 解析器。查询通常是对解析器的 UDP 请求,它是无状态的并且比 TCP 快得多。
- DNS Resolver:DNS 解析器。操作系统使用的 DNS 解析器通常由我们的 ISP(互联网服务提供商)提供,也可以来自 Google (8.8.8.8) 或 Cloudflare (1.1.1.1)。与前面的步骤一样,DNS 解析器也有一个缓存,它通过每个域名所有者设置的 TTL(生存时间)来维护(稍后会详细介绍),因此如果域名缓存存在,那么它将直接返回 IP,否则将继续下一步。
- Root Name Servers:根服务器。DNS 解析器如果在缓存中找不到 IP,就会查询其中一个根域名服务器。根域名服务器是最具权威性的域名服务器,全球只有 13 个命名的根服务器(命名为 a - m),由 ICANN 管理。根域名服务器将返回 TLD 域名服务器。例如,如果我们查询 www.baidu.com,根域名服务器将返回 .com TLD 的域名服务器列表。
- TLD Name Servers:TLD 名称服务器。现在,解析器将查询最近的 TLD 名称服务器(通过 Anycast 功能),并向其询问管理域名的权威名称服务器。请注意,TLD 名称服务器并不知道域名的 IP,但它会返回一个实际管理域名的附加名称服务器。
- Authoritative Name Servers:权威名称服务器。解析器将向权威名称服务器查询域名的 IP 地址。该名称服务器实际上存储了该域名的 DNS 记录,如 A、AAAA、CNAME 等(稍后详述)。它将返回域名的 IP 地址。
- Returning the IP:返回 IP。解析器从权威名称服务器获取 IP 地址后,会缓存 IP,并将 IP 返回操作系统,由操作系统再次缓存,然后再返回浏览器。
从缓存查询到 DNS 解析器的整个过程称为 DNS 查询。您可以使用以下工具对任何网站进行查询:
代码语言:javascript复制nslookup {domain_name}
例如:
代码语言:javascript复制$ nslookup www.baidu.com
Non-authoritative answer:
DNS request timed out.
timeout was 2 seconds.
Server: UnKnown
Address: 10.198.1.1
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
Name: www.baidu.com
Addresses: 240e:ff:e020:966:0:ff:b042:f296
240e:ff:e020:9ae:0:ff:b014:8e8b
183.2.172.185
183.2.172.42
现在,让我们来谈谈 DNS 记录、它们的含义以及添加 DNS 记录的过程。
DNS 记录
DNS 记录是各种类型记录中关于域名的信息。这些信息存储在权威名称服务器中(Authoritative Name Servers)。记录有多种类型,其中包括:
- A Record:A 记录。该记录存储域名的 IPv4 地址。
- AAAA Record:AAAA 记录。该记录存储域名的 IPv6 地址。
- CNAME Record:CNAME 记录。该记录是域名的规范名称记录。它用于为域名的不同子域设置别名。
- MX Record:MX 记录。它指向域名的邮件交换服务器。
- ... 还有更多
添加 DNS 记录会发生什么?
- 当有人从注册商(如 阿里云)购买域名时,他可以选择由谁来管理该域名。它可以由注册商(使用自己的名称服务器)或任何其他自定义名称服务器(例如 Cloudflare 或自制)提供。
- 一旦他为自己的域名选择了一个域名服务器,他就可以为该域名添加一个 DNS 记录和一个 TTL,以告诉解析器何时使系统中的 DNS 记录缓存过期。
- 一旦 DNS 记录被填充,该信息就会传播到域名的顶级域名服务器,这样当解析器尝试查询 IP 时,就会知道哪个权威域名服务器拥有该信息。向整个 DNS 网络共享这一传播信息可能需要一些时间。
DNS 安全
由于大多数 DNS 查询使用 UDP 协议进行,这使得 DNS 查询容易受到攻击,因为任何黑客都可以拦截从操作系统发送到解析器的网络数据包,并且可以知道客户端 IP 及其尝试访问的站点。还有另一种称为 DNS 欺骗的攻击,其中黑客在域名解析器中存储错误信息,因此,该数据被缓存在解析器中,导致某人访问受感染的站点,直到 TTL 过期。为确保 DNS 安全采取了多种措施,如 DNSSEC[1] 和 DNS over HTTPS (DoH)[2],但由于缺乏认识,这些措施仍未被广泛采用。
结论
DNS 是运行互联网的支柱,它让我们意识到,如果没有它,互联网就不会是今天的样子。对于那些想进一步了解该主题的人,可以查看:
- 什么是 DNS:https://www.cloudflare.com/learning/dns/what-is-dns/
参考资料
[1]
DNSSEC: https://www.cloudflare.com/learning/dns/dns-security/
[2]
DNS over HTTPS (DoH): https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/