HTTP http/1.x http/2 http/3
- 1.0:一条路【不可复用】,一个邮差
- 1.1:一条路【能复用】,多个有序邮差
- 2.0:TCP,火车运集装箱
- Streams传输,stream = header<stream id> * n + DATA<stream> * n
- 3.0:UDP,无人机运集装箱
- 非常适用于mobile network,QUIC connection ID
- 只要 connection ID 相同,尽管网络切换了,使用相同的 connection
HTTP 协议#
- Roy Thomas Fielding,http 的主要作者,REST架构作者
- URI
// Http 消息结构
[Method] [Path] [VersionOfHttp]
[Header]
[Payload]
- HTTP/1.x 有连接无法复用、队头阻塞、协议开销大和安全因素等多个缺陷
- HTTP/2 通过多路复用、二进制流、Header 压缩等等技术,极大地提高了性能,但是还是存在着问题
- QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议
H2 重要概念#
H2 是一次重大的升级
- 主流浏览器,chrome、火狐等都已经公开宣布只支持加密的HTTP2(use TLS certificates)
- Stream<Message: [Frames: { Prioritization, <Data> }]>
- 流Stream:流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2…N);
- 消息:是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
- 帧Frame:HTTP 2.0 通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流,承载着特定类型的数据,如 HTTP 首部、负荷,等等
- 优先值Prioritization:在 HTTP/2 中,每个请求都可以带一个 31bit 的优先值,0 表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。
H3 QUIC 新功能#
- 传输层基于UDP,将拥堵控制(Congestion Control)、Reliability等置于应用层,传输层UDP只负责传输
- 合并 TCP&TLS 握手(merges the TCP handshake and TLS handshake into shorter sequence of packets)
- 0-RTT
- 通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。0RTT 建连可以说是 QUIC 相比 HTTP2 最大的性能优势。
- 传输层 0RTT 就能建立连接。
- 加密层 0RTT 就能建立加密连接。
链接复用#
- 1.0: 无
- 1.1:keep-alive;类比连接池机制,但域名分片等情况下仍然需要建立多个 connection
- 2.0: 同域名下所有通信都在单个连接上完成;多路复用;但是仍为 TCP,丢包重传性能不如 HTTP/1.1
- 3.0: 基于UDP,一个连接上的多个 stream 之间没有依赖(丢包不影响其他stream)
队头阻塞(HoL /head of line blocking)#
- 1.0:yes;下个请求必须在前一个请求返回后才能发出
- 1.1:引入 pipeling,但响应必须是按序的,且同一域名下连接数量(浏览器打开并行TCP连接,通常是6个)会被超限挂起
- 2.0:no,双向流&乱序帧:单个连接可以承载任意数量的双向数据流;帧之间可以乱序发送,再根据帧首部的流标识可以重新组装【?根据图4,妹解决啊,主要是TCP队头阻塞】
- 3.0:no,UDP
协议开销#
- 1.0:header携带大
- 1.1:同 1.0
- 2.0:“首部表” & “增量更新” & Server Push 预推送:客户端和服务器端使用在连接存续期内始终存在的“首部表”来跟踪和存储之前发送的键-值对,新的首部键-值对被追加/替换(增量更新);服务端能通过 Server Push 的方式将客户端需要的内容预先推送过去
- 3.0:-
- 1.0:明文传输:TCP 协议头部没有经过任何加密和认证
- 1.1:同 1.0
- 2.0:帧传输 & binary
- 3.0:报文头认证 & Body 加密
- 除了个别报文比如 PUBLIC_RESET 和 CHLO,所有报文头部都是经过认证的,报文 Body 都是经过加密的。
- 向前纠错机制:添加校验包(QUIC 的 packet),如果丢一个包,可以通过其他包校验找回;多于1个就要重传了
开放问题#
- Q:除了使用序列号是否还有其他方式保证消息的不重不丢?
A:只要是有序的就行吧!相对而言,序列号是最简单的;
- Q:UDP 协议有连接的概念么,它能保证数据传输的可靠么?
A:无连接协议,不能保证数据可靠
- Q:
File protocol-stack-h2-h3.png.avif
Figure 1: HTTP semantics,QUIC将拥堵控制(Congestion Control)、Reliability等置于应用层,传输层UDP只负责传输
Figure 2: handshake
Figure 3: packet
Figure4: Head-of-Line blocking