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


1.7 流量控制TCP 会对每个 TCP 连接进行流量控制 , 流量控制的意思是让发送方不要发送太快 , 要让接收方来得及接收 , 不然会导致数据溢出而丢失 , TCP 的流量控制主要通过滑动窗口来实现的 。 可以看出 , 拥塞控制主要是控制发送方的发送策略 , 但没有考虑到接收方的接收能力 , 流量控制是对这部分能力的补齐 。QUIC 只需要建立一条连接 , 在这条连接上同时传输多条 Stream , 好比有一条道路 , 两头分别有一个仓库 , 道路中有很多车辆运送物资 。 QUIC 的流量控制有两个级别:连接级别(Connection Level)和 Stream 级别(Stream Level) , 好比既要控制这条路的总流量 , 不要一下子很多车辆涌进来 , 货物来不及处理 , 也不能一个车辆一下子运送很多货物 , 这样货物也来不及处理 。那 QUIC 是怎么实现流量控制的呢?我们先看单条 Stream 的流量控制 。 Stream 还没传输数据时 , 接收窗口(flow control receive window)就是最大接收窗口(flow control receive window) , 随着接收方接收到数据后 , 接收窗口不断缩小 。 在接收到的数据中 , 有的数据已被处理 , 而有的数据还没来得及被处理 。 如下图所示 , 蓝色块表示已处理数据 , 黄色块表示未处理数据 , 这部分数据的到来 , 使得 Stream 的接收窗口缩小 。
CSDN|HTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
随着数据不断被处理 , 接收方就有能力处理更多数据 。 当满足 (flow control receive offset - consumed bytes) < (max receive window / 2) 时 , 接收方会发送 WINDOW_UPDATE frame 告诉发送方你可以再多发送些数据过来 。 这时 flow control receive offset 就会偏移 , 接收窗口增大 , 发送方可以发送更多数据到接收方 。
CSDN|HTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
Stream 级别对防止接收端接收过多数据作用有限 , 更需要借助 Connection 级别的流量控制 。 理解了 Stream 流量那么也很好理解 Connection 流控 。 Stream 中 , 接收窗口(flow control receive window) = 最大接收窗口(max receive window) - 已接收数据(highest received byte offset), 而对 Connection 来说:接收窗口 = Stream1 接收窗口 + Stream2 接收窗口 + … + StreamN 接收窗口。
总结QUIC 丢掉了 TCP、TLS 的包袱 , 基于 UDP , 并对 TCP、TLS、HTTP/2 的经验加以借鉴、改进 , 实现了一个安全高效可靠的 HTTP 通信协议 。 凭借着 0 RTT 建立连接、平滑的连接迁移、基本消除了队头阻塞、改进的拥塞控制和流量控制等优秀的特性 , QUIC 在绝大多数场景下获得了比 HTTP/2 更好的效果 。不久前 , 微软宣布开源自己的内部 QUIC 库 -- MsQuic , 将全面推荐 QUIC 协议替换 TCP/IP 协议 。HTTP/3 未来可期 。


推荐阅读