跳到主要内容

HTTP 版本演进

HTTP/1.0 与 HTTP/1.1 有什么区别?​

维度HTTP/1.0HTTP/1.1
缓存机制仅客户端缓存客户端缓存 + 服务器缓存
持久连接默认非持久连接默认持久连接
超时机制无明确超时机制连接超时 + 读取超时 + 空闲连接超时
状态码较少更多状态码
带宽优化无分块传输 + 范围请求
主机识别无引入 Host 首部字段
管线化不支持支持

HTTP/1.x 有哪些固有弊端?​

  • 一次连接只能按序处理请求, 存在队首阻塞;
  • 请求只能从客户端发起, 服务端无法主动推送;
  • 首部信息冗余且不压缩;

HTTP/2 增加了哪些能力?​

  • 多路复用: 基于二进制帧首部的标识字段区分不同请求, 在一条连接上并行交错传输;
  • 二进制分帧: 提高传输效率;
  • 首部压缩: 压缩 HTTP 首部信息;
  • 服务器推送: 服务端主动推送资源;
  • 请求优先级: 控制响应的优先级;

HPACK 如何压缩首部?​

  • 静态压缩: 预先建立静态表字典, 把常用首部预编码, 传输时只发静态表索引;
  • 动态压缩: 双方基于哈希算法维护动态表, 传输时只发哈希表索引;
  • 淘汰: 动态表空间不足时, 优先删除最少使用的首部字段;

HTTP/3 为什么改用 QUIC?​

  • 传输层: 基于 UDP 实现 QUIC 协议;
  • QUIC 提供的能力:
    • 前向纠错: 基于 FEC, 额外发送一个校验包(值为所有数据包的异或); 只丢失一个非校验包时可用其他包还原;
    • 重传机制;
    • 拥塞控制;
  • 消除队首阻塞: HTTP/2 的 TCP 与 TLS 都存在队首阻塞, QUIC 基于 UDP, 服务端无滑动窗口, 不强制数据包处理顺序;
  • 建连更快: HTTP/3 只需一次握手, 第一个包即可携带请求数据;