找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

370

积分

0

好友

34

主题
发表于 昨天 06:05 | 查看: 4| 回复: 0

前端面试经常被问的题目:从浏览器输入一个域名,到最后的页面呈现,中间到底经历了什么?

本文将深入探讨“域名解析”部分,帮你彻底理清解析过程与相关核心概念。

从“域名到渲染”的全过程

先快速梳理关键三步:

第 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地址并返回给用户。

具体查询层级如下:

  1. 查询根域名服务器:递归解析器询问根服务器目标域名的IP。根服务器不直接答复,而是返回对应顶级域(如.com)的服务器地址。
  2. 查询顶级域名服务器:递归解析器继续向.com服务器询问。顶级域服务器返回该域名所属的权威域名服务器地址。
  3. 查询权威域名服务器:递归解析器最终向权威服务器询问,并获得具体的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 地址



上一篇:ueli跨平台键盘启动器深度体验:开源8年的效率工具核心功能解析
下一篇:Kafka生产集群部署实战指南:从系统调优到参数配置全面解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-11 04:41 , Processed in 0.098253 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表