浏览器从输入URL到页面展示流程详解

33 阅读3分钟

有一个经典的前端面试题,几乎每次我去面试都会被问到,那就是:在浏览器从输入URL到页面展示出来,经过了什么?今天我们就把这个问题拿出来详细聊聊。

在浏览器中输入URL到页面展示的完整过程涉及多个步骤,涵盖网络通信、资源加载和渲染机制。以下是详细流程:


1. URL解析

  • 输入处理:判断输入是URL还是搜索内容。非完整URL时,浏览器使用默认搜索引擎处理。
  • 解析URL:分解出协议(HTTP/HTTPS)、域名、端口、路径、查询参数等。若省略协议,浏览器自动补全(如http://)。

2. DNS查询(域名解析)

  • 缓存检查:依次查询浏览器缓存 → 系统缓存(如hosts文件) → 路由器缓存 → ISP的DNS缓存。
  • 递归查询:若缓存未命中,浏览器向本地DNS服务器发起请求,按层级查询(根域名 → 顶级域名 → 权威域名服务器),最终获取IP地址。
  • DNS优化:DNS预解析(<link rel="dns-prefetch">)可提前解析域名。

3. 建立TCP连接

  • 三次握手

    1. 客户端发送SYN(同步)包。
    2. 服务器返回SYN-ACK(同步-确认)包。
    3. 客户端发送ACK(确认)包,连接建立。
  • HTTPS加密:若为HTTPS,需额外TLS握手:

    • 协商加密套件,验证证书(CA链、有效期、域名匹配)。
    • 通过非对称加密交换密钥,生成会话密钥用于对称加密。

4. 发送HTTP请求

  • 构造请求报文:包含请求方法(GET/POST)、路径、协议版本、头部(User-Agent、Accept、Cookie等)。
  • 请求发送:通过TCP连接发送报文。HTTP/2支持多路复用,减少连接数。

5. 服务器处理请求

  • 负载均衡:请求可能被转发到集群中的服务器。
  • 后端处理:执行应用逻辑(如读取数据库),生成响应(HTML/JSON等)。
  • 返回响应:状态码(如200成功、301重定向)、响应头(Content-Type、Cache-Control)、响应体(资源内容)。

6. 浏览器解析与渲染

  1. 解析HTML构建DOM树

    • 边下载边解析,遇到<script>阻塞DOM构建(除非async/defer)。
    • 预加载扫描器(Preload Scanner)提前下载外部资源(如图片、CSS)。
  2. 解析CSS生成CSSOM

    • CSS解析为样式规则树(CSSOM),解析完毕前阻塞渲染(避免FOUC)。
  3. 构建渲染树(Render Tree)

    • 合并DOM和CSSOM,排除不可见节点(如display: none)。
  4. 布局(Layout/Reflow)

    • 计算每个节点的尺寸和位置(视口大小、盒模型)。
  5. 绘制(Paint)

    • 将布局转换为像素,填充图层(Layer)。可能触发合成(Composite),利用GPU加速。
  6. JavaScript执行

    • 解析到<script>时执行(可能修改DOM/CSSOM,触发重绘或回流)。
    • 事件循环(Event Loop)管理异步任务(如setTimeout、Promise)。

7. 加载其他资源

  • 图片/字体等:异步加载,不影响首次渲染,但可能触发重绘。
  • 缓存机制:根据HTTP头(Cache-Control、ETag)缓存资源,后续请求优先使用缓存。

8. 连接终止

  • 四次挥手:TCP连接关闭(FIN/ACK包交换)。
  • 持久连接:HTTP/1.1默认保持连接复用(Connection: keep-alive)。

关键优化点

  • 减少DNS查询:使用dns-prefetch、减少域名数量。
  • 压缩与缓存:Gzip压缩、CDN分发、强缓存(Cache-Control)与协商缓存(ETag)。
  • 减少重排/重绘:避免频繁操作DOM,使用transform/opacity触发GPU加速。
  • 代码优化:异步加载JS(async/defer)、CSS媒体查询、图片懒加载。

demo.png

通过理解这一流程,开发者可针对性能瓶颈进行优化,提升用户体验。