DNS 解析与浏览器输入 URL 后发生了什么
一、先说结论
如果面试官问“在浏览器输入一个 URL 到页面展示,中间发生了什么”,可以先抓住主线:
- 浏览器解析 URL
- 查询缓存与 DNS 解析域名
- 建立连接(TCP 或 QUIC)
- 如果是 HTTPS,再做 TLS 握手
- 发送 HTTP 请求
- 服务端处理并返回响应
- 浏览器解析 HTML、CSS、JS,最终渲染页面
而如果单独问 DNS,则核心就是:
把域名解析成 IP 地址。
二、DNS 的作用是什么
DNS,Domain Name System,域名系统。
它的作用可以概括成一句话:
把人类更容易记住的域名,翻译成机器真正通信需要的 IP 地址。
例如:
- 你输入的是
www.baidu.com - 机器真正需要的是一个 IP 地址
因为网络层通信最终还是靠:
- IPv4 地址
- 或 IPv6 地址
所以没有 DNS,大多数用户几乎没法正常使用互联网。
三、一次 DNS 解析大致流程是什么
1. 先查本地能不能直接命中
浏览器或操作系统并不会每次都直接去问远端 DNS,而是会先查本地已有结果。
常见顺序可以这样理解:
- 浏览器缓存
- 操作系统缓存
- hosts 文件
- 本地 DNS 解析器缓存
如果前面任何一步命中了,就可以直接拿到 IP,不必再继续往外问。
2. 客户端把问题交给本地 DNS
如果本地都没命中,客户端通常会把查询交给:
本地 DNS 服务器
它可能来自:
- 路由器
- 运营商 DNS
- 公共 DNS(如 8.8.8.8)
- 公司内部 DNS
这里有一个很容易考的点:
- 客户端到本地 DNS:通常是递归查询
- 本地 DNS 到根/TLD/权威 DNS:通常是迭代查询
3. 本地 DNS 去问根服务器
本地 DNS 如果没有缓存,就会去问:
根域名服务器
根服务器一般不会直接告诉你最终 IP,而是告诉你:
“这个域名你应该继续去问哪个顶级域名服务器。”
比如访问的是 .com 域名,它就会返回对应 .com 顶级域服务器的信息。
4. 本地 DNS 去问顶级域名服务器
本地 DNS 再去问:
顶级域名服务器(TLD DNS)
比如:
.com.cn.net
TLD 服务器同样一般也不会直接给最终 IP,而是告诉你:
“这个具体域名你应该继续去问哪台权威 DNS 服务器。”
5. 本地 DNS 去问权威 DNS
本地 DNS 最后去问:
权威 DNS 服务器
权威 DNS 才真正掌握该域名的权威记录,比如:
- A 记录
- AAAA 记录
- CNAME 记录
这时本地 DNS 就能拿到最终结果,并返回给客户端。
6. 结果返回并缓存
客户端拿到 IP 后:
- 会继续建立连接
- 本地 DNS 和客户端也通常会缓存结果一段时间
这样下次再访问同一个域名时,就不一定要重新走完整解析流程了。
四、递归查询和迭代查询怎么区分
这个问题面试里非常高频。
1. 递归查询
客户端问本地 DNS:
“你帮我把最终答案查出来。”
客户端不关心中间过程,只要最终结果。
2. 迭代查询
本地 DNS 继续往外查时,是一种“你告诉我下一步该问谁”的模式。
例如:
- 根服务器说:去问
.com .com服务器说:去问权威 DNS- 权威 DNS 才给最终记录
所以迭代查询更像:
层层指路
五、在浏览器输入一个 URL 到页面展示,中间发生了什么
这题面试里几乎是综合题,建议按阶段讲。
1. 解析 URL
浏览器先解析用户输入的 URL,确定:
- 使用什么协议(HTTP / HTTPS)
- 目标域名是什么
- 目标端口是什么
- 路径是什么
例如:
https://www.example.com:443/path?a=1会拆出:
- 协议:HTTPS
- 域名:
www.example.com - 端口:443(默认)
- 路径:
/path?a=1
2. 查缓存和做 DNS 解析
浏览器会先查:
- 浏览器缓存
- 操作系统缓存
- hosts 文件
- 本地 DNS 缓存
如果都没有,就进入前面讲的 DNS 解析流程,最终得到目标 IP。
3. 建立连接
拿到 IP 后,浏览器开始建立网络连接。
如果是 HTTP/1.1、HTTP/2 常见场景
通常是:
- TCP 三次握手
如果是 HTTPS
则一般是:
- TCP 三次握手
- TLS 握手
如果是 HTTP/3
则通常是:
- QUIC / TLS 建连
4. 发送 HTTP 请求
连接建立后,浏览器构造请求报文并发送给服务端。
例如:
GET / HTTP/1.1
Host: www.example.com
User-Agent: ...
Cookie: ...5. 服务端处理请求
服务端收到请求后,会经过一系列后端处理,例如:
- 路由匹配
- 业务逻辑执行
- 缓存查询
- 数据库访问
- 模板渲染或 JSON 序列化
然后返回 HTTP 响应。
6. 浏览器接收响应
浏览器接收到响应后,会判断:
- 状态码
- Content-Type
- 缓存相关头
- 是否需要重定向
- 是否还要继续发起其他资源请求
如果 HTML 里还引用了:
- CSS
- JS
- 图片
- 字体
浏览器还会继续发出更多请求获取这些资源。
7. 浏览器渲染页面
渲染过程可以粗略理解为:
- 解析 HTML,生成 DOM
- 解析 CSS,生成 CSSOM
- 合成渲染树
- 布局(Layout)
- 绘制(Paint)
- 合成显示到屏幕上
JavaScript 在某些情况下还会影响:
- DOM 构建
- 样式计算
- 页面重排和重绘
所以页面展示并不是“收到了 HTML 就立刻全部显示”,而是一个解析和渲染的过程。
六、为什么浏览器访问一个页面常常不止一次请求
因为一个网页通常不是只有一份 HTML。
它还可能依赖:
- CSS
- JavaScript
- 图片
- 字体
- 接口数据
所以实际过程往往是:
- 先请求 HTML
- 浏览器解析 HTML
- 发现更多资源引用
- 再继续请求这些资源
- 页面逐步完整展示
这也是为什么前面讲 HTTP 演进时,总会提到:
- 长连接
- 多路复用
- 头部压缩
- CDN
因为它们都直接影响页面加载体验。
七、几个常见追问
1. 浏览器输入 URL 后一定会先 DNS 吗?
不一定。
如果:
- 浏览器缓存命中
- 操作系统缓存命中
- hosts 文件有记录
那就不一定真的往外做 DNS 查询。
2. ping 通了,网页一定能打开吗?
不一定。
因为:
- ping 依赖的是 ICMP
- 浏览器访问网页依赖的是 TCP/HTTPS/HTTP
ICMP 通,不代表业务端口就一定正常。
3. DNS 查到 IP 后就一定能访问成功吗?
也不一定。
后面还可能失败在:
- TCP 建连
- TLS 握手
- 服务端超时
- 应用层异常
所以 DNS 成功只是“第一步成功”。
八、面试版回答
如果面试官问“DNS 的作用和一次域名解析过程”,可以这么答:
DNS 的作用是把域名解析成 IP 地址。一次解析时,客户端通常会先查询浏览器缓存、操作系统缓存、hosts 文件以及本地 DNS 缓存;如果都没有命中,就会向本地 DNS 服务器发起递归查询。本地 DNS 若没有缓存,则会向根域名服务器发起查询,根服务器返回对应的顶级域名服务器地址;本地 DNS 再去询问顶级域名服务器,顶级域名服务器再返回该域名对应的权威 DNS 服务器地址;最后本地 DNS 向权威 DNS 查询到最终 IP 并返回给客户端。这里客户端到本地 DNS 一般是递归查询,本地 DNS 向根、顶级域、权威 DNS 继续查询一般是迭代查询。
如果面试官问“浏览器输入 URL 到页面展示发生了什么”,可以这样答:
浏览器首先解析 URL,然后检查浏览器缓存、操作系统缓存和 DNS 缓存,必要时完成域名解析得到 IP;接着与服务端建立连接,如果是 HTTPS 还要进行 TLS 握手;随后浏览器发送 HTTP 请求,服务端处理后返回响应;浏览器收到 HTML 后会继续解析其中引用的 CSS、JS、图片等资源,并发起更多请求,最终通过 DOM 构建、CSSOM 构建、布局和绘制等步骤把页面渲染出来。
九、一句话总结
DNS 负责“把名字翻译成地址”,浏览器访问页面则是在“拿到地址之后,把连接、请求、响应和渲染整条链路跑完”。
