这里主要总结一下知识点
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 都在应用层实现了多路复用功能