从输入url到页面渲染
想要更好地进行前端性能优化,降低白屏时间,就必须要了解从页面开始加载到渲染结果这个过程中发送了什么,这样才能针对每个步骤来进行优化。
大致流程有:
- 浏览器解析URL
- 浏览器检查是否有HTTP缓存
- DNS解析(迭代)
- 客户端向本地域名服务器发送域名解析请求,成为本地域名服务器的一个客户
- 本地域名服务器向根域名服务器查询
- 本地域名服务器向顶级域名服务器查询
- 本地域名服务器向二级域名服务器查询
- ……
- 本地域名服务器向权限域名服务器查询,得到服务器的ip地址。
- 本地域名服务器将查询结果返回给客户端
- 客户端与服务器建立TCP连接(三次握手)
- 客户端发送SYN报文给服务器
- 服务器返回SYN-ACK报文
- 客户端返回ACK报文
- 客户端发送HTTP请求
- 服务器接收处理后发送响应报文
- 客户端接收后浏览器进行页面渲染
- 将HTML解析为DOM树,预扫描器加载子资源。
- 样式计算。生成每个节点的计算样式
- 布局。遍历DOM树和计算样式来创建布局树,布局树上包含所有页面上存在的节点的几何属性和样式。
- 绘制。遍历布局树生成绘制记录。
- 合成。遍历布局树来生成层树,将页面分割为不同的图层,然后将图层分别进行栅格化,然后合成器合成帧并渲染出来,当页面滚动时移动图层合成新的帧来生成滚动动画。
DNS查询有迭代和递归两种方式,并且发送的数据单元是UDP(为了节省资源)
三次握手的作用有二:一是为了验证双方的发送和接收能力,二是为了避免建立无效的TCP连接。