当我们在浏览器地址栏输入一个 URL 并按下回车,页面加载的过程中会涉及多个关键步骤,包括 DNS 解析、TCP 连接、HTTP 请求、服务器处理、浏览器渲染 等。下面是详细的执行流程:
🔹 1. 用户输入 URL
用户在浏览器地址栏输入一个 URL,例如:
https://www.example.com
如果 URL 没有协议(如
http://
或https://
),浏览器会默认补充http://
或https://
。如果只输入关键字(如
example
),浏览器会使用默认搜索引擎查询。如果之前访问过,浏览器可能直接从缓存加载(强缓存 / 协商缓存)。
🔹 2. 浏览器进行 DNS 解析
目标:找到
www.example.com
对应的 IP 地址
浏览器首先检查是否已有缓存:
浏览器缓存(DNS 解析缓存)
操作系统缓存(
/etc/hosts
或C:\Windows\System32\drivers\etc\hosts
)路由器缓存(路由器可能有 DNS 解析缓存)
ISP DNS 服务器(向本地 ISP 运营商的 DNS 服务器查询)
根 DNS 服务器 → 顶级域名服务器(TLD) → 权威 DNS 服务器,最终获取 IP 地址。
最终,www.example.com
被解析为 IP 地址,例如:
93.184.216.34
🔹 3. 建立 TCP 连接(三次握手)
目标:客户端与服务器建立可靠的 TCP 连接
浏览器通过 TCP 三次握手 与服务器建立连接:
客户端发送 SYN(请求建立连接)
服务器返回 SYN-ACK(确认连接请求)
客户端返回 ACK(连接建立)
如果是 HTTPS,还需要进行 TLS/SSL 握手:
服务器提供 SSL 证书,客户端验证证书有效性(防止中间人攻击)。
双方协商加密算法,交换密钥,确保数据安全。
🔹 4. 发送 HTTP 请求
目标:浏览器请求服务器上的页面资源
浏览器向服务器发送 HTTP 请求,例如:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
关键部分:
GET
:请求方法(也可能是POST
、PUT
、DELETE
)。Host: www.example.com
:服务器主机名(虚拟主机)。User-Agent
:浏览器信息。Accept
:告诉服务器客户端希望接收的资源类型。Connection: keep-alive
:保持 TCP 连接,避免重复建立连接。
🔹 5. 服务器处理请求
目标:服务器解析请求,并返回对应的 HTML 页面
服务器收到请求后,执行以下操作:
查找缓存(CDN / 服务器缓存 / 代理缓存)。
请求静态资源(如果请求的是 HTML、CSS、JS、图片)。
执行动态代码(如 PHP、Node.js、Python 生成 HTML)。
访问数据库(如 MySQL、MongoDB)查询数据并返回页面。
生成 HTTP 响应,例如:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Cache-Control: max-age=3600
并返回 HTML 内容。
🔹 6. 浏览器解析 HTML
目标:浏览器解析 HTML 结构,构建页面
浏览器解析 HTML 页面时,执行以下步骤:
解析 HTML,构建 DOM 树
解析 CSS,生成 CSSOM 树
解析 JavaScript
如果
script
不是async/defer
,会 阻塞解析async
:异步加载并立即执行defer
:异步加载,等 HTML 解析完成后执行
合并 DOM 和 CSSOM,构建渲染树
计算布局(Layout)
确定元素的大小、位置
绘制(Painting)
将元素渲染到屏幕
🔹 7. 加载外部资源
目标:加载 CSS、JS、图片等外部资源
CSS:影响页面布局,会阻塞渲染(但不会阻塞 HTML 解析)。
JS:
可能修改 DOM(导致重排)。
async
/defer
可优化加载顺序。
图片、视频、字体:
通过 Lazy Loading 延迟加载,提高性能。
🔹 8. 浏览器渲染页面
最终,浏览器将渲染完成的页面 绘制到屏幕:
栅格化(分成像素块)。
合成图层(不同层级合成)。
GPU 加速(硬件加速渲染)。
🔹 9. 用户交互 & 浏览器事件
JS 监听用户事件(点击、滚动等)。
浏览器根据用户操作重新渲染页面(如
requestAnimationFrame
)。回流(Reflow)和重绘(Repaint):
回流:布局改变(影响性能)。
重绘:颜色、阴影等改变(较轻量)。
🚀 关键优化点
使用 CDN 加速(减少 DNS 解析时间)。
开启 HTTP/2(支持多路复用,减少 TCP 连接)。
开启 Gzip 压缩(减少 HTML/CSS/JS 体积)。
利用缓存(
Cache-Control
、ETag
)。减少 DOM 操作(避免回流、重绘)。
懒加载 & 代码拆分(按需加载资源)。
💡 总结:输入 URL 到页面展示的完整流程
步骤 | 过程 |
---|---|
1. 输入 URL | 用户在浏览器地址栏输入 URL |
2. DNS 解析 | 获取域名对应的 IP 地址 |
3. TCP 连接 | 三次握手建立 TCP 连接(HTTPS 需要 TLS 握手) |
4. 发送 HTTP 请求 | 浏览器向服务器请求 HTML 页面 |
5. 服务器处理请求 | 服务器查询数据库 / 读取缓存,并返回 HTML |
6. 浏览器解析 HTML | 解析 DOM、CSSOM、执行 JS,构建渲染树 |
7. 加载外部资源 | 加载 CSS、JS、图片等 |
8. 渲染页面 | 计算布局,绘制到屏幕 |
9. 用户交互 | 监听点击、滚动等事件,并更新 UI |
🎯 面试官可能的追问
✅ 面试官:DNS 解析过程中有哪些优化手段?
回答:
使用 DNS 预解析(
<link rel="dns-prefetch" href="//example.com">
)。使用 CDN,让用户访问最近的服务器。
配置 本地 hosts 文件,减少 DNS 查询时间。
✅ 面试官:如何优化浏览器渲染性能?
回答:
减少回流(Reflow):避免频繁修改 DOM 结构。
使用
requestAnimationFrame
:优化动画流畅度。使用
will-change
:让 GPU 预渲染关键元素。
✅ 面试官:为什么 JS 可能会阻塞页面渲染?
回答:
JS 可能修改 DOM,浏览器必须先执行 JS,再继续解析 HTML。
解决方案:使用
async
/defer
,或将 JS 放在body
末尾。
💡 总结
输入 URL 到页面展示的过程涉及 DNS 解析、TCP 连接、HTTP 请求、服务器处理、浏览器解析和渲染等多个步骤。通过优化缓存、CDN、HTTP/2 和浏览器渲染策略,可以极大提高页面加载速度!🚀
最后: