一、解析URL
⾸先会对 URL 进⾏解析,分析所需要使⽤的传输协议
和请求的资源的路径
。如果输⼊的URL 中的协议
或者主机名
不合法,将会把地址栏中输⼊的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了⾮法字符,如果存在⾮法字符,则对⾮法字符进⾏转义
后再进⾏下⼀过程。
二、缓存判断
浏览器会判断所请求的资源是否在缓存⾥,如果请求的资源在缓存⾥并且没有失效,那么就直接使⽤,否则向服务器发起新的请求。
三、DNS解析
下⼀步⾸先需要获取的是输⼊的 URL 中的域名的 IP 地址,⾸先会判断本地是否有该域名的 IP 地址的缓存,如果有则使⽤,如果没有则向本地 DNS 服务器
发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器
发起请求,获得负责的顶级域名服务器的地址
后,再向顶级域名服务器请求
,然后获得负责的权威域名服务器的地址
后,再向权威域名服务器
发起请求,最终获得域名的 IP 地址
后,本地 DNS 服务器再将这个 IP 地址返回给请求的⽤户。⽤户向本地 DNS 服务器发起请求属于递归请求
,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求
。
四、获取MAC地址
当浏览器得到 IP 地址后,数据传输还需要知道⽬的主机 MAC 地址
,因为应⽤层
下发数据给传输层
,TCP 协议会指定源端⼝号
和⽬的端⼝号
,然后下发给⽹络层
。⽹络层会将本机地址作为源地址,获取的 IP 地址作为⽬的地址。然后将下发给数据链路层
,数据链路层的发送需要加⼊通信双⽅ 的 MAC 地址
,本机的 MAC 地址作为源 MAC 地址,⽬的 MAC 地址需要分情况处理。通过将 IP 地址
与本机的⼦⽹掩码
相与
,可以判断是否与请求主机在同⼀个⼦⽹⾥,如果在同⼀个⼦⽹⾥,可以使⽤ APR 协议
获取到⽬的主机的 MAC 地址,如果不在⼀个⼦⽹⾥,那么请求应该转发给⽹关
,由它代为转发,此时同样可以通过 ARP 协议来获取⽹关的 MAC 地址,此时⽬的主机的 MAC 地址应该为⽹关的地址。
五、TCP三次握手
下⾯是 TCP 建⽴连接的三次握⼿的过程,⾸先客户端向服务器发送⼀个 SYN 连接请求报⽂段和⼀个随机序号,服务端接收到请求后向服务器端发送⼀个 SYN ACK报⽂段,确认连接请求,并且也向客户端发送⼀个随机序号。客户端接收服务器的确认应答后,进⼊连接建⽴的状态,同时向服务器也发送⼀个ACK 确认报⽂段,服务器端接收到确认后,也进⼊连接建⽴状态,此时双⽅的连接就建⽴起来了。
六、HTTPS握手
如果使⽤的是 HTTPS 协议,在通信前还存在 TLS 的⼀个四次握⼿的过程。⾸先由客户端向服务器端发送使⽤的协议的版本号、⼀个随机数和可以使⽤的加密⽅法。服务器端收到后,确认加密的⽅法,也向客户端发送⼀个随机数和⾃⼰的数字证书。客户端收到后,⾸先检查数字证书是否有效,如果有效,则再⽣成⼀个随机数,并使⽤证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供⼀个前⾯所有内容的 hash 值供服务器端检验。服务器端接收后,使⽤⾃⼰的私钥对数据解密,同时向客户端发送⼀个前⾯所有内容的 hash 值供客户端检验。这个时候双⽅都有了三个随机数,按照之前所约定的加密⽅法,使⽤这三个随机数⽣成⼀把秘钥,以后双⽅通信前,就使⽤这个秘钥对数据进⾏加密后再传输。
七、返回数据
当⻚⾯请求发送到服务器端后,服务器端会返回⼀个 html ⽂件作为响应,浏览器接收到响应后,开始对 html ⽂件进⾏解析,开始⻚⾯的渲染过程。
八、页面渲染
浏览器⾸先会根据 html ⽂件构建 DOM 树,根据解析到的 css ⽂件构建 CSSOM 树,如果遇到 script 标签,则判断是否含有 defer 或者 async 属性,要不然 script 的加载和执⾏会造成⻚⾯的渲染的阻塞。当 DOM 树和 CSSOM 树建⽴好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进⾏布局。布局完成后,最后使⽤浏览器的 UI 接⼝对⻚⾯进⾏绘制。这个时候整个⻚⾯就显示出来了。
九、TCP四次挥手
最后⼀步是 TCP 断开连接的四次挥⼿过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应⽤层要释放 TCP 链接。然后会发送ACK 包,并进⼊ CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进⼊ LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进⼊ TIME-WAIT 状态。该状态会持续 2MSL(最⼤段⽣存期,指报⽂段在⽹络中⽣存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进⼊ CLOSED 状态。当服务端收到确认应答后,也便进⼊ CLOSED 状态.