QUIC协议

一、什么是quic

  • QUIC(Quick UDP Internet Connection)是谷歌提出的一种基于UDP的低时延的互联网传输层协议
  • QUIC解决了现代网站应用的一系列的传输层及应用层的问题,但只需要应用开发者几乎不用做出或者只做出很小的改变。QUIC和TCP+TLS+HTTP很类似,但是基于UDP实现,基于QUIC实现的HTTP协议被提议为HTTP3。
  • 0RTT 建立连接可以说是 QUIC 相比 HTTP2 最大的性能优势。0RTT是指传输层0RTT建立连接(QUIC基于UDP,不需要三次握手)及加密层0RTT建立加密连接(注意是对于大多数连接,不是所有连接)。
  • QUIC可以不用等服务端的回包就直接下发报文,而一般的TCP+TLS连接在连接建立前需要等1-3个RTT。

二、为什么要使用quic

QUIC协议_第1张图片

根据腾讯相关的测试数据显示:

  • 在元素较少(12个元素)的情况下:相比HTTP也能提升9%,相比HTTP2提升42%,相比HTTPS提升52%
  • 在页面元素较多的情况下:quic的优势会更加明显,相比http提升36%,比http2提升47%,相比https提升64%

三、现有的网络环境

1.TCP+TLS1.2

  • TCP+TLS1.2的交互流程如图 所示,一共需要3RTT后才可以进行应用层的数据交互(SYN到Application Data之间部分)。即使是加入了TLS1.2的缓存机制后,也需要2RTT。
    QUIC协议_第2张图片

2.TCP+TLS1.3

  • TLS1.3(2018年8月发布)的交互流程如图 5所示,需要1RTT,TCP+TLS1.3的时间就是2RTT。即使是会话恢复也需要1RTT。

QUIC协议_第3张图片

四、QUIC的过程

1.具体流程

(1) 客户端判断本地是否已有服务器的全部配置参数,如果有则直接跳转到(5),否则继续


(2) 客户端向服务器发送inchoate client hello(CHLO)消息,请求服务器传输配置参数

 

(3) 服务器收到CHLO,回复rejection(REJ)消息,其中包含服务器的部分配置参数

 
(4) 客户端收到REJ,提取并存储服务器配置参数,跳回到(1)

 
(5) 客户端向服务器发送full client hello消息,开始正式握手,消息中包括客户端选择的公开数。此时客户端根据
获取的服务器配置参数和自己选择的公开数,可以计算出初始密钥。


(6) 服务器收到full client hello,如果不同意连接就回复REJ,同(3);如果同意连接,根据客户端的公开数计算
出初始密钥,回复server hello(SHLO)消息,SHLO用初始密钥加密,并且其中包含服务器选择的一个临时公开数。


(7) 客户端收到服务器的回复,如果是REJ则情况同(4);如果是SHLO,则尝试用初始密钥解密,提取出临时公开数


(8) 客户端和服务器根据临时公开数和初始密钥,各自基于SHA-256算法推导出会话密钥

 
(9) 双方更换为使用会话密钥通信,初始密钥此时已无用,QUIC握手过程完毕。之后会话密钥更新的流程与以上
过程类似,只是数据包中的某些字段略有不同。

2.初次连接(没有缓存服务器配置)

  • 此时最短时间是1RTT
    QUIC协议_第4张图片

3.客户端已经缓存服务器的配置

  • 此时最短0RTT
    QUIC协议_第5张图片

五、QUIC优点

1.改进的拥塞控制

  • QUIC默认使用TCP中的CUBIC拥塞控制算法,同时也支持RENO,BBR,PCC等算法,并且对多方面进行改进,不需要改操作系统和内核。
  • 单个程序的不同连接也能支持配置不同的拥塞控制。这样我们就可以给不同的用户提供更好的拥塞控制。
  • 应用程序变更拥塞控制,甚至不需要停机和升级。
  • QUIC还有带宽预测,RTT监控,发送速率调整等高级算法支持。

2.双级别的流控

  • TCP通过滑动窗口机制来保证可靠性以及进行流量控制。QUIC更新了其滑动窗口机制,并在Connection和Stream两个级别分别进行流控。
  • connection可用窗口 = stream1可用窗口 + stream2可用窗口 + streamN可用窗口
    QUIC协议_第6张图片

3.连接迁移

TCP下一个连接是以四元组标识的,即(SrcIp,SrcPort,DstIp,DstPort)。而QUIC连接是以客户端产生的一个64位随机数作为连接标识。当网络、端口发生改变或中断时(wifi切换成4G网络),只要连接标识不改变,连接就不会中断。

4.没有队头阻塞的多路复用

在这里插入图片描述

  • SDPY和HTTP2协议的多路复用,是让所有请求在一个TCP连接上传输。前面说过,TCP协议有队头阻塞问题,如果某个资源的某个包丢失了,由于TCP是保证时序的,就会在接收端形成队头阻塞。TCP协议无法区分各个资源的包是否关联,因此会停止处理所有资源,直到丢包恢复
    QUIC协议_第7张图片
  • QUIC是基于UDP的,UDP不需要保证包的时序,因而不存在等待丢包恢复,不存在队头阻塞问题。如果某个资源的某个包丢失了,只会影响单个资源,其他资源会继续传输。

5.向前冗余检测

  • QUIC实现向前冗余检测,在重要的包如握手信息发生丢失时,能够根据冗余信息还原出握手信息,减少重传的次数

参考资料:https://cloud.tencent.com/developer/article/1405624
https://blog.csdn.net/u014023993/article/details/86500415

你可能感兴趣的:(计算机网络)