QUIC协议(快速UDP网络连接)是一种全新的网络协议,该协议是在UDP的基础上开发的,用于替代TCP。有些人甚至开玩笑地称其为TCP/2。

QUIC协议真正有趣的地方是对UDP的改进。

现在,由于TCP作为传输协议的可靠性,所以网络都是建立在TCP之上的。想要建立一个TCP连接需要进行三次握手。这意味着每次连接都会产生额外的往返(网络数据包在来回发送),从而给每个连接增加了显著的延迟。

 

https://static.jiayezz.com/3c/1e927b5d6e2fbe265e490f811f98f9

 

除此之外,如果你还需要TLS协商来创建一个安全、加密的https连接,那么就需要来回传送更多的网络数据包。

 

https://static.jiayezz.com/d8/8a3be33200f50da5778d6b90ab5da4

 

一些像TCP Fast Open的创新可以改善TCP的这种情况,但这并没有得到广泛采用。

UDP另一方面更多的像是一种发出即不管的协议。一个消息如果经由UDP发送,则认为已经到达了目的地。好处是只会在网络上花费很少的时间来验证数据包,缺点是为了验证数据的可靠性,必须在UDP之上建立一些东西来确认数据包的交付。

这就是谷歌QUIC协议的切入点。

QUIC协议可以在1个或2个包中启动一个连接并且商谈所有的TLS(HTTPs)参数 (取决于你想要连接的是一个新的服务器还是一个已知主机)。

 

https://static.jiayezz.com/37/ff839576eff5df73548829976b949b

 

这对于初始连接和开始下载来说会产生一个巨大的差异。

 


为什么需要QUIC ?

QUIC协议开发团队所做的事情是绝对不可思议的。他们想把UDP协议的速度、可能性与TCP协议的可靠性综合起来。

维基百科的解释相当好:

改善TCP协议是谷歌的一个长期目标,QUIC旨在等效于一个独立的TCP连接,但能更好地减少延迟,同时更好地得到像SPDY一样的流多路复用的支持。

如果QUIC的功能证明是有效的,那么这些功能就可以迁移到最新版本的TCP和TLS中。

TCP协议是高度管制的。它的实现嵌入在Windows和Linux的内核中,在每一个手机操作系统之中,几乎存在于每一个低级设备中。提高TCP的工作方式是困难的,因为每个设备都需要遵循TCP的实现。

而UDP的设计却是相对简单的。所以如果想要验证谷歌关于TCP的一些理论,在UDP上能够更快地实现一个新的协议。这样,一旦他们可以证实他们关于网络拥塞,流阻塞的理论,他们就可以开始把QUIC协议中好的部分移植到 TCP协议中。

但修改TCP协议栈需要从Linux和Windows内核开始,中间还需要用户更新他们的协议栈。对于协议的开发人员来说,在UDP上做同样的事情是更加困难的。不过这可以允许他们更快地迭代,并且可以在几个月内实现这些理论,而不是几年或几十年。

 


QUIC应该放在哪里?

如果你看看现代HTTPs连接层的组成,QUIC取代了TLS堆栈和HTTP/2的一部分。

QUIC协议实现了自己的加密层,所以不能使用现有的TLS 1.2。

 

https://static.jiayezz.com/e5/79c47732d161530466c3c67869c204

 

它用UDP取代了TCP,QUIC上面是一个较小的HTTP / 2 API,用来与远程服务器通信。变小的原因是QUIC已经处理了多路复用和连接管理。接下来是HTTP协议的解释。

 


TCP head-of-line阻塞

有了SPDY和HTTP/2,我们现在可以用一个TCP连接来连接到服务器,而不是为每个页面上的资源建立多个连接。

 

https://static.jiayezz.com/d9/c51055219f86b1a06f902b1544d453

 

现在一切都取决于这一个TCP连接,缺点是:head-of-line阻塞。

在TCP中,数据包需要以正确的顺序到达。如果一个数据包丢失,它需要被重新传输。TCP连接需要等待TCP包才能继续解析其他包,因为处理TCP数据包的顺序很重要。

 

https://static.jiayezz.com/24/1f40a676a8576af259175a1f682ba7

 

在QUIC中,决定不再使用TCP。

UDP不依赖于收到数据包的顺序。虽然在传输过程中数据包仍然可能丢失,但它们只会影响单个资源,而不是整个连接块。

 

https://static.jiayezz.com/67/e24bb810716d0b187e13973c098b71

 

QUIC本质上是一个结合了SPDY和HTTP2(复用)的非阻塞传输协议。

 


为什么更少的数据包那么重要

如果你足够幸运建立了快速网络连接,你和远程服务器之间可能会有10-50ms的延迟。如果延迟< 50 ms,好处可能并不明显。

但当你跟在另一个大陆的一个服务器或通过移动运营商(使用3G/4G/LTE)进行通讯的时候,这个效果就显而易见了。如果从欧洲到达位于美国的一个服务器,你必须横渡大西洋。你将会得到一个超过100ms或更高的延迟。

 

