文章 https://zhuanlan.zhihu.com/p/111716047 Part5 学习笔记
视频科普:https://www.bilibili.com/video/BV1vv4y1U77y
1.0→1.1
使用TCP长连接,改善了短链接的性能开销
因为有了长连接,进而支持管道传输,不用等待响应回来,就可以立马发下一个请求(类似消息队列)
由于是按顺序处理,所以会有队头阻塞问题:若前面的请求处理过慢,后面的请求就要一直等着
1.1→2.0
可以压缩首部,之前只能压缩主体(body)
如果多个请求的首部相同,会自动消除重复部分
以上两点使用HPack头部压缩算法实现,C/S同时维护一张头信息表,所有字段都会存入该表,之后只用发送对应字段的索引
全面采用二进制格式,节省了明文与二进制的转换开销
.
- 客户端可以指定数据流的优先级,所以数据流不是按顺序发送的,所以必须编号(客户端的为奇数,服务器的为偶数)
.
多路复用,解决了1.1的队头阻塞问题,并发处理请求
Eg: 处理A→回应A已经处理好的部分→处理B→回应B→继续处理A
服务器也可以主动发起请求,叫做服务器推送
仍存在的问题:多个HTTP请求复用一个TCP连接,⼀旦发⽣了丢包现象,就会触发TCP的重传机制,这个TCP连接中的所有 HTTP请求都必须等待这个丢了的包被重传回来
2.0→3.0
HTTP/3.0直接把下层的TCP改为了UDP
UDP不管顺序,也不管丢包,所以不会发生1.1的队头阻塞问题和2.0的丢包重传等待问题
使用基于UDP的QUIC协议可以实现可靠传输
当某个流发生丢失时,只会阻塞对应的流,其他流不受影响
TLS由1.2升级为1.3
TLS/1.3只需三次握手,2RTT降为1RTT
.

HPack升级为QPack
.

QUIC把HTTPS的6次握手(3次TCP+3次TLS/1.3)合并为3次
.