HTTP1.1 HTTP2.0 HTTP3.0 笔记

这里主要总结一下知识点

HTTP1.1

  • 客户端缓存。
  • 降低请求次数,restapi 中用代理服务器做重定向,小文件合并成大文件传输(小文件如有改变会导致整个大文件重传)
  • 压缩
  • 将同一页面的资源分散到不同域名下

http2.0

  • 多路复用 — 解决串行的文件传输和连接数过多
  • 首部压缩,静态 Huffman 编码节省 http 头部近一半字节,动态表可以节省 http 头部近 90% 以上的字节。但是动态表要消耗内存,因此,http2_max_requests 并不是越大越好,通常我们应当根据用户浏览页面时访问的对象数量来设定这个值。
  • http2 实现并发 Stream 的时候,只经历 1 次 TCP 握手、1 次 TCP 慢启动以及 1 次 TLS 握手。nginx 默认 128 http2_max_concurrent_streams
  • 主动推送资源
  • 请求优先级 — 先获取重要数据
  • 提高安全性
  • 二进制分帧 - HTTP2 性能增强的核心

缺陷:

  • TCP 以及 TCP+TLS 建立连接的延时
  • TCP 的队头阻塞并没有彻底解决
  • 多路复用导致服务器压力上升
  • 多路复用容易 Timeout

http3.0

  • 快速握手,集成了 TLS 1.3 加密,(仅需 1 个 RTT 就可以同时完成四层建连与密钥协商)
  • 改进的拥塞控制、可靠传输(应用程序层面就能实现不同的拥塞控制算法,基于 stream 和 connection 级别的流量控制)
  • 连接迁移。建立连接时,连接是由服务器通过 Source Connection ID 字段分配的,这样,后续传输时,双方只需要固定住 Destination Connection ID,就可以在客户端 IP 地址、端口变化后,绕过 UDP 四元组(与 TCP 四元组相同),实现连接迁移功能
  • 多路复用。HTTP/3 采用 UDP 作为传输层协议,重新实现了无序连接,并在此基础上通过有序的 QUIC Stream 提供了多路复用
  • NGINX 负载均衡问题(为所有 QUIC 服务器实例建立一个全局握手缓存。当用户网络发生切换时,下一次的业务请求无论是 落到哪一个机房或哪一台实例上,握手建连都会是 0-RTT)

补充:

  • 对于 Huffman 以及整数的编码,QPACK 与 HPACK 并无多大不同,但动态表编解码方式差距很大。
  • 由于 HTTP/3 的 Stream 之间是乱序传输的,因此,若先发送的编码 Stream 后到达,双向 Stream 中的 QPACK 头部就无法解码,此时传输 HTTP 消息的双向 Stream 就会进入 Block 阻塞状态(两端可以通过控制帧定义阻塞 Stream 的处理方式)。
  • HTTP/2 与 HTTP/3 采用二进制、静态表、动态表与 Huffman 算法对 HTTP Header 编码,不只提供了高压缩率,还加快了发送端编码、接收端解码的速度
  • HTTP/2 与 HTTP/3 都在应用层实现了多路复用功能
原文地址:https://www.cnblogs.com/WisWang/p/14036175.html