关于 DNS,一切你需要知道的内容

更新于 2026-01-05

cs.fyi 2023-03-26

如果你正在阅读本文,那么很可能你已经在不知不觉中使用过域名系统(DNS)。DNS 是互联网的基础组成部分之一,它让我们能够通过人类友好的名称(而非数字地址)访问网站和在线服务。但 DNS 到底是如何工作的呢?在本文中,我将解释 DNS 的基本原理,以及它是如何帮助我们在网络上导航的。

什么是 DNS?

DNS 就像互联网的电话簿。它将域名(例如 www.example.com)映射到 IP 地址(例如 192.0.2.1),而这些 IP 地址才是托管网站的实际服务器位置。这样,我们就无需记住一长串数字来访问我们喜欢的网站,只需输入域名,剩下的就交给 DNS 来处理。

DNS 是如何工作的?

但 DNS 是如何知道某个域名对应的 IP 地址在哪里的呢?答案是:它并非无所不知,而是依赖一个名为 DNS 解析器(DNS resolver)的服务器网络协同工作来找到答案。

当你在浏览器中输入一个域名时,你的计算机会首先检查其本地 DNS 缓存,看是否已有该域名的答案。如果有,就直接使用;如果没有,则会向一个 DNS 解析器发送查询请求。该解析器也会先检查自己的缓存。如果找到了答案,就返回给你的计算机;如果没找到,就会继续向其他 DNS 服务器发起查询。这个过程将持续进行,直到找到答案或查询超时。

DNS 解析器 是一种存储 DNS 记录并响应 DNS 查询的服务器。

让我们通过一个例子来具体说明。假设你想访问 www.example.com,以下是获取该域名对应 IP 地址所涉及的步骤或服务器层级:

  1. 检查本地缓存(Local Caches)
  2. 查询递归 DNS 服务器(Recursive DNS Servers)
  3. 查询根 DNS 服务器(Root DNS Servers)
  4. 查询顶级域 DNS 服务器(Top Level Domain DNS Servers)
  5. 查询权威 DNS 服务器(Authoritative DNS Servers)

第一步:本地缓存(Local Caches)

你的计算机会首先检查本地缓存——这是你最近访问过的域名及其对应 IP 地址的列表。如果目标域名在缓存中,计算机将直接使用该 IP 地址,并跳过后续所有步骤。

以下是一些可能包含域名到 IP 映射的本地缓存:

  • 浏览器缓存:你可能之前访问过该网站,浏览器已缓存了其 IP 地址。
  • DNS 缓存:根据 DNS 记录的 TTL(生存时间),你的操作系统可能已缓存了该 IP 地址。
  • Hosts 文件:你可能手动在 hosts 文件中添加了该域名与 IP 的映射。

第二步:递归 DNS 服务器(Recursive DNS Servers)

你的计算机或路由器配置的 DNS 设置通常会指向一个 DNS 服务器(默认情况下是你 ISP 提供的 DNS 服务器)。这个服务器被称为 递归 DNS 服务器。它会先检查自己的缓存。如果找到了答案,就返回给你的计算机;如果没有,就会向 DNS 层级中的下一个服务器(即根 DNS 服务器)发起查询。

第三步:根 DNS 服务器(Root DNS Servers)

根 DNS 服务器位于 DNS 层级结构的最顶端,负责将对顶级域(如 .com.org.net 等)的查询委托给相应的顶级域 DNS 服务器。

它们本身并不存储网站的 IP 地址,而是存储顶级域 DNS 服务器的地址。例如,.com 域的根服务器之一是 a.gtld-servers.net。你可以通过以下命令查看不同顶级域的名称服务器:

dig +short NS com
dig +short NS org
dig +short NS ai
dig +short NS fyi
dig +short NS io

第四步:顶级域 DNS 服务器(Top Level Domain DNS Servers)

顶级域 DNS 服务器负责将对二级域名(如 example.comexample.orgexample.ai)的查询委托给对应的 权威 DNS 服务器(即实际存储 DNS 记录的地方)。

它们也不直接提供网站的 IP 地址,而是提供权威 DNS 服务器的地址。

你可以通过以下命令查看某个二级域名的名称服务器:

