DNS解析
- 浏览器拿到地址栏的地址后,先在浏览器的DNS缓存中检索,如果检索到了直接返回地址对应的IP地址;没有检索到则继续检索操作系统的DNS缓存,还没有检索到就读取用户的host配置,最终如果检索到了,就返回地址对应的服务器IP;但是这个时候拿到的IP地址,会被标记为非权威服务器的应答
- 如果在缓存中最终也没有检索到,就会从配置文件读取读取13个根域名的服务器地址
- 然后向其中的一台发起请求
- 根服务器拿到请求后,就会返回根域名的地址
- 然后再次向根域名的地址发起请求
- 根域名地址的服务器收到请求后,返回顶级域名的地址
- 然后再次向顶级域名发请求
- 顶级域名服务器收到请求,返回一级域名地址
- …….
- 循环往复,最终得到与地址栏地址全部匹配的服务器IP,将IP返回给客户端
中间循环往复的查找地址并不是浏览器做的。
计算机通过ISP接入了互联网,那么ISP就会给你分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。(循环往复的地址查找使它处理的)
与服务器建立连接(TCP连接)
三次握手建立连接
- 客户端向服务器首先发送请求(请求报文)。(请求发送之后,客户端并不知道自己的发送能力是否正常)
- 第一次握手。 服务器接收到请求后,向客户端返回响应(响应报文)。(服务器收到请求后,确认自己接收能力是正常的,浏览器的发送能力是正常的;同时向客户端返回响应,但此时服务器并不能确认自己发送能力是否正常,浏览器的接收能力是否正常)
- 第二次握手。 客户端收到响应后,再次向服务器发送请求。(客户端收到响应后,即可确认自己第一次发送到请求服务器接收到了,即可得知,自己的发送接收能力是正常的,服务器的发送接收能力也是正常的。)
- 第三次握手。 服务器再次接收到客户端请求,此时可确认自己的发送能力是正常的,客户端接收能力正常
- 至此,双方都确认了自己的发送接收能力,对方的发送接收能力是正常的,连接建立成功,双方可以正常通信
四次挥手断开连接
断开连接可以由任意一方发起
- 第一次挥手。 主机A向主机B发送个消息,告诉主机B,我没有数据要给你了,你还有数据要给我吗?此时主机A处于等待主机B响应阶段
- 第二次挥手。 主机B向主机A发送消息,告诉主机A,我也没有数据要给你了,你可以关闭连接了
- 第三次挥手。 主机B向主机A发送消息,告诉主机A,我准备关闭连接了,请你确认。此时主机B处于等待主机A确认的阶段
- 第四次挥手。 主机A收到主机B的消息,知道主机B也没有消息给自己了;然后最后一次向主机B发送消息,你关闭连接吧;主机B收到主机A的确认,会关闭连接;主机A等待一段时间后,确认没有主机B没有回应,得知主机B已经成功关闭连接,此时主机A关闭连接
HTTP请求响应阶段
客户端和服务器建立连接成功之后,客户端将浏览器地址发送到服务器,服务器接收到请求地址,查找地址对应的目录结构文件,将文件进行返回
浏览器解析与渲染
浏览器接收到服务器返回的文件后,先识别文件格式(html、zip、png….),分析文件标准(HTML4.1、html5、xml….),解析HTML,遇到css后去加载css文件(遇到js加载JS文件)。
Html的解析和CSS的解析是两条线(可理解为两个线程),Html解析完成之后会得到一个DOM Tree,CSS解析完成会得到一个CSS Tree。
DOM Tree和CSS Tree进行结合,会得到Render Tree,此时相当于告诉浏览器我要在这个地方渲染一个树的结构,但只是结构,并不包含html的内容也不包含元素的位置。
构成Render Tree的同时,会进行Layout的计算,得到这个元素的颜色,位置,大小….
Layout计算完成与Render Tree组合,此时结构有了位置有了,就进入Patienting阶段,浏览器开始绘制(通过GUI渲染)
流程图
参考资料
重排Reflow【补充内容】
DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式来计算,并根据计算结果将元素放在它该出现的位置,这个过程称为重排Reflow
什么情况下会触发Reflow
- 增加、删除、修改DOM节点时,会导致Reflow或Repaint(增加删除肯定会触发重排,重排之后肯定会重绘;修改DOM不一定触发重排,但肯定触发重绘,例如只修改元素的颜色)
- 移动DOM位置,做动画
- 修改CSS样式
- 改变窗口大小,页面滚动
- 修改网页默认字体
重绘Repaint【补充内容】
当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器便将这些元素都按照各自的特性绘制了一遍,于是页面内容就出现了,这个过程称之为Repaint
什么情况下会触发Repaint
- DOM改动
- CSS改动
触发重排肯定会触发重绘;重绘不一定重排