前端面试经常被问的题目:从浏览器输入一个域名,到最后的页面呈现,中间到底经历了什么?
本文将深入探讨“域名解析”部分,帮你彻底理清解析过程与相关核心概念。
从“域名到渲染”的全过程
先快速梳理关键三步:
第 1 步:域名解析 → 拿到 IP 地址
- 检查浏览器缓存
- 检查操作系统缓存(通过
ipconfig /flushdns可清理)
- 向本地域名服务器查询(如运营商或公共DNS:8.8.8.8、1.1.1.1等)
- 发起递归查询
第 2 步:建立连接 → 下载 HTML 文档
- 建立 TCP 连接(三次握手)
- 若为 HTTPS 则进行 TLS 握手
- 发送 HTTP 请求
- 服务器返回 HTML 文档
第 3 步:HTML 解析 → 呈现 UI 效果
- 构建 DOM 树
- 下载并解析 CSS 为 CSSOM
- 下载并执行 JS(async/defer 属性可避免阻塞)
- 异步加载图片等资源
- 生成渲染树(Render Tree = DOM + CSSOM)
- 布局(回流)
- 绘制(重绘)
- 合成并显示到屏幕
记住这三个步骤及其关键字,足以应对多数面试场景。接下来,我们聚焦于 DNS 解析的详细原理。
DNS 解析原理
本地 DNS 缓存
查询优先级从高到低依次为:
- hosts 文件
- 浏览器缓存
- 系统缓存
- 路由器缓存
- 运营商缓存
hosts 文件是开发中最常使用的本地域名映射工具。
浏览器 DNS 缓存通常存储在内存中,有效期很短。
系统缓存可以通过ipconfig /flushdns(Windows)等命令清理。
如果域名记录被修改,本地缓存如何感知更新呢?
TTL 缓存有效期
TTL(Time To Live)定义了DNS记录的“有效期”,它告知各级缓存该解析结果最多可以保存多久。各级缓存通常会严格遵守TTL约定。在配置DNS解析记录时,可以手动指定TTL值。
如果域名不常变更,适当延长TTL可以减少递归查询,提升访问速度。
递归查询
首次访问某域名或缓存过期时,会触发递归查询(Recursive Query)。递归解析服务器会自动完成层层“向上查询”,直至获取最终IP地址并返回给用户。
具体查询层级如下:
- 查询根域名服务器:递归解析器询问根服务器目标域名的IP。根服务器不直接答复,而是返回对应顶级域(如
.com)的服务器地址。
- 查询顶级域名服务器:递归解析器继续向
.com服务器询问。顶级域服务器返回该域名所属的权威域名服务器地址。
- 查询权威域名服务器:递归解析器最终向权威服务器询问,并获得具体的IP地址。
可以看到,每次查询范围都在缩小,最终提供IP答案的是权威域名服务器。
核心概念梳理:
- 递归解析服务器:替你完成整个查询过程的服务器(如运营商DNS、8.8.8.8)。
- 根域名服务器:管理所有顶级域(如
.com、.net)服务器地址。
- 顶级域名服务器:管理特定顶级域(如
.com)下所有域名的权威服务器地址。
- 权威域名服务器:直接管理具体域名解析记录的服务器。
权威域名服务器
因此,权威域名服务器才是你域名记录的真实存放处,并且它必须获得顶级域名服务器的认可。
在阿里云、腾讯云等平台注册域名时,默认会使用其提供的权威服务器。配置DNS解析记录,就需要到对应的云平台进行操作。
能否更改权威域名服务器?
当然可以。你无需迁移域名服务商,只需修改域名的 NS 记录,指向新的权威服务器即可。此后,DNS解析记录就需在新服务商处进行管理。
👉 查看权威域名服务器
使用nslookup命令可以查看任何域名的权威服务器:
nslookup -type=ns github.com
👉 查询 IP 地址
直接查询域名的解析记录:
nslookup github.com
例如,可查到github.com对应的IP是20.205.243.166。
👉 直接使用权威服务器查询 IP
获取权威服务器地址后,可以直接向其查询,绕过递归解析器:
nslookup github.com dns4.p08.nsone.net
此时,结果中不再显示“Non-authoritative answer”,因为这是来自权威源头的应答。
👉 指定第三方解析器查询
nslookup github.com 1.1.1.1
细心的读者会发现,使用1.1.1.1查到的IP可能与之前不同。这很正常,因为大型网站在全球部署了多台服务器,不同位置的DNS解析器会根据策略返回不同的IP,以实现负载均衡或就近访问。
DNS 相关问答
❓ 如果一个域名配置的是 CNAME 记录,又是怎样解析的呢?
我们直接通过命令查看:
nslookup unoapi.codingmo.com
通常会看到多条记录:第一条是你配置的CNAME,后续则是递归解析器自动追查该CNAME目标域名所得到的IP地址。解析器发现结果是别名而非IP时,会自动发起新一轮递归查询,直至获得IP。
❓ 如果 CNAME 记录相互循环引用了,会怎样?
例如:域名 A 的 CNAME 指向域名 B,域名 B 的 CNAME 又指回域名 A。测试时,查询过程会持续数秒,最终提示查询超时,不会返回任何有效记录。
❓ 操作系统中配置的 DNS 有什么用?
这里配置的正是递归解析服务器地址。它是你信任的、能帮你完成完整域名查询的服务器。通常设备会从路由器自动获取DNS(一般为运营商提供),用户也可以手动修改为如8.8.8.8(Google)或1.1.1.1(Cloudflare)等第三方公共DNS,有时在Linux运维或网络调试中会进行此类配置,它们通常被认为更快速或更安全。
总结
核心要点总结:
- 域名解析优先使用各级本地缓存。
- 缓存未命中时,通过递归解析器进行查询。
- 递归解析涉及两个核心角色:
- 权威域名服务器:存储域名的最终解析记录。
- 递归解析服务器:代表用户完成查询过程的“代理”。
- 完整的递归解析流程为:
递归解析器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器 → 返回 IP 地址