dig +short NS cs.fyi
dig +short NS github.com
dig +short NS medium.com

第五步:权威 DNS 服务器(Authoritative DNS Servers)

这里是实际存储 DNS 记录的地方。在此阶段,权威 DNS 服务器会被请求提供该域名的 A 记录(A record)。A 记录是将域名映射到 IP 地址的 DNS 记录类型。权威服务器随后将 IP 地址返回给递归 DNS 服务器,后者再将其传回你的计算机。

DNS 在实际中如何运作?

我们可以通过 dig 命令来看看 DNS 在实践中是如何工作的。dig 是一个用于查询 DNS 名称服务器的命令行工具,在大多数 Linux 和 macOS 系统上都可用。在 Windows 上,你可以通过 Chocolatey 安装它:

choco install dig

假设你想查找 www.example.com 的 IP 地址,可以运行:

dig +short www.example.com

+short 选项告诉 dig 只输出响应中的答案部分。输出可能如下所示:

93.184.216.34

这就是 www.example.com 的 IP 地址。但 dig 是如何找到这个地址的呢?让我们看看背后发生了什么。

首先,dig 会检查本地缓存;如果没有,就向 DNS 解析器发送查询;解析器依次向上查询,直到找到答案。

你可以使用 +trace 选项查看完整的解析路径:

dig +trace www.example.com

完整输出较长,这里不展示。但你可以亲自运行该命令,观察整个过程中涉及的不同 DNS 服务器。

调试 DNS 问题

如果你无法访问某个网站,可以使用 dig 命令来排查问题。以下是一些实用示例:

检查域名的 DNS 解析

你可以用 dig 检查一个域名是否能成功解析为 IP 地址:

dig example.com +short

该命令将返回与 example.com 关联的 IP 地址(注意原文此处误写为 google.com,应为 example.com)。+short 选项仅显示 IP 地址,省略其他信息。

获取域名的 DNS 记录

你可以用 dig 获取域名的各种 DNS 记录。例如,获取所有 A 记录:

dig example.com A

获取 MX 记录(用于邮件服务器):

dig example.com MX

检查 DNS 传播状态

要确认 DNS 记录是否已在全球 DNS 服务器中生效,可使用:

dig example.com MX +trace

+trace 选项会显示从根服务器开始的完整解析路径,有助于判断是否有 DNS 服务器尚未同步最新记录。

检查 DNSSEC 验证

你可以用 dig 检查域名的 DNSSEC 是否正常工作:

dig example.com +dnssec

这将显示与 DNSSEC 相关的记录及其有效性。

DNSSEC(Domain Name System Security Extensions)是 DNS 的安全扩展,用于验证 DNS 数据的来源和完整性,并防止数据在传输过程中被篡改。

查询特定 DNS 服务器

你可以指定向某个 DNS 服务器发起查询。例如,使用 Google 公共 DNS(8.8.8.8)查询 A 记录:

dig example.com A @8.8.8.8

这会将查询发送到指定的 DNS 服务器,而不是使用本地默认配置。

常见 DNS 错误

你可能会遇到以下几种常见的 DNS 错误:

  • DNS_PROBE_FINISHED_NXDOMAIN
    表示域名不存在。可能是拼写错误,或域名已过期。

  • DNS_PROBE_FINISHED_NO_INTERNET
    表示域名存在,但 DNS 服务器无法访问。可能是 DNS 服务器宕机,或网络连接问题。

  • DNS_PROBE_FINISHED_BAD_CONFIG
    表示 DNS 配置错误,导致无法连接到 DNS 服务器。同样可能由服务器故障或网络问题引起。

如何清除 DNS 缓存

有时你可能需要清除本地计算机的 DNS 缓存。

  • Windows

    ipconfig /flushdns
    
  • macOS

    dscacheutil -flushcache
    

注意:在较新版本的 macOS 中,可能需要使用 sudo killall -HUP mDNSResponder 来刷新 DNS 缓存。

结语

在本文中,我们学习了 DNS 的基本概念及其工作原理,还掌握了如何使用 dig 命令查询 DNS 记录和调试问题。希望这篇文章对你有所帮助!欢迎分享给你的朋友和同事。