DNS:域名解析与地址管理
DNS,全称是 Domain Name System,中文通常叫域名系统。它解决的核心问题是:人更容易记住 www.example.com,而网络通信真正需要的是 IP 地址,所以访问网站前,需要先把域名解析成可以连接的地址。
一句话回答:
DNS 是互联网的分布式命名系统,负责把域名解析成 IP 地址,也可以通过不同记录表达邮件服务器、权威 DNS、文本验证、别名跳转等信息。
但面试里只答“域名转 IP”还不够。更完整的理解应该是一条链路:
核心链路
以访问 https://www.example.com/path 为例,浏览器真正要连接的不是字符串 www.example.com,而是某个 IP 地址:
DNS 查询完成后,客户端会选择一个可用地址,再用目标 IP 和端口建立连接。HTTP/1.1、HTTP/2 通常基于 TCP,HTTPS 会在 TCP 之后进行 TLS 握手;HTTP/3 基于 QUIC/UDP,仍然需要先知道目标地址。
这里先记住一个边界:DNS 负责“名字到地址”的解析,不负责传输 HTTP 数据;TCP 或 QUIC 负责连接和传输,HTTP 负责应用层请求和响应。
先用一张表记住几个角色:
域名基础
理解 DNS 前,先要把“域名”本身拆清楚。域名不是随便用点拼起来的字符串,而是按层级组织的名字。
以 www.example.com. 为例,完整域名最后的点表示根域,平时通常省略:
常见叫法如下:
DNS 层级可以继续往下延伸,并不只到二级域或三级域。例如 v1.api.example.com 按层级可以理解为四级域名,a.b.c.example.com 还可以更深。实际项目里常见的是 www.example.com、api.example.com 这类三级域名,以及 v1.api.example.com 这类更细分的服务域名。
中文里“一级域名、二级域名”的叫法容易混乱。严格按 DNS 层级看,.com 是顶级域,也常被叫作一级域;example.com 是二级域;www.example.com 是三级域。但实际业务交流中,很多人也会把自己注册的 example.com 叫“一级域名”,把 www.example.com、api.example.com 叫“二级域名”。面试里最好说明口径:按 DNS 层级,com 是顶级域,example.com 是二级域,www.example.com 是三级域 / 子域名。
还要区分两个容易混在一起的概念:
- 域名:
www.example.com,是 DNS 查询的名字。 - URL:
https://www.example.com/path?x=1#top,包含协议、域名、路径、查询参数和片段。
DNS 只关心 URL 里的主机名部分,也就是 www.example.com,不会解析 /path、?x=1 或 #top。
本地缓存
浏览器不一定会立刻发起 DNS 网络查询。真实解析链路通常会先查缓存,只有缓存没有可用答案时,才会发起网络查询。
常见顺序可以理解成:
不同系统和浏览器实现会有差异,但思路一样:能用近处缓存解决,就不走远处网络查询。这样可以减少延迟,也可以减轻 DNS 系统压力。DNS 记录变更为什么不一定立刻生效,后面会放到 TTL 一起讲。
递归 DNS 如何找到答案
DNS 查询里最容易混淆的是递归查询和迭代查询。
- 递归查询:查询方要求 DNS 服务器给出最终答案。
- 迭代查询:DNS 服务器不直接给最终答案,而是告诉查询方下一步该问谁。
通常客户端向递归 DNS 发起递归查询。递归 DNS 如果没有缓存,才会通过迭代查询按 DNS 层级从上到下联系根 DNS、顶级域 DNS 和权威 DNS。
递归 DNS 是真实存在的服务,不是抽象概念。常见来源包括:
例如 Google Public DNS 的 8.8.8.8、Cloudflare DNS 的 1.1.1.1、Quad9 的 9.9.9.9,都属于公共递归 DNS。客户端可以直接把域名查询发给它们,由它们查缓存或继续向根 DNS、顶级域 DNS、权威 DNS 查询。
所以递归 DNS 更像“代跑腿的人”:客户端把问题交给它,它负责一路问到底。根 DNS、顶级域 DNS 更像“指路人”:它们通常不保存具体业务域名的 IP,而是返回下一层应该询问的 DNS 服务器。
DNS 分层与委派
DNS 是分布式、分层的系统,不是一台服务器保存全世界所有域名记录。域名按根域、顶级域、二级域、子域名逐层组织,每一层只需要知道自己负责的区域,以及下一层应该交给谁。
在没有可用缓存的情况下,递归 DNS 会沿着这个分层结构从上到下逐级查找。这个过程前面已经看过,这里重点看“每一层为什么知道下一步问谁”:
分层的好处是职责清晰、规模可扩展、管理权可以下放。根 DNS 不需要知道每个业务域名的 IP,只需要知道各顶级域归谁管;顶级域 DNS 不需要保存所有主机记录,只需要知道某个二级域由哪些权威 DNS 负责;真正保存业务记录的是权威 DNS。
根 DNS 保存的是根区 . 的数据。根区里记录了各个顶级域的 NS 委派信息,例如:
所以递归 DNS 问根 DNS:www.example.com 应该问谁?根 DNS 不知道最终 IP,但能看出它属于 .com,于是返回 .com 顶级域 DNS。
顶级域 DNS 保存的是自己负责的顶级域区域数据。例如 .com 顶级域 DNS 里会保存 .com 下面二级域的委派信息:
所以递归 DNS 问 .com 顶级域 DNS:www.example.com 应该问谁?.com 顶级域 DNS 通常不返回 www.example.com 的 IP,而是返回 example.com 的权威 DNS。
这些委派信息通常来自域名注册和 DNS 托管配置:用户注册 example.com,在注册商处设置该域名使用哪些 NS 服务器,注册局再把这些信息更新到对应顶级域的区域数据中。
可以把这条授权链路记成:
权威 DNS 与 Zone
权威 DNS 是某个域名区域的最终记录来源。比如你购买了 example.com,然后在域名注册商或 DNS 服务商那里配置:
当递归 DNS 问到 www.example.com 时,最终要找到负责 example.com 这个区域的权威 DNS。权威 DNS 返回的记录才是这个域名配置的“官方答案”。
权威 DNS 负责的是某个 DNS 区域,也叫 zone。默认情况下,一个区域可以包含该域名本身以及它下面更深层的子域名。例如 example.com 这个区域的权威 DNS 可以保存:
所以二级域名以及三级、四级等更深层子域名,通常都可以由同一个权威 DNS 管理。但这不是绝对的,因为子域名也可以继续通过 NS 记录委派出去。
例如:
这样 api.example.com 就变成一个新的区域,由 ns1.api-dns.com、ns2.api-dns.com 这组新的权威 DNS 负责。此时 example.com 的权威 DNS 负责告诉查询方“api.example.com 去问另一组 DNS”,而 api.example.com 下面的具体记录,例如 v1.api.example.com,则由新的权威 DNS 返回。
可以这样理解:
这里还要区分两个角色:
很多平台同时提供注册商和 DNS 托管能力,所以实际使用时容易觉得它们是同一个东西。但从 DNS 原理上看,注册域名和解析域名是两件事。
DNS 记录
DNS 不只保存 IP 地址,也保存很多和域名相关的记录。
前端和 Web 面试里最常考的是 A、AAAA、CNAME、NS、TXT,其中 CNAME 最容易被追问。
A / AAAA
A 记录返回 IPv4 地址,AAAA 记录返回 IPv6 地址:
同一个域名可以配置多个 A 或 AAAA 记录。递归 DNS 或权威 DNS 可能返回多个地址,客户端再选择其中一个连接。
CNAME
CNAME 表示当前域名是另一个域名的别名:
解析器拿到 CNAME 后,不会直接得到 IP,而是继续解析目标域名,直到拿到 A 或 AAAA。
需要注意:一个名字如果配置了 CNAME,通常不能再同时配置其他记录。根域名,例如 example.com,一般也不适合直接配置 CNAME,因为根域名还必须存在 NS、SOA 等记录。很多 DNS 厂商提供的 ALIAS、ANAME 或 CNAME Flattening,是在服务商侧做了兼容处理,不等同于标准 CNAME 的普通行为。
NS
NS 记录表示“这个域名区域由哪些权威 DNS 负责”。例如:
面试里如果问“根 DNS 怎么知道下一步问谁”,本质就是靠上级区域返回下级区域的 NS 信息。
TXT
TXT 记录存储文本,经常用于证明你拥有某个域名,或者配置邮件安全策略:
比如平台要求你给域名添加一条 TXT,平台再查询这条记录。如果查到了预期内容,就说明你有权限管理这个域名。
DNS 与 IP 地址的对应关系
DNS 与 IP 不是“一对一且永久不变”的关系。
- 一个域名可以对应多个 IP:例如 DNS 轮询、CDN、多地域部署,用于负载均衡、就近接入和故障切换。
- 多个域名可以对应同一个 IP:多个站点可以部署在同一台服务器、负载均衡器或 CDN 节点上。
- 一个域名可以先对应另一个域名:
CNAME指向别名,再继续解析目标域名的A或AAAA。 - 域名对应的 IP 可以变化:扩容、迁移、故障切换、CDN 调度都会影响最终返回地址。
为什么多个域名可以共用一个 IP?因为网络连接先连到 IP 和端口,但应用层仍会携带域名信息:
- HTTP 请求头里的
Host用来告诉服务器访问的是哪个站点。 - HTTPS 握手里的 SNI 用来告诉服务器要返回哪个域名的证书。
所以 TCP 连接使用的是 IP 地址 + 端口,不是域名;但 HTTP 和 TLS 仍然需要域名参与站点选择和证书校验。
多个 A / AAAA 与负载均衡
一个域名配置多个 A 或 AAAA,可以算一种很粗粒度的 DNS 层流量分发。例如:
DNS 查询时可能返回多个 IP,客户端或系统从中选择一个地址连接。它的优点是简单,缺点是控制粒度粗,会受到 DNS 缓存、TTL、递归 DNS 和客户端选择策略影响。某个 IP 故障后,即使权威 DNS 删除了这条记录,旧结果也可能还在递归 DNS 或客户端缓存里,不能保证所有用户立刻切走。
常说的负载均衡器则不同。客户端通常先连接到一个统一入口,例如 Nginx、HAProxy、云厂商 SLB / ALB 或 CDN 边缘节点,再由这个入口把流量分发给后端实例:
负载均衡器可以根据连接数、权重、健康检查、路径、Header、Cookie 等策略分发请求,也可以把故障后端及时摘掉。相比多个 A / AAAA,它的实时性和控制能力更强。
实际项目里两者经常配合使用:DNS 先把用户引到合适的入口 IP,入口可能是多个负载均衡器或 CDN 节点;负载均衡器再把请求分发给具体后端服务。
TTL 与缓存生效
DNS 缓存由 TTL 控制。TTL,全称 Time To Live,表示解析结果可以被缓存多久。
例如:
这里 300 表示这条记录可以缓存 300 秒。递归 DNS、操作系统或浏览器在 TTL 有效期内可以直接使用缓存结果,不必重新询问权威 DNS。
TTL 的取值会影响两件事:
上线迁移时常见做法是:提前把 TTL 调短,等旧缓存逐渐过期后再切换记录;切换稳定后,再把 TTL 调回合理值。
但 TTL 不是绝对保证。部分递归 DNS、客户端、应用进程可能有自己的缓存策略,有些系统还可能不完全遵守权威 DNS 的 TTL。因此排查 DNS 生效问题时,不能只看权威 DNS 配置,还要看递归 DNS 和客户端拿到的实际结果。
DNS 与 CDN 调度
CDN 调度经常通过 DNS 完成。业务方通常不会把 static.example.com 直接解析到源站 IP,而是配置成 CDN 厂商提供的调度域名:
用户访问 CDN 域名时,链路大致是:
这里的关键不是“返回离用户物理距离最近的节点”,而是“返回综合访问质量更合适的节点”。调度系统可能参考用户地域、运营商、递归 DNS 出口、EDNS Client Subnet、节点负载、节点健康状态、成本和业务配置。
DNS 调度也有局限:权威 DNS 看到的通常是递归 DNS 的地址,不一定是用户真实地址。EDNS Client Subnet 可以缓解这个问题,但也涉及隐私和兼容性,并不是所有链路都会携带。
DNS 的传输方式
DNS 一定只走 UDP 吗?不一定。
传统 DNS 查询通常使用 UDP 53 端口,因为查询和响应一般较小,UDP 开销低、延迟低。但 DNS 也可以使用 TCP 53 端口,常见场景包括:
- 响应过大,UDP 放不下或被截断,需要改用 TCP。
- 区域传送等管理类操作。
- 某些网络环境或安全策略要求使用 TCP。
现代环境还可能使用:
- DoH:DNS over HTTPS,把 DNS 查询放进 HTTPS。
- DoT:DNS over TLS,使用 TLS 加密 DNS 查询。
DoH 和 DoT 的目标是降低中间网络窥探或篡改 DNS 查询的风险,但它们不等于让 DNS 结果天然可信。是否可信仍然取决于递归 DNS 服务、证书验证、安全策略和上游解析链路。
DNS 问题排查
DNS 问题常见表现包括:
- 域名无法访问,但直接访问 IP 可能正常。
- 不同网络访问结果不同,例如公司网络正常,家庭网络异常。
- 刚改完解析,一部分用户已生效,一部分用户仍访问旧地址。
- CDN 调度异常,用户被分配到远处或故障节点。
- 只影响某个子域名,不影响同站其他域名。
排查时可以沿着链路看:
注意最后一点:域名能解析,不代表网站一定能访问。DNS 只负责拿到地址;后面的 TCP 连接失败、TLS 证书错误、HTTP 5xx、CDN 回源失败,都是 DNS 之后的问题。
DNS 劫持、污染和 DNSSEC
DNS 天然处在访问链路前面,一旦解析结果被篡改,用户可能会被带到错误 IP。
DNS 劫持
DNS 劫持通常指解析请求被中间网络、恶意软件、路由器或不可信 DNS 服务拦截并返回错误结果。例如你查询 www.example.com,本该返回真实 IP,却被返回广告页、钓鱼站或运营商提示页的 IP。
劫持更强调“查询过程被接管或响应被替换”。
DNS 污染
DNS 污染通常指网络中注入伪造 DNS 响应,让查询方先收到错误答案。由于 DNS 传统上常用 UDP,请求和响应容易被伪造,客户端可能接受先到达的假响应。
污染更强调“伪造响应被注入到链路中”。
两者在现象上都可能表现为解析到错误 IP,区别更多在攻击方式和发生位置。
DNSSEC
DNSSEC 用数字签名验证 DNS 记录是否被篡改。它解决的是“记录完整性和来源可信”的问题,而不是加密 DNS 查询内容。
也就是说:
- DNSSEC 可以帮助验证结果是不是权威链路签名过的。
- DNSSEC 不负责隐藏你查询了哪个域名。
- DoH / DoT 负责加密查询传输,但不自动证明记录一定没被权威侧错误配置。
面试里可以这样答:DNSSEC、DoH、DoT 解决的问题不同,一个偏结果验证,一个偏传输加密,不能混为一谈。
DNS 被劫持时怎么处理
DNS 被劫持时,不要只盯着域名记录本身,要先判断问题发生在哪一层:本机、路由器、递归 DNS、中间网络,还是权威 DNS 配置源头。
可以先对比不同位置的解析结果:
如果本机默认 DNS 返回异常 IP,但公共递归 DNS 或权威链路返回正常,通常说明问题在本机、路由器、运营商 DNS 或中间网络。如果直接问权威 DNS 也返回错误结果,那就不是普通链路劫持,而是权威 DNS 配置、DNS 服务商账号或域名注册商账号可能出了问题。
常见处理方式包括:
- 检查
hosts文件,确认没有被写入错误映射。 - 清理浏览器、操作系统和应用进程里的 DNS 缓存。
- 更换可信递归 DNS,例如公共 DNS 或公司可信 DNS。
- 开启 DoH / DoT,降低 DNS 查询在中间网络被监听或篡改的风险。
- 检查路由器 DNS 配置,确认上游 DNS 没有被恶意修改。
- 检查权威 DNS 配置和域名账号安全,确认记录没有被错误修改。
- 依赖 HTTPS 证书校验兜底,避免用户在解析到错误 IP 后继续访问伪造站点。
这里要注意:HTTPS 不能阻止 DNS 被篡改,但能在访问错误站点时发现证书和域名不匹配,从而降低用户被带到钓鱼站的风险。
DNS 结果验证
掌握 DNS 不能只会描述链路,还要知道怎么验证。排查时常用 dig 或 nslookup,其中 dig 信息更完整。
查询默认递归 DNS 的结果:
查询指定记录类型:
指定递归 DNS 查询,方便比较不同递归 DNS 的缓存结果:
直接追踪完整迭代链路:
看权威 DNS 的结果:
如果默认递归 DNS 返回旧 IP,但权威 DNS 已经返回新 IP,通常说明递归 DNS 或客户端还有缓存。如果权威 DNS 自己也返回错,说明配置源头就有问题。
一分钟回答模板
DNS 是分布式域名系统,用来把域名解析成网络连接需要的 IP 地址。浏览器访问域名时,会先查浏览器、操作系统、hosts 和递归 DNS 缓存;没有缓存时,递归 DNS 会通过迭代查询依次询问根 DNS、顶级域 DNS 和权威 DNS。权威 DNS 返回 A、AAAA、CNAME 等记录,递归 DNS 按 TTL 缓存后再返回给客户端。客户端拿到 IP 后,用 IP 和端口建立 TCP 或 QUIC 连接;HTTPS 还会通过 SNI 和证书校验域名。DNS 不是简单的一对一映射,一个域名可以对应多个 IP,多个域名也可以共用一个 IP,CDN 还会通过 DNS 调度返回合适的边缘节点。排查 DNS 问题时,要比较本地、递归 DNS 和权威 DNS 的结果,并区分解析问题、缓存问题、CDN 调度问题,以及解析之后的 TCP、TLS、HTTP 问题。
高频追问
DNS 查询完整过程是什么?
先查本地缓存,包括浏览器、操作系统、hosts 等;没有命中时,请求递归 DNS。递归 DNS 如果也没有缓存,就从根 DNS 开始迭代查询,依次找到顶级域 DNS 和权威 DNS,最终拿到记录并返回客户端。
关键点是:客户端通常只和递归 DNS 交互,真正一路问下去的是递归 DNS。
递归查询和迭代查询有什么区别?
递归查询要求对方给最终答案,典型场景是客户端问递归 DNS。迭代查询只返回下一步线索,典型场景是递归 DNS 问根 DNS、顶级域 DNS。
可以简单记:递归是“你帮我查到底”,迭代是“你告诉我下一步问谁”。
根 DNS 会返回 www.example.com 的 IP 吗?
通常不会。根 DNS 只知道顶级域由谁负责,例如 .com 应该问哪些顶级域 DNS。.com 顶级域 DNS 再告诉递归 DNS,example.com 应该问哪些权威 DNS。真正返回 www.example.com 业务记录的是权威 DNS。
CNAME 和 A 记录有什么区别?
A 记录直接返回 IPv4 地址,AAAA 返回 IPv6 地址;CNAME 返回另一个域名。解析到 CNAME 后,还要继续解析目标域名,直到得到 A 或 AAAA。
为什么根域名通常不能直接配置 CNAME?
因为一个名字配置 CNAME 后,通常不能再同时配置其他记录;而根域名必须有 NS、SOA 等记录。很多 DNS 服务商提供的 ALIAS、ANAME 或 CNAME Flattening,是服务商侧的兼容能力,不等同于标准 CNAME。
DNS 缓存和 HTTP 缓存有什么区别?
DNS 缓存缓存的是“域名到记录”的解析结果,由 TTL 控制,例如 www.example.com -> 203.0.113.10。HTTP 缓存缓存的是响应资源,由 Cache-Control、ETag、Last-Modified 等控制,例如 HTML、JS、CSS、图片。
DNS 缓存命中后,浏览器还要继续建立连接并发送 HTTP 请求;HTTP 缓存命中时,某些资源可能不需要重新下载。
TTL 越短越好吗?
不是。TTL 短可以让变更和故障切换更快生效,但会增加 DNS 查询次数和权威 DNS 压力,也可能增加用户解析延迟。TTL 长可以提升缓存命中率,但迁移和容灾生效更慢。
实际项目里通常根据业务稳定性设置。迁移前可以提前降低 TTL,切换稳定后再调回合理值。
为什么改了 DNS 记录,有些用户还访问旧 IP?
因为旧记录可能还在浏览器、操作系统、递归 DNS 或应用进程缓存中,TTL 没过期前不会立即重新查询。还有些递归 DNS 或客户端可能有自己的缓存策略,不一定完全按预期刷新。
一个域名为什么能返回多个 IP?
可以用于负载均衡、容灾和多地域接入。DNS 返回多个 A/AAAA 后,客户端或系统会选择其中一个地址连接;如果某个地址不可用,客户端可能尝试下一个地址。
但 DNS 轮询不是精确的负载均衡,因为缓存、客户端选择策略、递归 DNS 行为都会影响实际流量分布。
多个域名为什么能共用同一个 IP?
因为 TCP 连接只需要 IP 和端口,但应用层还能携带域名。HTTP 请求里的 Host 表明访问哪个站点;HTTPS 握手里的 SNI 表明需要哪个域名的证书。
CDN 如何通过 DNS 调度用户?
业务域名通常 CNAME 到 CDN 厂商的调度域名。递归 DNS 查询这个调度域名时,CDN 的权威 DNS 会根据地域、运营商、递归 DNS 出口、EDNS Client Subnet、节点负载和健康状态等因素,返回一个合适的边缘节点 IP。
DNS 劫持和污染有什么区别?
两者都可能导致域名解析到错误 IP。DNS 劫持更强调查询被中间网络、路由器、恶意软件或不可信 DNS 服务接管并返回错误结果;DNS 污染更强调链路中注入伪造 DNS 响应,让客户端接受假答案。
防护思路包括使用可信递归 DNS、DoH/DoT、HTTPS 证书校验,以及在更高安全要求下使用 DNSSEC。
DNSSEC、DoH、DoT 有什么区别?
DNSSEC 验证 DNS 结果是否被篡改,解决的是完整性和来源验证。DoH 和 DoT 加密 DNS 查询传输,解决的是查询过程被监听或篡改的风险。
简单说:DNSSEC 管“答案是否可信”,DoH/DoT 管“查询传输是否加密”。
DNS 解析成功,为什么网站还是打不开?
因为 DNS 只完成了域名到地址的解析。拿到 IP 之后,还可能在 TCP 建连、TLS 握手、证书校验、HTTP 请求、CDN 回源、服务端处理等环节失败。
所以排查时要分层:先看解析结果是否正确,再看 IP 是否可连,再看 TLS 证书是否匹配,最后看 HTTP 状态码和服务端响应。
面试官问“你怎么证明是 DNS 问题”时怎么答?
先用 dig 看本机默认递归 DNS 返回什么,再指定公共递归 DNS 比较结果,例如 dig @8.8.8.8 example.com。如果怀疑权威配置问题,就查 NS 记录并直接问权威 DNS。若不同递归 DNS 返回不一致,多半是缓存或调度差异;若权威 DNS 已经错了,就是源头配置问题。

