DNS(域名系统)
DNS(Domain Name System,域名系统)是互联网的基础设施,被称为“互联网的电话簿”。它的核心作用是将人类易于记忆的域名(如 www.google.com)翻译成计算机网络通信所需的数字 IP 地址(如142.250.190.4),没有 DNS,我们在上网时就必须记住一长串枯燥的数字,互联网的普及和易用性将大打折扣。
1. DNS 的核心组件(服务器层级)
DNS 并不是一台巨大的服务器,而是一个分布式的数据库系统,呈现出一种倒置的树状层级结构。了解这些“角色”,是理解解析过程的前提:
- DNS 客户端 (DNS Resolver/Client):通常是你的电脑操作系统或浏览器,负责发起 DNS 查询请求。
- 本地 DNS 服务器 (Local DNS Server / Recursive Resolver):也叫递归解析器。通常由你的网络运营商(ISP,如电信、联通)提供,或者你手动设置的公共 DNS(如 Google 的
8.8.8.8或阿里的223.5.5.5)。它是你设备的第一联络人,负责“跑腿”帮你找到最终答案。 - 根域名服务器 (Root Name Server):处于 DNS 树的最顶端。全球有 13 组根服务器(用 A 到 M 命名)。它们不直接知道具体域名的 IP,但它们知道所有的“顶级域名服务器”的地址。
- 顶级域名服务器 (TLD Name Server):负责管理特定的顶级域名(如
.com,.org,.cn)。例如,.com的 TLD 服务器知道所有以.com结尾的域名的“权威服务器”在哪里。 - 权威域名服务器 (Authoritative Name Server):这是 DNS 查询的终点。它是某个具体域名(如
baidu.com)的实际管理者,保存着该域名下所有子域名(如www.baidu.com)与 IP 地址的真实映射关系(DNS 记录)。
2. DNS 解析的详细步骤(Step-by-Step)
假设你在浏览器中输入了 www.example.com,DNS 解析的完整过程(包含缓存查找和网络查询)如下:
2.1 本地缓存查找(不用上网就能解决)
为了提高速度和减少网络负担,DNS 采用了多级缓存机制。
- 浏览器缓存:浏览器首先检查自己内部的 DNS 缓存(通常只保存几分钟)。如果有记录,直接使用,解析结束。
- 操作系统缓存 (OS Cache) 和 hosts 文件:如果浏览器没有缓存,它会调用操作系统的网络 API。操作系统会:
- 检查本地的
hosts文件(Linux 下为/etc/hosts,Windows 下为C:\Windows\System32\drivers\etc\hosts)。如果里面有配置www.example.com的 IP,直接使用。 - 检查操作系统自身的 DNS 缓存。如果有,直接使用,解析结束。
- 检查本地的
2.2 网络查询(本地 DNS 的递归与迭代之旅)
如果在本地电脑上没找到,操作系统就会向配置的本地 DNS 服务器 (Local DNS) 发送查询请求。
- 本地 DNS 缓存:本地 DNS 服务器收到请求后,首先查自己的缓存。如果有,直接返回给用户,解析结束。
- 向根域名服务器求助(迭代查询开始):如果本地 DNS 也没有缓存,它就会以客户端的身份,向根域名服务器发起请求:“你知道
www.example.com的 IP 吗?” - 根服务器的指引:根服务器查看后缀是
.com,回答说:“我不知道具体的 IP,但我把管理.com的顶级域名服务器 (TLD) 的地址给你,你去问它。” - 向 TLD 服务器求助:本地 DNS 拿着地址,去问
.com的 TLD 服务器:“你知道www.example.com的 IP 吗?” - TLD 服务器的指引:TLD 服务器查了一下,回答说:“我不知道具体的 IP,但我知道
example.com这个域名的权威域名服务器的地址,你去问它。” - 向权威服务器求助(找到真理):本地 DNS 终于找到了
example.com的权威服务器,发问:“请告诉我www.example.com的 IP 是多少?” - 权威服务器的最终答复:权威服务器查阅自己的记录(A 记录或 CNAME 记录),发现对应的 IP 是
192.0.2.1,于是将这个结果返回给本地 DNS。 - 本地 DNS 缓存并返回:本地 DNS 收到最终的 IP 地址后,做两件事:
- 把这个结果存入自己的缓存中(根据记录的 TTL 时间决定存多久),方便下次有人问。
- 把 IP 地址返回给你的电脑。
- 浏览器发起连接:你的浏览器拿到 IP 地址
192.0.2.1,开始与该服务器建立 TCP 连接(三次握手),并发送 HTTP 请求,最终你看到了网页。

