关于QUIC协议的连接、重传、多路复用、流量控制

QUIC协议是基于UDP封住的一个协议

自定义连接机制

QUIC 在自己的逻辑里面维护连接的机制,以一个 64 位的随机数作为 ID 来标识,而且 UDP 是无连接的,所以当 IP 或者端口变化 的时候,只要 ID 不变,就不需要重新建立连接。

自定义重传机制

QUIC 也有个序列号,是递增的。
任何一个序列号的包只发送一次,下次就要加一了。例如,发送一个 包,序号是 100,发现没有返回;再次发送的时候,序号就是 101 了;如果返回的 ACK 100,就是对第 一个包的响应。如果返回 ACK 101 就是对第二个包的响应,RTT 计算相对准确。

QUIC 定义了一个 offset 概念。
QUIC 既然是面向连接的,也就像 TCP 一样,是一个数据流,发送的数据在这个数据流里面有个 偏移量 offset,可以通过 offset 查看数据发送到了哪里,这样只要这个 offset 的包没有来,就要重发; 如果来了,按照 offset 拼接,还是能够拼成一个流。
在这里插入图片描述

无阻塞的多路复用

同 HTTP 2.0 一样,同一条 QUIC 连接上可以创建多个 stream,来发送多个 HTTP 请求。但QUIC 是基于 UDP 的,一个连接上的多个 stream 之间没有依赖。这样,假如 stream2 丢了一个 UDP 包,后 面跟着 stream3 的一个 UDP 包,虽然 stream2 的那个包需要重传,但是 stream3 的包无需等待,就 可以发给用户。

自定义的流量控制

QUIC 的流量控制也是通过 window_update,来告诉对端它可 以接受的字节数。
但是 QUIC 的窗口是适应自己的多路复用机制的,不但在一个连接上控制窗口,还在 一个连接中的每个 steam 控制窗口。

还记得吗?在 TCP 协议中,接收端的窗口的起始点是下一个要接收并且 ACK 的包,即便后来的包都到 了,放在缓存里面,窗口也不能右移,因为 TCP 的 ACK 机制是基于序列号的累计应答,一旦 ACK 了一 个系列号,就说明前面的都到了,所以只要前面的没到,后面的到了也不能 ACK,就会导致后面的到 了,也有可能超时重传,浪费带宽。

QUIC 的 ACK 是基于 offset 的,每个 offset 的包来了,进了缓存,就可以应答,应答后就不会重发, 中间的空挡会等待到来或者重发即可,而窗口的起始位置为当前收到的最大 offset,从这个 offset 到当 前的 stream 所能容纳的最大缓存,是真正的窗口大小。显然,这样更加准确。

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QUIC中,无状态重传的实现依赖于发送方和接收方的协同工作。当发送方发送一个数据包时,它会为该数据包分配一个唯一的序列号,并将序列号和数据包的帧数据发送给接收方。如果数据包丢失或损坏,接收方可以根据序列号和帧数据来重构该数据包,而不需要等待发送方的重传请求。 具体地说,当接收方检测到一个数据包丢失时,它会向发送方发送一个ACK帧,指示已经接收到了所有序列号小于丢失数据包序列号的数据包。在这个ACK帧中,接收方会包含一个"Missing"字段,用于指示丢失的数据包的序列号。发送方会收到这个ACK帧并根据Missing字段来判断哪些数据包丢失了。发送方会立即重传这些丢失的数据包,并将它们重新发送给接收方。 接收方在接收到重传数据包时,会根据数据包的序列号和帧数据来重构该数据包,从而达到无状态重传的效果。 总之,无状态重传的实现依赖于发送方和接收方的协同工作,发送方需要为每个数据包分配唯一的序列号并将序列号和帧数据发送给接收方。接收方在检测到丢失的数据包时,会向发送方发送一个ACK帧,指示丢失的数据包的序列号。发送方会根据ACK帧中的Missing字段来判断哪些数据包丢失了,并立即进行重传。接收方在接收到重传数据包时,会根据数据包的序列号和帧数据来重构该数据包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值