前端技术专家面试- HTTP

179 阅读7分钟

在实际项目中:

  • 推进使用优先级HTTP3 > HTTP2 > HTTP1.1
  • 在APP端,网络延迟的影响很大,所以HTTP3能带来显著的效果提升(100ms到200ms的提升)。
  • 在秒开的时候:HTTP的优化起到至关重要的作用。
  • 域名解析加速、TLS加速也是重要优化点方向。

==================

HTTP(超文本传输协议)是一种无状态的协议,用于客户端和服务器之间的通信。 随着互联网的发展,HTTP 协议经历了多个版本的迭代,以解决性能、安全性等方面的问题。

1. HTTP/1.1 HTTP/2

1.1 HTTP/1.1

HTTP/1.1 是目前广泛使用的版本,它引入了长连接(Keep-Alive),允许一个 TCP 连接在多次请求中复用,避免为每次请求都重新建立连接。然而,HTTP/1.1 仍存在一些性能限制:

  • TCP 连接限制:浏览器对同一域名的并发请求数有限制,通常最多建立 6 个 TCP 连接,超过的请求会进入等待队列,延迟响应时间。
  • 明文传输:HTTP/1.1 的请求和响应头部是明文传输,缺少压缩,导致每次请求都携带重复的头部信息,增加了传输负担。为了解决这一问题,实际内容可以通过 gzipbrotli 进行压缩。
  • 无状态通信:每次请求都会重复发送头部,且没有内建的状态管理机制。
  • HTTPS 和安全性:为了保证数据的安全性,HTTP/1.1 通过 HTTPS(即 HTTP + TLS)来加密通信。TLS(传输层安全协议)通过非对称加密进行密钥交换,然后使用对称加密来保护数据传输。
  • 请求方法:常见的请求方法有 GETPOST,并且可以通过 Cache-Control 实现缓存控制,利用 cookie 实现用户会话管理。

1.2 HTTP/2

HTTP/2 是对 HTTP/1.1 的优化版本,解决了许多性能瓶颈,并提高了传输效率:

  • 二进制分帧和多路复用:HTTP/2 引入了 二进制分帧 技术,将请求和响应分割为更小的帧进行传输,每个请求和响应都有唯一的 Stream ID。这允许在同一 TCP 连接中同时处理多个请求,消除了 HTTP/1.1 的 队头阻塞 问题,大大提高了并发性。
  • 头部压缩:通过 HPACK 算法对 HTTP 头部进行压缩,减少重复传输头部信息,进一步提高了带宽利用率。
  • 服务端推送(Server Push) :允许服务器在客户端请求前推送资源,如 CSS 或 JS 文件,减少首屏加载时间。
  • 流式传输:HTTP/2 支持流式返回数据,服务器可以在请求过程中持续发送数据,有助于提升页面的渲染速度。

1.3 TCP

TCP(传输控制协议)通过多个机制实现稳定的传输,主要包括确认重传、流量控制和拥塞控制。以下是这些机制的详细解释:

1.3.1 确认重传

确认重传是TCP确保数据可靠传输的核心机制。当发送方发送数据包后,它会等待接收方发送确认(ACK)。如果在一定时间内没有收到确认,发送方会重新发送该数据包。这一过程确保了丢失的数据能够被及时重发,从而保证了数据的完整性和可靠性。

1.3.2 流量控制

  • 流量控制的目的是防止发送方以过快的速度发送数据,导致接收方来不及处理。TCP使用滑动窗口机制来实现流量控制:
  • 滑动窗口:接收方会告知发送方它可以接收多少字节的数据(即窗口大小)。发送方根据这个窗口大小决定可以发送的数据量,从而避免了数据溢出接收缓冲区。

1.3.3 拥塞控制