3. 两种查询方式的区别(重点概念)
在上述过程中,包含了两种不同的查询模式:
- 递归查询 (Recursive Query):“帮人帮到底”。 你的电脑对本地 DNS 服务器发出的是递归查询。电脑说:“我只要最终的 IP 结果,如果没有就告诉我失败,中间你怎么找的我不管。” 本地 DNS 必须负责查出最终结果。
- 迭代查询 (Iterative Query):“我不知道,但能给你指条明路”。 本地 DNS 向根服务器、TLD 服务器发出的查询是迭代查询。这些高级服务器通常不直接给最终答案,而是返回“下一步你应该去问谁”的线索,让本地 DNS 自己继续去跑腿。
4. 常见问题 (FAQ) 与面试题
4.1 为什么 DNS 解析通常使用 UDP 协议而不是 TCP?
- 速度快,开销小:DNS 查询和响应通常数据量很小(小于 512 字节),一个包就能装下。UDP 是无连接的,不需要像 TCP 那样进行耗时的三次握手建连过程,大大降低了延迟。
- 例外情况:虽然通常用 UDP,但在以下情况也会使用 TCP:
- 返回的响应数据包太大,超过了 512 字节(UDP 会被截断),客户端会使用 TCP 重新发起请求。
- DNS 服务器之间进行区域传输(主从服务器同步大量 DNS 数据)时,为了保证数据的可靠性和完整性,必须使用 TCP。
4.2 什么是 DNS 劫持?如何防止?
- 定义:攻击者通过某种手段(如篡改路由器配置、入侵本地网络、恶意软件修改 hosts 文件),将用户的 DNS 请求拦截,并返回一个伪造的 IP 地址。结果就是用户本来想访问正规银行网站,却被引到了长得一模一样的钓鱼网站。
- 防范:
- 手动设置可靠的公共 DNS(如 114.114.114.114)。
- 使用 DNS over HTTPS (DoH) 或 DNS over TLS (DoT) 技术。这些技术将 DNS 查询报文加密传输,防止中间人监听和篡改,现代浏览器(如 Chrome, Edge)已经支持开启此功能。
4.3 什么是 DNS 缓存污染(DNS Cache Poisoning)?
- 与劫持类似,但污染是针对本地 DNS 服务器的攻击。攻击者向本地 DNS 服务器注入一条伪造的 DNS 记录。由于本地 DNS 会缓存记录,这会导致该区域内所有使用这个本地 DNS 的用户,在访问特定域名时都被引导至错误的 IP。
4.4 常见的 DNS 记录类型有哪些?
- A 记录 (Address):将域名映射到 IPv4 地址(最常见)。
- AAAA 记录:将域名映射到 IPv6 地址。
- CNAME 记录 (Canonical Name):别名记录,将一个域名映射到另一个域名。常用于 CDN 加速,比如把
www.example.com指向example.cdn.com。 - MX 记录 (Mail Exchanger):邮件交换记录,用于告诉发送方,发送到
@example.com的邮件应该交给哪台邮件服务器处理。 - NS 记录 (Name Server):域名服务器记录,指明由哪台权威服务器来解析该域名。
- TXT 记录:文本记录,通常用于配置 SPF(防伪造邮件)或验证域名所有权。
4.5 TTL 是什么意思?
- TTL (Time To Live):生存时间。在 DNS 记录中,它表示这条记录在本地 DNS 或客户端缓存中可以存留的时间(单位通常是秒)。
- TTL 设置得越大,缓存命中率越高,解析速度越快,DNS 服务器压力越小;但如果 IP 发生变更,生效时间就越慢。
- TTL 设置得越小,IP 变更生效越快;但会增加 DNS 解析的请求频率和延迟。
4.6 为什么有时候修改了域名的解析,但电脑上还是访问旧的 IP?
- 这就是缓存在作祟。修改权威服务器上的记录后,全球各地的本地 DNS 服务器并不会立刻知道,它们会继续使用自己缓存里的旧 IP,直到旧记录的 TTL 时间过期。
- 解决办法:
- 等待 TTL 过期(通常几十分钟到几小时不等)。
- 在自己电脑上执行命令强制刷新本地缓存:Windows 打开 cmd 输入
ipconfig /flushdns;Mac 打开终端输入sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。