Skip to content
大纲

从输入 URL 到页面展示到底发生了什么?

步骤

  1. 输入网址并解析
    1. URL 解析
    2. HSTS
    3. Service Worker
    4. 浏览器缓存
      1. 强缓存
      2. 协商缓存
  2. 建立连接
    1. DNS 域名解析
      1. 递归查询
      2. 迭代查询
    2. TCP/IP 连接:三次握手
    3. HTTP 请求
      1. HTTP/0.9
      2. HTTP/1.0
      3. HTTP/1.1
      4. HTTP/2
      5. HTTP/3
    4. HTTPS(TSL 四次握手)
  3. 服务器处理请求并返回 HTTP 报文
  4. 浏览器渲染页面
    1. DOM 树
    2. CSS 对象模型 (CSSOM)
    3. 布局树 Layout Tree
    4. 渲染
      1. 创建图层
      2. 回流和重绘
    5. 首屏加载完成
    6. 可交互
  5. 断开连接:TCP 四次挥手

详解

  • URL 解析,域名解析。涉及到 DNS 寻址的过程,获取对应的服务器 IP 地址
  • 缓存检查。首先检查强缓存,其次是协商缓存。
    • 如果强缓存生效,则直接从浏览器缓存获取资源
    • 如果强缓存失效,则浏览器向服务器发起一个 http 请求,当然这中间还有一个 tcp 三次握手的一个过程。建立连接后,服务器检查资源是否更改,如果没有更改,则返回 304 告诉浏览器读取缓存,否则响应 200 并发送资源文件给浏览器
  • 拿到资源文件后,浏览器开始解析并构建 dom 树和 cssom 树。这中间又涉及两种过程。
    • 如果有 js 脚本,那么 cssom 树的构建会阻塞 js 的执行,js 的执行会阻塞 dom 树的构建
    • 如果没有 js 脚本,那么 cssom 树的构建和 dom 树的构建是并行的,当然大部分网页都会包含 js 脚本。
  • 有了 cssom 树和 dom 树后,就开始构建 render tree。render tree 并不是和 dom 树一一对应的,render tree 并不包含 display:none 等元素,以及 style,link,head 这些标签。
  • 构建完 render tree,布局(Layout,也叫重排)阶段会为每个节点计算精确的位置和大小信息。
  • 布局阶段完成后,就是绘制阶段(paint),将各个节点绘制到屏幕上,页面就呈现出来了。