浏览器从输入网址到页面加载的整个过程

浏览器从输入网址到页面加载的整个过程

“从在地址栏输入 URL 到页面渲染完成,发生了什么?”是前端高频面试题,也是理解 Web 工作原理的关键路径。这个过程涉及浏览器、操作系统、DNS、CDN、Web 服务器、HTTP/HTTPS、渲染引擎等多个组件。

本文按照时间顺序,梳理整个流程:

  1. 用户输入 URL 与地址栏处理
  2. 浏览器进程与网络进程协作
  3. DNS 解析与 IP 获取(含缓存与 CDN)
  4. TCP 三次握手 + TLS 握手(HTTPS)
  5. 发送 HTTP 请求与服务器处理
  6. 浏览器接收响应、缓存与重定向
  7. 渲染流程:解析 HTML/CSS/JS、构建 DOM/CSSOM、布局与绘制
  8. 关键性能点:首字节时间、首屏渲染、JS 阻塞、资源加载优化

一、输入 URL 与导航开始

1. 地址栏解析

当你在地址栏输入 sunjc.vip 并回车时,浏览器需要判断你输入的是:

  • 搜索词?(走搜索引擎)
  • 还是一个 URL?(走导航流程)

通常:

  • 检测到有协议前缀(如 http://https://)时按 URL 处理
  • 否则尝试补全协议(默认 https://)并做一定规则判断

2. 浏览器进程与网络进程

现代浏览器是多进程架构,至少包括:

  • 浏览器进程:负责 UI、地址栏、书签、网络资源的统一协调
  • 网络进程:负责真正发起网络请求
  • 渲染进程:负责页面解析、布局、绘制、JS 执行

导航开始时,浏览器进程会将 URL 转交给网络进程,由网络进程开始后续“网络请求”阶段。


二、DNS 解析:域名 → IP 地址

要访问 https://sunjc.vip,首先要把域名解析成 IP 地址,这就是 DNS 的工作。

1. 多级缓存

为减少延迟,DNS 解析会优先命中缓存:

  1. 浏览器缓存:最近访问过的域名解析结果
  2. 操作系统缓存:如本地 DNS cache
  3. 本地 hosts 文件:如 127.0.0.1 sunjc.vip
  4. DNS 服务器缓存:运营商或公共 DNS(8.8.8.8 / 1.1.1.1)

只有都未命中时,才会发起完整的 DNS 递归查询。

2. 递归查询与权威 DNS

简化流程:

  1. 向本地 DNS 服务器(运营商/公共 DNS)发起查询
  2. 若其没有缓存,会从根域名服务器开始,逐级查询:
    • 根(.)→ 顶级域(.vip)→ 权威 DNS(负责 sunjc.vip`)
  3. 最终获取域名对应的 IP 地址(如 1.2.3.4

3. CDN 介入(关键优化点)

如果网站使用了 CDN(如 cdn.xxx.com),DNS 解析时会根据:

  • 用户所在地域
  • 运营商/网络情况

返回“离用户最近”的边缘节点 IP,从而减少延迟。


三、建立连接:TCP 三次握手 + TLS 握手(HTTPS)

拿到服务器 IP 后,浏览器需要与服务器建立连接。

1. TCP 三次握手

在 HTTP/1.1 或 HTTP/2 over TLS 中,底层使用 TCP:

  1. SYN:客户端 → 服务器,发起连接请求
  2. SYN-ACK:服务器 → 客户端,回应请求
  3. ACK:客户端 → 服务器,确认收到

三次握手完成后,TCP 连接建立。

2. TLS 握手(HTTPS)

若是 HTTPS(几乎所有现代站点都已是),在 TCP 之上还需要:

  1. 协商 TLS 版本与加密套件
  2. 服务器发送证书(含公钥),浏览器验证证书链是否合法、未过期、域名匹配
  3. 交换对称加密密钥(通常使用非对称加密来安全协商)
  4. 使用对称加密进行后续 HTTP 报文的加解密

TLS1.3 以后握手流程有所简化,可以与 TCP 建连更紧密地复用,减少 RTT(往返次数)。


四、发送 HTTP 请求

连接建立后,浏览器会构造并发送 HTTP 请求报文,包括:

  • 请求行GET /path HTTP/1.1
  • 请求头:Host、User-Agent、Accept、Cookie、Referer 等
  • 可选请求体:如 POST/PUT 等携带的 JSON、表单、文件等

常见优化点:

  • 使用 HTTP/2 多路复用,复用同一 TCP 连接发起多请求,避免“队头阻塞”
  • 利用 Keep-Alive 复用连接,减少三次握手开销

五、服务器处理请求并返回响应

服务器侧大致流程:

  1. 负载均衡(如 Nginx/SLB)接收请求
  2. 转发给后端应用(Node.js、Java、Go 等)
  3. 应用处理业务逻辑:
    • 路由匹配
    • 权限验证
    • 访问数据库/缓存/第三方服务
  4. 生成响应:
    • 响应行:HTTP/1.1 200 OK
    • 响应头:Content-Type、Cache-Control、Set-Cookie、Content-Encoding 等
    • 响应体:HTML、JSON、文件流等

如果是静态资源:

  • 通常通过 Nginx/静态服务器/CDN 直接返回,不必走业务应用。

六、浏览器接收响应、缓存与重定向

1. 状态码处理

  • 200:正常返回
  • 301/302:重定向,浏览器会根据 Location 再发起新请求
  • 304:协商缓存命中,使用本地缓存内容
  • 4xx/5xx:错误页面

2. 缓存策略

基于响应头:

  • Cache-ControlExpires(强缓存)
  • ETagLast-Modified(协商缓存)

浏览器会决定:

  • 是否直接使用缓存(不发请求)
  • 是否需要发起条件请求确认资源是否更新

七、渲染流程:从 HTML 文本到可见页面

拿到 HTML 文本后,浏览器会启用/创建渲染进程,并开始执行以下步骤(以 Chrome 为例):

1. 解析 HTML,构建 DOM 树

  1. 自上而下解析 HTML
  2. 遇到标签,生成对应 DOM 节点并挂载到 DOM 树
  3. 遇到错误标签时做容错修复

2. 解析 CSS,构建 CSSOM

  1. 解析 <style> 标签与外链 CSS(<link rel="stylesheet">
  2. 解析内联样式、style 属性
  3. 应用层叠、继承与优先级生成 CSSOM

注意:CSS 是渲染阻塞资源,即:

  • 在构建 Render Tree 之前,需要有基础 CSSOM

3. 处理 JavaScript

遇到 <script> 标签时:

  • 若是同步脚本(无 defer / async):

    • HTML 解析会暂停
    • 下载并执行 JS
    • JS 可能修改 DOM(document.write、appendChild 等)
    • 执行结束后继续解析 HTML
  • 若是 defer

    • 下载过程不阻塞 HTML 解析
    • 在 DOM 解析完成后按顺序执行
  • 若是 async

    • 下载过程不阻塞 HTML 解析
    • 下载完成后立刻执行,可能打乱顺序

4. 构建渲染树(Render Tree)

  1. 将 DOM 树与 CSSOM 结合
  2. 过滤掉不可见节点(如 display: none
  3. 生成 Render Tree:每个可见元素都有对应渲染对象

5. 布局(Layout)与重排

为每个渲染对象计算:

  • 几何位置(x、y)
  • 尺寸(宽高)

这一步有时也称为“重排(reflow)”。

6. 绘制(Paint)与合成(Composite)

  1. 根据样式绘制文字、颜色、边框、阴影、图片等
  2. 将不同图层(如新 stacking context、GPU 加速层)进行合成
  3. 最终输出到屏幕(可能涉及 GPU 加速)

八、关键性能节点与优化点

在这一整条链路上,有一些对前端性能尤为关键的节点:

  • TTFB(首字节时间):受 DNS、TCP/TLS、后端处理时间影响
  • FCP(首次内容绘制):用户第一次看到内容的时间
  • LCP(最大内容绘制):关键内容(如大图、主标题)完成绘制的时间
  • CLS(布局偏移):页面加载过程中是否“抖动”
  • INP(交互延迟):点击、输入等交互的响应速度

前端可优化的方向包括:

  • 使用 CDN、合理拆分静态资源(减少 TTFB)
  • 图片优化、资源压缩、缓存策略(优化 LCP)
  • 避免图片/广告位导致布局频繁变化(优化 CLS)
  • 控制 JS 大小与执行时机、避免长任务(优化 INP)

关于性能指标与 RUM 监控,可以参考你现有的《真实用户监控(RUM) 与 Web Vitals》文章做进一步串联。


九、总结

从“输入 URL 到页面加载完成”的完整链路,可以粗略拆为三大阶段:

  1. 网络阶段:DNS 解析 → TCP/TLS 握手 → 发送请求 → 接收响应 → 缓存与重定向
  2. 浏览器内部协调阶段:进程模型、导航、资源调度
  3. 渲染阶段:解析 HTML/CSS/JS → 构建 DOM/CSSOM/Render Tree → 布局与绘制

理解这条链路,不仅可以帮助你更好地回答面试题,更重要的是:

  • 帮助你定位性能瓶颈(到底慢在 DNS?后端?前端渲染?)
  • 帮助你做出有针对性的优化(缓存、CDN、代码拆分、懒加载、骨架屏等)

你可以把这篇文章当作一个“总览地图”,再结合其它专题(性能优化、HTTPS、浏览器渲染、Event Loop 等)深入某个局部。


浏览器从输入网址到页面加载的整个过程
https://sunjc.vip/2024/06/01/从输入URL到页面展示的完整过程/
作者
Sunjc
发布于
2024年6月1日
许可协议