HTTP/2

HTTP/1的缺陷

  • 队头阻塞
    • 1.1版本实现了管道化,允许一次发送一组请求
    • 但是响应的返回必须按照顺序
    • 如果第一个请求时间很长,后面的请求的响应都会被堵塞
  • TCP慢启动导致原本就具有突发性和短时性的 HTTP 连接变的十分低效
  • 消息首部无法压缩
    • 例如有cookie,首部会很大
    • 会占据请求的很大部分

HTTP/2的优化

  • 二进制协议
    • HTTP/1的解析是基于文本分割的
      • 每一行的结尾会有分隔符(\r\n)
      • 一次只能处理一个请求,完成前不能中断
      • 无法预估一次解析需要预留多少内存(一行多长)
    • HTTP/2的请求和响应由一个HEADERS帧和许多DATA帧构成
      • 帧的大小固定
        HTTP/2
  • 首部压缩
  • 多路复用
    • 客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源
    • 虽然只有一条TCP连接,但是在逻辑上分成了很多stream
    • TCP连接的复用避免了多次慢启动
      HTTP/2
  • 服务端推送
    • 当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端