前言
讲道理,之前说过的一天月一篇其实是开玩笑的。莫名其妙就这么久没写过博客了。今天在回家的路上突然想起了这个问题----“从输入url到页面展示的过程有哪些?”。其实也不算突然吧,其实想想好像看面试题的时候经常会出现这么一道题目。今天就照着自己想到的东西来写这么一篇。
过程
- DNS解析输入的域名
- 目的:解析域名获取ip
- 过程:
- 浏览器缓存中查找是否有该域名对应的ip地址
- 操作系统缓存中查找是否有该域名对应的ip地址
- 向本地域名服务器来请求解析
- 向上一级域名服务器请求解析
- 重复4步骤,一直到根服务器为止
- 返回解析出的结果,并且缓存到本地域名服务器以及操作系统缓存中
- 向服务端发出TCP连接
- 目的:获取稳定可靠的连接
- TCP三次握手过程:
- 客户端向服务端发出一个数据包
- 服务端接收到客户端发送的数据包并打上确认的标记,然后返回给客户端
- 客户端接收到数据包,加上确认标记。再次发送给服务端。
- 建立连接
- TCP四次挥手过程:
- 客户端向服务端发出一个数据包。此时客户端进入
FIN-WAIT-1
(终止等待1)阶段 - 服务端接收到数据包然后返回一个确认数据包给客户端。此时服务端进入
CLOSE-WAIT
(半关闭阶段),客户端接收到报文之后进入FIN-WAIT-2
(终止等待2)阶段 - 服务端向客户端发出一个数据包(连接释放报文)。此时服务端进入
LAST-ACK
(最后确认阶段) - 客户端向服务端发出一个数据包(确认报文)。此时客户端进入
TIME-WAIT
(时间等待)阶段。在过了2MSL
(MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间)。之后客户端进入CLOSED
阶段,服务端接收到客户端的确认报文之后立马进入CLOSED
阶段。
- 客户端向服务端发出一个数据包。此时客户端进入
- web端发送请求,服务端返回资源给客户端。
- web端解析并渲染资源(正常结构)
- 知识点:web端如何渲染
- 渲染过程:
- 解析HTML文档构建DOM树,
- 解析CSS构建CSSOM
- DOM树和CSSOM合并成一个节点树
- 浏览器通过节点树计算节点在页面所处的位置
- 浏览器渲染节点
- 其它知识:
script
的加载/执行默认都是会阻塞渲染流程的,除非加了defer
(异步加载,延迟按序执行)/async
(异步加载,加载完执行)。但是在实际中,加了defer
的script
脚本也未必会真的按照顺序延迟执行。- DOM树和CSSOM的渲染是会阻塞的,之前认为的不阻塞其实指的是CSS的解析不会影响到DOM的解析,而渲染是会阻止的
- 重绘:节点的视觉属性发生变化,例如
color
,font
等的变化,引起的浏览器重新绘制节点的行为。 - 回流:节点的位置属性发生变化,例如
left,top,right,bottom,display:none,width,height
等的变化,引起的浏览器重新计算节点位置并绘制节点的行为 - 重绘和回流的关系: 重绘不一定回流,回流必然会引起重绘
- 优化:
- 尽量避免直接操作DOM节点
- 可以使用
position
把一些复杂动画的节点脱离文档流。从而避免其父元素及周围元素发生变化从而引起回流
总结
从url输入到页面展示的过程其实大致可分成两部分,一部分是请求,一部分是渲染的部分。请求部分主要又分为dns解析,以及建立/释放tcp连接。渲染部分主要是渲染的步骤。这篇文章其实还可以更细致一些,比如可以讲讲DNS,TCP的具体的东西。之后有空再写把