一个页面从输入URL到页面加载完成,都做了什么?

一个页面从输入URL到页面加载完成,都做了什么?

1 解析URL

首先会对URL进行解析,获取所需要使用的传输协议和请求的资源路径

  • 如果输入的URL中的协议或主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。
  • 如果协议和主机名没有问题,浏览器会检查URL中是否有非法字符,会选择是否对其进行转义。

2 缓存加载

浏览器会从缓存中获取请求的资源

如果请求的资源在缓存中没有失效,就直接返回缓存数据,否则向服务器发起新的请求。

3 DNS解析

获取URL中的域名IP地址

  1. 先判断本地是否有该域名的IP地址的缓存

    1. 如果有就使用缓存的数据;
    2. 如果没有则想本地DNS服务器发起请求;
  2. 本地DNS服务器获取IP地址

    1. 优先使用本地缓存,如果没有缓存数据

      1. 会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址;
      2. 再向顶级域名服务器请求,获得负责的权威域名服务器地址;
      3. 再向权威域名服务器发起请求,获得域名的IP地址;
      4. 本地DNS将IP地址的数据返给请求的用户;

4 获取MAC地址

数据传输需要知道目的主机 MAC 地址

  1. 应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层;

  2. 网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址,然后将下发给数据链路层;

  3. 数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理;

    1. 此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。

    2. 通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里

      1. 如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址;
      2. 如果不在一个子网里,那么请求应该转发给网关,由它代为转发;此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。

5 TCP三次握手

确认客户端与服务器的接收与发送能力,与目标服务器建立连接

TCP 建立连接的三次握手的过程:

首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,

服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。

客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,

服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了

6 HTTPS握手

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

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

7 发送HTTP请求

服务器处理请求,返回HTTP报文

8 页面渲染

  1. 浏览器首先会根据 html 文件(响应) 「建 DOM 树」,
  2. 根据解析到的 css 文件构「建 CSSOM 树」
  3. 如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。
  4. 当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。

9 TCP四次挥手

TCP 断开连接的四次挥手

  1. 若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。
  2. 服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。
  3. 然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。
  4. 但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。
  5. 服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。
  6. 客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当
  7. 服务端收到确认应答后,也便进入 CLOSED 状态。
posted @ 2022-11-10 19:34  路迢迢  阅读(56)  评论(0编辑  收藏  举报