https://static.jiayezz.com/91/5eab4086a6aec640c7fdb2c64d961a

 


前向纠错:防止失败

QUIC中一个很棒的功能是FEC或前向纠错。每一个发送的数据包还会包含其它包的足够信息,这样丢失的数据包可以重建,而不必重新发送它。

这就是网络水平上的RAID 5。

正因为如此,这里有一种权衡:每个UDP数据包会包含比实际需要更多的有效载荷,因为它包含了潜在的丢失数据包,这种方式可以更容易地重塑丢失数据包。

 


会话重用&并行下载

切换到UDP的另一个激动人心的机会是不再依赖于连接的源IP。

在TCP,你需要4个参数组成一个连接。开始一个新的TCP连接,你需要源IP、源端口、目的IP和目的端口。

 

https://static.jiayezz.com/ea/37ae0d0e457968a2a6c6979cf2ea76

 

如果有任何参数发生了变化,就会需要一个新的TCP连接。

这就是为什么在移动设备上保持一个稳定的连接非常困难,因为你可能会不断切换WiFi和3 G/LTE。

 

https://static.jiayezz.com/0d/a38f71da7261a3f7b948c5c3512f94

 

而QUIC为唯一的连接实现了自己的标识符,称为连接UUID。有可能从无线切换到LTE时仍然保持你的连接UUID,所以不需要重新连接或商谈TLS。你以前的连接仍然是有效的。 

这打开了一扇新大门,可以使用多个源来获取内容。如果连接UUID可以通过WiFi和蜂窝连接共享,理论上可以同时下载内容。你可以使用所有可用的接口来有效地并行流传输或下载内容。

 


QUIC协议已经在运转

 

Chrome浏览器自2014年以来已经支持(实验)QUIC。如果你想测试QUIC,您可以启用Chrome上的协议。实际上,你只能针对谷歌服务来测试QUIC协议。

 

有一个方便的Chrome插件可以在您的浏览器上将HTTP/2和QUIC协议显示为一个图标:HTTP/2和SPDY指标。

 

你可以打开chrome:/ / net-internals / #quic看到QUIC已经使用了。

 

https://static.jiayezz.com/92/93a20cf0d7c14e75e4a9d4a14a45a8

 

如果你对底层细节感兴趣,你甚至可以看到所有的活跃连接,并且可以捕获每个包: chrome://net-internals/#events&q=type:QUIC_SESSION%20is:active.

 

https://static.jiayezz.com/bd/16d6a3a954ac7c463dd579204fd829

 


 会有人想到防火墙吗?

如果你是一个系统管理员或网络工程师,在一开始我提到QUIC用UDP代替TCP时,你可能会有点疑惑。

例如,当我们在网络服务器的主机上配置防火墙时,防火墙规则看起来像这些:

 

https://static.jiayezz.com/20/47f0353c8659972b2becec9b59d4f8

 

要特别注意协议列:TCP。

我们的防火墙与其他系统管理员的部署并没有什么不同。在这个时候,对一个网络服务器来说,没有任何理由允许除了80 / TCP或443 / TCP之外的连接。

而如果我们想让QUIC协议生效,我们就需要允许443 / UDP通过。

对于服务器,这意味着开放443/UDP传入。对于客户端来说,这意味着允许443/UDP传出。

在大型企业中,这可能会是一个问题。因为他们的网络通常只允许TCP端口通过,如果允许UDP通过听起来有些可疑。

虽然我认为这在连接方面会是一个主要问题,但是谷歌所做的实验证明事实并非如此。

 

https://static.jiayezz.com/04/1c9dd3c439fb01090a8d31e33de346

 

在服务器端运行QUIC 

现在,唯一可以让你使用QUIC的网络服务器是Caddy,而且从0.9版开始。   

客户端和服务器端的支持都被认为是实验性的,所以是否要运行它取决于你的选择。

因为没有人的客户端是默认支持QUIC的,所以你可能仍然需要在自己的浏览器中允许QUIC,并运行它。

 


QUIC的性能优势

在2015年的一篇博文中,谷歌分享了QUIC实施的一些结果:

结果是,QUIC在比较差的网络条件下胜过了TCP,谷歌搜索页面的加载时间最少提升了1%。

这些好处在YouTube等视频服务上更加明显。用户报告在使用QUIC观看视频时可以减少30%的缓存时间。

YouTube数据尤其有趣。如果这些改进是可行的,我们很快就会在像Vimeo一样的视频流业务或“成人流媒体服务”上看到这个应用。

 

总结

我发现QUIC协议十分迷人的!

我已经迫不及待的想要看到QUIC协议在其他浏览器和网络服务器中实现了!

原文链接:https://ma.ttias.be/googles-quic-protocol-moving-web-tcp-udp/


文章原文链接:https://www.anquanke.com/post/id/84324