老生常谈的从输入URL到页面加载

269 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

  1. DNS解析(网址->ip):DNS缓存:浏览器,操作系统,分级查询:本地DNS服务器,根域名服务器,COM定级域名服务器,google.com域名服务器
  2. TCP连接(三次握手)
  3. 发送HTTP请求,分析url,设置请求报文
  4. 服务端处理请求,并且返回HTTP报文
  5. 浏览器解析和渲染页面
  6. 连接结束(四次挥手)

三次握手

这里是markdown写的图形,貌似掘金不能识别

客户端 -> 服务端:报头:SYN=1(请求建立连接),seq=n(表示序列号,32位)
服务端 -> 客户端:SYN=1(服务端同意建立连接),ack=n+1(确认收到信息),seq=x(服务端序列号),ACK=1
客户端 -> 服务端:ACK=1,SYN=0(开始发送信息),ack=x+1(确认收到信息),seq=n+1

WX20211102-185922@2x.png

  1. 第一次握手说明客户端具有发送信息的能力
  2. 第二次握手说明服务端具有接收信息的能力和发送信息的能力
  3. 第三次握手说明客户端具有接收信息的能力

四次挥手

客户端->服务端:FIN=1(请求断开连接),seq=m
服务端->客户端:ACK=1(消息确认包),ack=m+1
服务端->客户端:FIN=1(请求断开连接),seq=b
客户端->服务端:ACK=1,ack=b+1

WX20211102-185937@2x.png

浏览器渲染页面

  1. 解析html文件构建DOM树、解析css生成CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕再继续构建DOM树和CSSOM树
  2. 结合DOM树和CSSOM树构建成渲染树(Render Tree)
  3. Layout(回流):根据生成的渲染树进行回流(Layout),得到节点的几何信息(位置、大小)
  4. Painting(重绘):genuine渲染树以及回流得到的几何信息得到节点的绝对像素
  5. Display:将像素发送给GPU,展示在页面上 页面的绘制,重绘(repaint)和重排(reflow,也有称回流),页面渲染完成后若js操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或者重排 通过构造渲染树,将可见DOM节点及它对应的样式结合起来,可是还需要计算他们在设备视口(viewport)内的确切位置和大小,这个极端的阶段就是回流 最终通过构造渲染树和回流阶段,知道了哪些节点是可见的,以及可见节点的样式和具体的几何信息(位置、大小),那么我们就可以将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做重绘