CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!( 三 )


HTTP/2 的多路复用解决了上述的队头阻塞问题 。 不像 HTTP/1.1 中只有上一个请求的所有数据包被传输完毕下一个请求的数据包才可以被传输 , HTTP/2 中每个请求都被拆分成多个 Frame 通过一条 TCP 连接同时被传输 , 这样即使一个请求被阻塞 , 也不会影响其他的请求 。 如下图所示 , 不同颜色代表不同的请求 , 相同颜色的色块代表请求被切分的 Frame 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
事情还没完 , HTTP/2 虽然可以解决“请求”这个粒度的阻塞 , 但 HTTP/2 的基础 TCP 协议本身却也存在着队头阻塞的问题 。 HTTP/2 的每个请求都会被拆分成多个 Frame , 不同请求的 Frame 组合成 Stream , Stream 是 TCP 上的逻辑传输单元 , 这样 HTTP/2 就达到了一条连接同时发送多条请求的目标 , 这就是多路复用的原理 。 我们看一个例子 , 在一条 TCP 连接上同时发送 4 个 Stream , 其中 Stream1 已正确送达 , Stream2 中的第 3 个 Frame 丢失 , TCP 处理数据时有严格的前后顺序 , 先发送的 Frame 要先被处理 , 这样就会要求发送方重新发送第 3 个 Frame , Stream3 和 Stream4 虽然已到达但却不能被处理 , 那么这时整条连接都被阻塞 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
不仅如此 , 由于 HTTP/2 必须使用 HTTPS , 而 HTTPS 使用的 TLS 协议也存在队头阻塞问题 。 TLS 基于 Record 组织数据 , 将一堆数据放在一起(即一个 Record)加密 , 加密完后又拆分成多个 TCP 包传输 。 一般每个 Record 16K , 包含 12 个 TCP 包 , 这样如果 12 个 TCP 包中有任何一个包丢失 , 那么整个 Record 都无法解密 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
队头阻塞会导致 HTTP/2 在更容易丢包的弱网络环境下比 HTTP/1.1 更慢!
【CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!】那 QUIC 是如何解决队头阻塞问题的呢?主要有两点:

  • QUIC 的传输单元是 Packet , 加密单元也是 Packet , 整个加密、传输、解密都基于 Packet , 这样就能避免 TLS 的队头阻塞问题;
  • QUIC 基于 UDP , UDP 的数据包在接收端没有处理顺序 , 即使中间丢失一个包 , 也不会阻塞整条连接 , 其他的资源会被正常处理 。

CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
1.6 拥塞控制拥塞控制的目的是避免过多的数据一下子涌入网络 , 导致网络超出最大负荷 。 QUIC 的拥塞控制与 TCP 类似 , 并在此基础上做了改进 。 所以我们先简单介绍下 TCP 的拥塞控制 。TCP 拥塞控制由 4 个核心算法组成:慢启动、拥塞避免、快速重传和快速恢复 , 理解了这 4 个算法 , 对 TCP 的拥塞控制也就有了大概了解 。
  • 慢启动:发送方向接收方发送 1 个单位的数据 , 收到对方确认后会发送 2 个单位的数据 , 然后依次是 4 个、8 个……呈指数级增长 , 这个过程就是在不断试探网络的拥塞程度 , 超出阈值则会导致网络拥塞;
  • 拥塞避免:指数增长不可能是无限的 , 到达某个限制(慢启动阈值)之后 , 指数增长变为线性增长;
  • 快速重传:发送方每一次发送时都会设置一个超时计时器 , 超时后即认为丢失 , 需要重发;
  • 快速恢复:在上面快速重传的基础上 , 发送方重新发送数据时 , 也会启动一个超时定时器 , 如果收到确认消息则进入拥塞避免阶段 , 如果仍然超时 , 则回到慢启动阶段 。

CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!


推荐阅读