基本流程:
1、用户在浏览器中输入url地址
2、浏览器解析域名得到服务器ip地址
3、TCP三次握手建立客户端和服务器的连接
4、客户端发送HTTP请求获取服务器端的静态资源
5、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源
6、TCP四次挥手关闭客户端和服务器的连接
7、浏览器解析文档资源并渲染页面
具体描述:
1、用户在浏览器中输入url地址
2、浏览器解析域名得到服务器ip地址
浏览器会首先从缓存中找是否存在域名,如果存在就直接取出对应的ip地址,如果没有就开启一个DNS域名解析器。DNS域名解析器会首先访问顶级域名服务器,将对应的ip发给客户端;然后访问根域名解析器,将对应的ip发给客户端;最后访问本地域名服务器,得到最终的ip地址。
3、TCP三次握手建立客户端和服务器的连接
因为HTTP是基于TCP的可靠传输,所以在发送http数据报之前,需要先进行TCP的三次握手建立连接。三次握手过程如下:
第一次握手:客户端--->服务端 ack=1,seq=x(x随机生成)
第二次握手:服务端--->客户端 ACK=1,ack=x+1,seq=y(y随机生成)
第三次握手:客户端--->服务端 ACK=1,ack=y+1,seq=x+1
完成第三次握手时,实际上客户端已经与服务器建立了连接,所以第三次握手的报文已经可以携带数据了。
4、客户端发送HTTP请求获取服务器端的静态资源
5、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源
6、TCP四次挥手关闭客户端和服务器的连接
数据传输完毕后,TCP会进行四次挥手断开连接,释放资源。四次挥手过程如下:
第一次挥手:客户端--->服务器 FIN=1,ack=1,seq=u 客户端状态变为FIN_WAIT_1
第二次挥手:服务器--->客户端 ACK=1,ack=u+1,seq=v 服务器状态变为CLOSE_WAIT,TCP进入半关闭状态
第三次挥手:服务器--->客户端 FIN=1,ACK=1,ack=u+1,seq=w 服务器状态变为LAST_ACK
第四次挥手:客户端--->服务器 ACK=1,ack=w+1,seq=u+1 客户端状态变为TIME_WAIT,此时TCP未释放,需要等待计时器计时完成后,客户端状态变为CLOSED
7、浏览器解析文档资源并渲染页面:
(1)解析html资源,构建DOM Tree。
(2)构建Render树:不管是内联式还是外联式,还是嵌入式引入的CSS样式会被解析成CSSOM树。
(3)布局Render树:JS通过DOM API和CSS OM API来操作DOM Tree和CSS Tree。
(4)渲染Render树:解析完成后综合DOM Tree和CSS Tree会生成Render Tree,计算每个元素的位置,这个过程就是回流(layout or reflow)。