1.解析URL

  • 首先会对URL进行解析,分析所需要使用的传输协议和请求的资源的路径。
  • 如果输入的URL中的协议或主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。
  • 如果没有问题,浏览器会检查URL中是否出现了非法字符。
  • 如果存在非法字符,则对非法字符进行转义后再进行下一过程。

2缓存判断

  • 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么久直接使用。
  • 否则向服务器发起新的请求。

3.DNS解析

  • 下一步首先需要获取的是输入URL中的域名的IP地址,首先会判断本地是否有该域名的IP地址的缓存。
  • 如果有则使用,如果没有则向本地DNS服务器发起请求。
  • 本地DNS服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,
  • 获得负责的顶级域名服务器的地址后,再向顶级域名服务请求,
  • 然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,
  • 最终获得域名的IP地址后,本地DNS服务器再将这个IP地址返回给请求的用户。
  • 用户向本地DNS服务武器发起请求属于递归请求,本地MDS服务器向各级域名服务器发起请求属于迭代请求。

4.获取MAC地址

  • 当浏览器得到IP地址后,数据传输还需要知道目的主机MAC地址。
  • 应用层下发数据给传输层,
  • 传输层TCP协议会指定源端口号和目的端口号,然后下发给网络层,
  • 网络层会将本机地址作为源地址,获取的IP地址作为目的地址。然后下发给数据链路层,
  • 数据链路层的发送需要加入通信双方的MAC地址,本机的MAC地址作为源MAC地址,目的MAC地址需要分情况处理。
    • 通过将IP地址与本机的子网掩码想与,可以判断是否与请求主机在同一个子网里,
    • 如果在同一个子网里,可以使用ARP协议获取到目的主机的MAC地址,
    • 如果不在一个子网里,那么应该转发给网关,由它代为转发,此时同样可以通过ARP协议来获取网关的MAC地址,此时目的主机的MAC地址应该为网关的地址。

5.TCP三次握手

  • 首先由客户端向服务器发送一个SYN连接请求报文段和一个随机序号。(第一次握手)
  • 服务端接收到请求后向客户端发送一个SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。(第二次握手)
  • 客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK确认报文段,服务器端接收道确认后,也进入连接建立状态。(第三次握手)
  • 此时双方的连接就建立起来了。

6.HTTPS握手

如果使用的是HTTPS协议,在通信前还存在TLS的一个四次握手的过程。

  • 首先由客户端向都服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。(第一次握手)
  • 服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。(第二次握手)
  • 客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用整数中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的hash值供服务器端检验。(第三次握手)
  • 服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的hash值供客户端检验,(第四次握手)
  • 这时双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。

7.返回数据

  • 当页面请求发送到服务器端后,服务器会返回一个html文件作为响应,
  • 浏览器接收到响应后,开始对html文件进行解析,开始页面的渲染过程。

8.页面渲染

浏览器首先会根据html文件构建DOM树,根据解析到的CSS文件构建CSSOM树。

如果遇到script标签,则判断是否有defer或者async属性,要不然script的加载和执行会造成页面的渲染的阻塞。

当DOM树和CSSOM树建立好后,根据他们来构建渲染树。

渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的UI接口对页面进行绘制,这个时候整个页面就显示出来了。

9.TCP四次挥手

  • 最后一步是TCP断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。(第一次挥手)
  • 服务端收到连接释放请求后,会告诉应用层要释放TCP链接,然后会发送ACK包,并进入CLOSE_WAIT状态,此时表明客户端到服务器端的链接已经释放,不再接收客户端发的数据了。(第二次挥手)
  • 但是因为TCP连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送俩连接释放请求,然后服务端便进入LAST-ACK状态。(第三次挥手)
  • 客户端收到释放请求后,向服务端发送确认应答,此时客户端进入TIME-WAIT状态。该状态会持续2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃)时间。(第四次挥手)
  • 若该时间段内没有服务端的重发请求的话,就进入CLOSED状态。