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


本文插图
QUIC 重新实现了 TCP 协议的 Cubic 算法进行拥塞控制 , 并在此基础上做了不少改进 。 下面介绍一些 QUIC 改进的拥塞控制的特性 。1.6.1 热插拔 TCP 中如果要修改拥塞控制策略 , 需要在系统层面进行操作 。 QUIC 修改拥塞控制策略只需要在应用层操作 , 并且 QUIC 会根据不同的网络环境、用户来动态选择拥塞控制算法 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
1.6.2 前向纠错 FEC QUIC 使用前向纠错(FEC , Forward Error Correction)技术增加协议的容错性 。 一段数据被切分为 10 个包后 , 依次对每个包进行异或运算 , 运算结果会作为 FEC 包与数据包一起被传输 , 如果不幸在传输过程中有一个数据包丢失 , 那么就可以根据剩余 9 个包以及 FEC 包推算出丢失的那个包的数据 , 这样就大大增加了协议的容错性 。这是符合现阶段网络技术的一种方案 , 现阶段带宽已经不是网络传输的瓶颈 , 往返时间才是 , 所以新的网络传输协议可以适当增加数据冗余 , 减少重传操作 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
1.6.3 单调递增的 Packet Number TCP 为了保证可靠性 , 使用 Sequence Number 和 ACK 来确认消息是否有序到达 , 但这样的设计存在缺陷 。超时发生后客户端发起重传 , 后来接收到了 ACK 确认消息 , 但因为原始请求和重传请求接收到的 ACK 消息一样 , 所以客户端就郁闷了 , 不知道这个 ACK 对应的是原始请求还是重传请求 。 如果客户端认为是原始请求的 ACK , 但实际上是左图的情形 , 则计算的采样 RTT 偏大;如果客户端认为是重传请求的 ACK , 但实际上是右图的情形 , 又会导致采样 RTT 偏小 。 图中有几个术语 , RTO 是指超时重传时间(Retransmission TimeOut) , 跟我们熟悉的 RTT(Round Trip Time , 往返时间)很长得很像 。 采样 RTT 会影响 RTO 计算 , 超时时间的准确把握很重要 , 长了短了都不合适 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
QUIC 解决了上面的歧义问题 。 与 Sequence Number 不同的是 , Packet Number 严格单调递增 , 如果 Packet N 丢失了 , 那么重传时 Packet 的标识不会是 N , 而是比 N 大的数字 , 比如 N + M , 这样发送方接收到确认消息时就能方便地知道 ACK 对应的是原始请求还是重传请求 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
1.6.4 ACK Delay TCP 计算 RTT 时没有考虑接收方接收到数据到发送确认消息之间的延迟 , 如下图所示 , 这段延迟即 ACK Delay 。 QUIC 考虑了这段延迟 , 使得 RTT 的计算更加准确 。
CSDNHTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
本文插图
1.6.5 更多的 ACK 块 一般来说 , 接收方收到发送方的消息后都应该发送一个 ACK 回复 , 表示收到了数据 。 但每收到一个数据就返回一个 ACK 回复太麻烦 , 所以一般不会立即回复 , 而是接收到多个数据后再回复 , TCP SACK 最多提供 3 个 ACK block 。 但有些场景下 , 比如下载 , 只需要服务器返回数据就好 , 但按照 TCP 的设计 , 每收到 3 个数据包就要“礼貌性”地返回一个 ACK 。 而 QUIC 最多可以捎带 256 个 ACK block 。 在丢包率比较严重的网络下 , 更多的 ACK block 可以减少重传量 , 提升网络效率 。
CSDNHTTP/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 的接收窗口缩小 。


推荐阅读