2、DNS协议 是什么?说说DNS 解析详细流程?
目录
DNS 这道题在面试中通常作为"输入 URL 到页面展示"的深挖题出现,能把 DNS 讲清楚的候选人,会让面试官感受到你对底层网络协议有真实的理解,而不只是背八股。
一、 第一层:核心定义(先建立认知框架)
"DNS(Domain Name System,域名系统)本质上是一个分布式的、层级化的命名系统,它的核心职责就是把人类可读的域名(如
www.example.com)翻译成机器可识别的 IP 地址(如93.184.216.34)。"

为什么需要 DNS?
- IP 地址难以记忆
- 域名与 IP 解耦,IP 变更时用户无感知
- 支持负载均衡、CDN 调度、容灾切换
DNS 基本特性
- 基于 UDP 协议,端口号 53
- 数据包较大时(超过 512 字节)会降级为 TCP
- 采用树状层级结构管理全球域名
二、 第二层:DNS 的层级结构(理解架构)
DNS 是一棵倒置的树:
.(根域)
/ | \
.com .cn .org (顶级域 TLD)
/
example.com (二级域)
/
www.example.com (子域)
三类关键服务器
| 服务器类型 | 职责 |
|---|---|
| 根域名服务器 | 全球共 13 组,知道所有顶级域(.com/.cn)的地址 |
| 顶级域名服务器(TLD) | 管理 .com、.cn 等顶级域,知道下一级权威服务器 |
| 权威域名服务器 | 存储某个具体域名的真实 IP 映射关系 |
| 本地 DNS 服务器(递归解析器) | 由 ISP 或企业提供,替用户做递归查询 |
三、 第三层:DNS 完整解析流程(面试核心)
以查询 www.example.com 为例,完整流程如下:
Step 1:检查浏览器 DNS 缓存
- 浏览器自身会缓存 DNS 查询结果
- 缓存时效由 TTL(Time To Live) 决定
- Chrome 可在
chrome://net-internals/#dns查看
Step 2:检查操作系统缓存
- 操作系统维护自己的 DNS 缓存
- 同时查找本地 hosts 文件(
/etc/hosts或C:\Windows\System32\drivers\etc\hosts) - hosts 文件优先级高于 DNS 查询
Step 3:查询本地 DNS 服务器(递归解析器)
- 如果前两步未命中,系统向配置的 本地 DNS 服务器 发起查询
- 这台服务器通常由运营商(ISP)或公共 DNS(如
8.8.8.8)提供 - 如果本地 DNS 有缓存,直接返回结果,流程结束
Step 4:本地 DNS 服务器发起迭代查询
这是整个流程的核心,本地 DNS 会依次向上游服务器发起查询:
① 本地 DNS → 根域名服务器
询问:www.example.com 在哪里?
回答:我不知道,去问 .com 顶级域名服务器,地址是 xxx
② 本地 DNS → .com 顶级域名服务器
询问:www.example.com 在哪里?
回答:我不知道,去问 example.com 的权威服务器,地址是 xxx
③ 本地 DNS → example.com 权威域名服务器
询问:www.example.com 的 IP 是多少?
回答:IP 是 93.184.216.34,TTL 是 300 秒
Step 5:返回结果并缓存
- 本地 DNS 将结果返回给客户端
- 同时根据 TTL 将结果缓存,下次直接命中
完整流程图
浏览器
↓ 未命中缓存
操作系统缓存 / hosts 文件
↓ 未命中
本地 DNS 服务器(递归解析器)
↓ 未命中缓存,发起迭代查询
根域名服务器 → 返回 TLD 服务器地址
↓
顶级域名服务器(.com)→ 返回权威服务器地址
↓
权威域名服务器 → 返回真实 IP
↓
本地 DNS 缓存结果,返回给浏览器
↓
浏览器拿到 IP,建立 TCP 连接
四、 第四层:面试加分点(展现高阶认知)
1. 递归查询 vs 迭代查询的区别
- 递归查询:客户端发一次请求,由本地 DNS 全权代理查询,最终返回结果(客户端到本地 DNS 是递归)
- 迭代查询:每次只返回下一步该去哪里问,由本地 DNS 自己逐步问下去(本地 DNS 到上游是迭代)
2. TTL 的工程意义
- TTL 设置越短,DNS 切换生效越快,但查询压力越大
- 大型变更前(如机房迁移)通常提前将 TTL 缩短,变更后再恢复
- CDN 节点通常 TTL 设置较短,方便动态调度
3. DNS 负载均衡
- 权威 DNS 可以对同一个域名返回多个 IP
- 客户端通常选择第一个,或实现轮询
- 这是最简单的全局负载均衡方式
4. HTTPDNS(移动端常用)
- 传统 DNS 基于 UDP,容易被运营商劫持(返回错误 IP)
- HTTPDNS 通过 HTTP/HTTPS 直接向 DNS 服务商查询,绕过运营商
- 大厂 App 普遍使用,防劫持、精准调度
5. DNS 预解析(前端性能优化)
<!-- 提前解析可能用到的域名,减少后续请求延迟 -->
<link rel="dns-prefetch" href="//cdn.example.com">
6. DNS 安全(DNSSEC)
- 传统 DNS 没有验证机制,存在 DNS 劫持和欺骗风险
- DNSSEC 通过数字签名验证 DNS 数据的完整性
- 但部署复杂,目前普及率还不高
五、 常见 DNS 记录类型
| 记录类型 | 含义 |
|---|---|
| A 记录 | 域名 → IPv4 地址 |
| AAAA 记录 | 域名 → IPv6 地址 |
| CNAME 记录 | 域名 → 另一个域名(别名) |
| MX 记录 | 邮件服务器地址 |
| TXT 记录 | 文本信息,常用于验证域名所有权 |
| NS 记录 | 指定该域名的权威 DNS 服务器 |
六、 面试简答模板(建议直接背诵)
面试官:说说 DNS 是什么以及它的解析流程?
回答模板:
"DNS 是域名系统,本质上是互联网的'电话簿',它把便于记忆的域名映射成机器可识别的 IP 地址。
它的架构是一棵层级树,分为根域名服务器、顶级域名服务器和权威域名服务器三层,由全球分布式节点共同维护。
解析流程我会分五步来说:
第一步,查浏览器自身的 DNS 缓存;第二步,查操作系统缓存和 hosts 文件;第三步,向本地 DNS 服务器(即递归解析器,通常是运营商或公共 DNS)发起查询;如果本地 DNS 也没有缓存,第四步,由本地 DNS 代替客户端发起迭代查询,依次问根域名服务器、TLD 服务器、权威服务器,最终拿到真实 IP;第五步,本地 DNS 把结果按照 TTL 缓存并返回给浏览器。
在工程实践上,有几个点我会特别关注:
一是 TTL 的设置,它直接影响 DNS 变更的生效速度,大规模迁移前通常要提前压低 TTL;二是 HTTPDNS,它通过 HTTP 协议直接请求 DNS,绕过运营商 UDP 劫持,是大厂 App 的标配方案;三是前端性能层面的 DNS 预解析,通过
dns-prefetch提前解析第三方域名,减少首次请求延迟。"
七、 面试官常见追问
| 追问 | 答题方向 |
|---|---|
| "DNS 用的是 TCP 还是 UDP?" | 默认 UDP 53,超过 512 字节切换 TCP |
| "什么是 DNS 污染 / 劫持?" | 运营商篡改 DNS 返回结果,HTTPDNS 是解法 |
| "TTL 设为 0 会怎样?" | 每次都实时查询,无缓存,查询压力大但切换最快 |
| "CNAME 和 A 记录的区别?" | A 记录直接映射 IP,CNAME 是别名指向另一个域名 |
| "为什么根域名服务器只有 13 组?" | 历史和协议限制(UDP 512 字节),实际通过 Anycast 扩展了物理节点数 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)