村通网之也谈 QUIC

Author Avatar
秋のかえで 2月 13, 2019
  • 在其它设备中阅读本文章
注意:由于本人过菜所以本文不会深度剖析QUIC协议

什么是QUIC?

QUIC全称Quick UDP Internet Connection。你可以看到第一个单词是Quick,快,这不是吹的,它快的原因一部分来自第二个单词UDP,稍后我们会具体讲到为什么。

为什么选择UDP

以前的HTTP不管那个版本都基于TCP传输,那么为什么要选择UDP呢?
众所周知TCP连接需要三次握手完成而且TCP采取重传机制。TCP有一个等待时间,一旦超时便重新传输该数据段,这会造成一定的阻塞,和速度上的一定影响。
而UDP是无连接的而且也不提供可靠性保证,它的可靠性保证由应用层来完成,所以速度更快传输效率更高。当然,QUIC是提供可靠性保证的,这个也会在下面讲到。
TCP是由内核实现的,所以TCP的迭代是非常缓慢的,例如说TCP Fast Open,仍有大量的系统内核版本不支持它。BBR更是如此,经常需要用户通过编译内核实现。

优势

0RTT建立连接

一般情况下建立一个HTTPS需要三个RTT。而QUIC使用前向安全实现了0RTT数据发送,可谓吊打TLS。

等待时延

这里类似TCP Fast Open,之前已经建立过连接的情况下无需握手,直接传输数据,连接时延为0。

前向冗余纠错

前面有说过TCP的重传,这里不再重复。QUIC采用了前向冗余纠错的方案,将多个包的校验和单独发送一个数据包传输,当数据包丢失时能够通过冗余数据恢复,不需要重传。

多路复用

QUIC的多路复用和HTTP/2类似,在一个QUIC连接上可以发送多个请求(stream),但是QUIC的多个stream之间没有依赖,这样能极大地缓解队头阻塞。
而HTTP/2中任何一个stream丢失了一个TCP Segment,TCP为了保证数据可靠性会重发该stream,后面的stream虽然已经到达接收端,但却被阻塞住了。而且HTTP2有TLS协议的队头阻塞,因为其强制使用了TLS。
QUIC的基本传输单元为Packet,不会超过MTU,且加密和认证都在一个Packet上,避免了TLS的队头阻塞。

拥塞控制

QUIC使用并改进了TCP的拥塞控制,下面我将介绍一下改进的方面:

可拔插

前面说过UDP通过应用层来实现,所以不用停机,轻轻reload一下便可以轻松修改拥塞控制。

递增的Packet Number

在TCP中,重传的Segment的Segment Number和原来的Segment的Segment Number一致,那么当客户端接收到Ack时就不能判断这是哪个Segment。当重传Segment返回数据时,会导致RTT过大;原Segment返回数据时又导致RTT过小。
QUIC则不然,重传时Packet Number会递增,这就很容易判断是哪个Packet,这样能使RTT的计算十分精确。
但是问题来了,这样怎么保证数据的顺序了?这时QUIC引入了一个Stream Offset的概念,就算这个包重传它的Offset是不会变的,这样子便可以保证了顺序。

再见 Reneging

什么是佩奇Reneging?就算接收端丢弃已经接收并且上报SACK选项的内容,这会给重传带来很大的干扰,因为SACK表面收到但是接收端却丢弃了该数据。
QUIC直接禁止了Reneging,只要Packet被返回Ack就代表接收端已经收到了它,减少干扰。
打个比方,A上课给B传小纸条,B收到了之后看都没看就扔了,却告诉A已经收到了,所以A就会认为B已经收到消息。

更多Ack块

TCP头部仅仅留给了SACK选项30个字节,最大只能提供三个Block,而QUIC Ack Frame却可以提供256个Ack Block(好耶!是整数)。在丢包率比较高的情况下,更多的Sack Block可以减少重传量。

Ack Delay

TCP的Timestamp只是发送Ack的时间,却没有计算从接到Segment到发送Ack的时间,这个时间叫做Ack Delay。这会导致RTT计算的误差。
比方说寄快递,寄件的时间为time1,中间快递时间为time2(只是比喻,没这么长啦),接收快递时间为time3。假设接到快递,你知道time1和time3,你就会认为寄件和收件要这么长时间,然而事实上中间还有快递的时间(导致RTT偏大)。 但是要是把快递的时间time2标上,这样你就知道这个过程实际上需要的时间(RTT更加精确)。

流量控制

QUIC和HTTP/2的流量控制类似,即在Connection和Stream级别提供了两种流量控制,这也是为了实现多路复用。
通过window_update告诉对端自己可以接收的字节数,通过BlockFrame告诉对端流量被阻塞。
但是,TCP中windows向右滑动的长度取决于确认的字节数,如果丢包,windows便不能超过这个序号。
QUIC就算丢包,它的滑动也只取决于收到的最大的偏移字节数。

加密报文

TCP的头部是不经过加密认证的,然而QUIC除了少数报文,从Headers到Body都是加密的,更加安全。

连接迁移

TCP连接由四个元标识,分别为源IP 源端口 目标IP 目标端口,一旦一个发生变化这条TCP连接就会断。
比方说NAT中,DHCP服务器给你分了个新的IP,或者是其他客户端抢占端口,这都会使得需要重新建立TCP连接。
QUIC使用一个64位的随机数字作为ID,ID不变连接就不会中断,而且出现冲突的概率很低。

某些坑

部分运营商会极大地限制UDP的速度或者是流量(特别是中国大陆地区),因为DDoS攻击也一般采用UDP,这就很坑了。。某城宽带甚至直接禁止了非53端口(DNS端口)的UDP流量。

一些消息

据IETF消息称HTTP-over-QUIC被重命名为HTTP/3,并且有望成为HTTP的第三个版本

via:
如何看待谷歌 Google 打算用 QUIC 协议替代 TCP/UDP? - Trotyl Yu的回答 - 知乎
科普:QUIC协议原理分析 - 知乎

在无特别说明的情况下,本站文章均遵循 CC BY-NC-SA 4.0
本文链接:https://blog.iknet.top/post/polular-science-quic.html