QUIC之UDP实现可靠传输

x33g5p2x  于2021-09-23 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(445)

QUIC简介

QUIC的全称是 Quick UDP Internet Connection,叫做快速UDP网络连接,是Google提出的一个基于UDP的可靠的安全的传输协议。

QUIC的改进

相较于HTTP2+TCP+TLS,QUIC有以下优点:
1、 QUIC减少了TCP+TLS的握手时间
2、 QUIC减少了TCP的队头阻塞
3、 QUIC支持连接转移
4、 QUIC支持改进版的拥塞控制
5、 QUIC有着更精确的RTT时间

QUIC报文结构

一个QUIC的基本单位为packet,也就是包。

QUIC头部

1、 Flags占8个字节,里面记录了报文的类型、ConnectionID的长度、Version的长度、Packet Number的长度。

2、 Connection ID:一个QUIC连接对应着一个Connection ID,是一个QUIC 连接 的唯一标识。 QUIC 不用 源IP、源端口、目的IP、目的端口 四元组来为唯一标识一个连接,而是通过一个Connection ID,目的是为了连接转移。

3、 Version : QUIC的版本号

4、 Packet Number: 一个QUIC包的唯一标识,是递增的。

QUIC实际数据

QUIC包中的数据是由多个帧组成的。我们先说下帧的结构

1、 Type 中包含帧的类别,比如ack帧、FIN帧等、还有流标识符、数据偏移量、数据大小的字节长度。
2、 流标识符:一个发送请求对应着一个流
3、 流偏移量:当前帧在流中的偏移位置
4、 数据长度: 帧中携带数据的字节大小
5、 接下来就是实际传输的数据。

QUIC组成结构

一个发送请求对应着一个流。

一个流中包含多个帧。

一个流可以通过多个包进行传递。

QUIC 就是由 包 packet 和 帧 组成的。

一个packet 包中可以同时包含多个帧。帧与帧之间没有关系。

帧 和 packet 之间没有什么关系,packet 只是用来运载帧的。

QUIC安全连接详解

在阅读下面流程,需要掌握DH算法的工作流程,不熟悉的可以看下我之前俺写的一篇文章,HTTPS之TLS1.2连接详解。

QUIC 是 安全的, 其使用DH算法生成对称密钥。连接如下:
1、客户端发送Client Hello给服务器,请求DH生成密钥的参数
2、服务器返回对应的参数和公钥给参数给客户端
3、客户端收到DH参数以及服务器的公钥,生成了密钥,然后将自己公钥发给服务器。在此时,客户端已经可以利用密钥加密数据进行传输了。
4、服务器收到客户端的公钥后,也可以得出对应的密钥了,可以解密客户端发来的密文。

从上述流程看出,仅仅1个RTT,客户端和服务器就可以生成对称密钥,可以安全的进行连接了。

QUIC 还有进一步优化,优化到了0RTT。

客户端可以缓存服务器的DH参数,这样的话,客户端在进行连接的时候,就可以生成对应的密钥,然后将自己的公钥传过去。服务器同样可以利用客户端的公钥生成密钥,然后解密数据。

0RRT就可以建立安全连接,太好了。

QUIC数据传输和重传

QUIC将上层数据包,比如HTTP3数据包,分成多个帧,然后组装成一个Packet 发送。

每个帧都会有一个定时器,如果在规定时间内收不到对应的ack,就重传对应的帧,还是通过packet,如果有其他帧一块,就凑成一个packet,如果没有,就自己用一个packet。

QUIC解决队头阻塞

TCP利用的是滑动端口,端口中的前面的数据不被读取,后面的数据无法被读取,这就意味着不同的请求之间存在前后制约关系,进而出现了队头阻塞问题。

因为UDP每个请求都对应着一个流,每个流都直接被拆分成直接被发送出去,请求与请求之间不存在制约关系。所以不会存在队头阻塞问题。

但是流内部之间由于网络问题,有的时候会出现后面的数据先于前面的数据发送到对方,也会造成后面的数据等待前面的数据,但这是无法避免的事,任何协议都无法避免。QUIC在这方面已经做到最好了。

QUIC 连接迁移

假如 手机 从 WiFi 切换到了 手机数据网络,对应的IP地址会发生改变。

TCP 是利用 源IP地址、源端口、目的IP地址、目的端口 四元组来唯一标识一个TCP连接。服务器也是通过这个四元组来维护连接信息的,所以更换了IP地址信息,肯定要重新建立连接。

QUIC是不需要新建连接的。
因为QUIC是基于UDP,UDP是无连接的,QUIC是通过一个Connection ID来标识一个连接,,服务器也是通过Connection ID来标识一个QUIC连接的信息。即使切换了网络,新网络还可以通过之前的Connection ID来继续利用之前的连接,无需新建连接。

QUIC估算RTT

相较于TCP,因为TCP超时重传的Seq 和之前的包是一模一样的,发送方无法判断是之前发送的包的ack,还是重传的包的ack,有歧义性。当出现重传的时候,就会造成RTT的不准确。

QUIC就不一样了,QUIC每次重传都会新增对应的Packet Num,RTT完全就是每个包对应的往返时间。

与此同时,QUIC还会统计服务器收到数据包和返回ACK的相关时间,也就说会将服务器处理数据的时间从RTT中减去,更加精确了。

QUIC的RTT判断是比较准确的。

相关文章