• image.png HTTP0.9
    • 只支持 GET 方法,没有请求头
    • 服务器只返回 HTML HTTP1.0
    • 引入了请求头和响应头,支持多种请求方法和状态码 HTTP1.1
    • 对于 1.0 进行了补充
        1. 长连接
        • 为了解决 HTTP1.0 每次请求都需要建立新的连接的问题
        • 只要服务器和客户端没有一端提出断开链接, 就保持 TCP 连接状态
        1. 管道网络传输
        • 在同一个 TCP 连接里,客户端可以同时发起多个请求,减少整体响应时间
        • But!服务端只能一个一个处理请求并阻塞剩余请求,这个技术没有默认开启
    • 存在的问题
      • 头部冗余
      • 服务器按顺序响应,会队头阻塞
      • 没有请求优先级控制
      • 请求只能从客户端开始,服务器只能被动响应 HTTP2.0
    • 协议基于 HTTPS ,安全性有保障
    • 改进之处
      • 头部压缩,HPACK 压缩算法,利用静态表记录常用的头部,利用动态表记录重复的头部
      • 二进制帧
      • 并发传输:引出 Stream 概念。多个 Stream 复用一条 TCP 连接,针对不同的 HTTP 请求用 Stream ID 区分
      • 服务器推送:服务器可以对客户端的一个请求发送多个响应
    • 存在的问题
      • 传输层(TCP/IP)依旧存在队头阻塞问题:TCP 字节流需要保证接收的字节连续且完整,由于 HTTP 层实现的流在 TCP 层感知不到,依旧体现为一个 TCP 数据段,所以如果 TCP 数据段丢失则会影响所有流 HTTP3.0
    • 对于 2.0 的改进
      • 因为 TCP 层的队头阻塞不可避免,所以干脆使用 UDP
      • HTTP 2 如果首个请求丢包,就会阻塞到首次请求的数据包重传(建立动态表)
      • QUIC 协议用两个专用的 Stream 用来同步动态表,如果没有成功同步就不会使用动态表编码 HTTP 头部
    • 额外的不同点:
      • 静态表更大
    • QUIC 协议
      • 0 RTT 连接
      • 无队头阻塞
      • 连接迁移:在网络切换时,将连接迁移到新的 IP 地址,减少连接的中断时间
      • 向前纠错机制:数据包会带其他数据包的数据,少量丢包可以通过其他包的冗余直接组装无需重传