HTTP http/1.x http/2 http/3

速记

  • 1.0一条路【不可复用】一个邮差
  • 1.1一条路【能复用】多个有序邮差
  • 2.0TCP火车运集装箱
    • Streams传输,stream = header<stream id> * n + DATA<stream> * n
  • 3.0UDP无人机运集装箱
    • 非常适用于mobile networkQUIC 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 是一次重大的升级
  1. 主流浏览器,chrome、火狐等都已经公开宣布只支持加密的HTTP2(use TLS certificates)
  2. Stream<Message: [Frames: { Prioritization, <Data> }]>
  • 流Stream:流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2…N);
  • 消息:是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
  • FrameHTTP 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

Date:
Words:
1606
Time to read:
8 mins