拥塞控制是TCP用来防止网络拥塞的重要机制。网络拥塞发生时,数据包可能会丢失或延迟,影响传输效率。TCP通过以下几种算法实现拥塞控制:

  • 慢启动:在连接开始时,TCP以较小的窗口大小开始发送数据,随着确认的到达逐渐增加窗口大小,以快速探测可用带宽。
  • 拥塞避免:当达到一定的阈值后,TCP进入拥塞避免阶段,窗口增长速度减缓,以减少网络负担。
  • 快速重传与快速恢复:当发送方检测到丢失的数据包(通常是通过收到三个重复ACK),会立即重传丢失的数据包,并调整窗口大小,以便快速恢复到正常状态。

1.3.4 建链和断链

  1. 建链(三次握手)
    1. 过程
      1. 客户端发送SYN包到服务器,请求建立连接
      2. 服务器回复SYN+ACK包,确认收到请求
      3. 客户端发送ACK包,确认连接建立
    2. 目的:
      1. 防止历史连接:如果只有两次握手,旧的延迟请求包到达服务器时可能会建立错误连接
      2. 同步序列号:双方需要交换并确认各自的初始序列号(ISN)
      3. 确认双向通信:三次握手可以确保双方都有发送和接收能力
  2. 断链(四次挥手)
    1. 过程
      1. 主动方发送FIN包,请求断开连接
      2. 被动方回复ACK包,确认收到请求
      3. 被动方发送FIN包,表示准备好断开
      4. 主动方回复ACK包,确认断开连接
    2. 目的
      1. TCP是全双工的:两个方向的连接可以独立关闭
      2. 数据完整性:被动方收到FIN后,可能还有数据需要发送,所以ACK和FIN是分开的
      3. 避免数据丢失:等待一段时间(2MSL)确保最后的ACK能到达,防止对方重发FIN

2. HTTP/3:

HTTP/3 是基于 QUIC 协议的最新版本,旨在解决 HTTP/2 在 TCP 层面上的局限性:

  • QUIC 协议和 UDP:HTTP/3 使用 UDP 作为传输层协议,而非 TCP,避免了 TCP 的 队头阻塞 问题。QUIC 在应用层实现了传输控制,通过丢包重传、拥塞控制等机制,改进了丢包情况下的传输效率。
    • 改进的拥塞控制:QUIC实现了更灵活的拥塞控制算法,可以根据网络状况动态调整传输速率。这使得在网络条件变化时,能够更有效地管理带宽使用。
    • 快速重传:QUIC支持快速重传机制,当检测到丢失的数据包时,可以更快地进行重发,而不需要等待超时。
  • 快速建立连接:QUIC 支持 0-RTT1-RTT 的快速握手,大幅减少了首次连接的延迟,尤其适合移动网络等高延迟环境。
    • HTTP/3使用UDP而非TCP进行数据传输,这意味着它不需要TCP的三次握手过程,从而减少了连接建立的延迟。
    • HTTP/3内置TLS 1.3加密,提供了更快的安全连接建立过程。由于加密和握手过程被整合到QUIC中,减少了额外的延迟。
    • 1-RTT握手过程
      • 类似TLS 1.3,首次连接时客户端直接发送Client Hello包含:支持的加密套件、公钥、传输参数。
      • 服务器回复包含:选定的加密套件、服务器证书、传输参数。
    • 0-RTT握手过程
      • 基于之前连接的信息复用:存储服务器配置、保存会话票据(Session Ticket)、缓存加密参数
      • 重连时:
        • 客户端直接用缓存的参数加密数据
        • 连同Client Hello一起发送
        • 无需等待服务器响应即可发送数据
  • 连接迁移:QUIC 支持连接迁移,特别适用于移动场景,即使网络环境发生变化(如从 WiFi 切换到移动数据),也能保持连接的持续性,而无需重新建立连接。

2. HTTPS

  • 先TCP握手建立连接,然后TLS握手。

3. 协商协议

在 HTTP 相关协议中,最典型的网络协商协议是 ALPN(应用层协议协商,Application-Layer Protocol Negotiation) ,它主要用于 HTTPS(基于 TLS 的 HTTP)连接中的协议协商。