Google QUIC 协议:从 TCP 到 UDP 的 Web 平台

简介:

QUIC(Quick UDP Internet Connections)协议是一种全新的基于UDP的web开发协议。

从TCP协议说起

当前,web平台的数据传输都基于TCP协议。TCP协议在创建连接之前需要进行三次握手(图1),如果需要提高数据交互的安全性,既增加传输层安全协议(TLS),还会增加更多的握手次数(图2)。


29c3c0aedbcd8550a89aed0913f0dd7e78350860

图1,TCP三次握手示意(来源 Next generation multiplexed transport over UDP (PDF))


<a href=https://yqfile.alicdn.com/e479b4e04aabd13671dc5560f61a60bc1d669f62.png
" >

图2,TLS初始化握手示意(来源 Next generation multiplexed transport over UDP (PDF))

正因为TCP协议连接建立的成本相对较高,可以通过TCP快速打开(TCP Fast Open)来减少建立连接时的握手次数。但是该技术目前应用较少。

和TCP相反,UDP协议是无连接协议。客户端发出UDP数据包后,只能“假设”这个数据包已经被服务端接收。这样的好处是在网络传输层无需对数据包进行确认,但存在的问题就是为了确保数据传输的可靠性,应用层协议需要自己完成包传输情况的确认。

此时,QUIC协议就登场了。QUIC协议可以在1到2个数据包(取决于连接的服务器是新的还是已知的)内,完成连接的创建(包括TLS)(图3)。


23b2f96bbbb3bf13a8ccda9ae9a902266fae7d1e

图3,QUIC协议握手示意(来源 Next generation multiplexed transport over UDP (PDF))

QUIC协议的目的

从前文对比可以看出,QUIC协议的主要目的,是为了整合TCP协议的可靠性和UDP协议的速度和效率。

QUIC的维基百科页面介绍了该协议的主要目的:

对于Google来说优化TCP协议是一个长期目标,QUIC旨在创建几乎等同于TCP的独立连接,但有着低延迟,并对类似SPDY的多路复用流协议有更好的支持。 如果QUIC协议的特性被证明是有效的,这些特性以后可能会被迁移入后续版本的TCP和TLS协议(它们都有很长的开发周期)。

值得注意的是,如果QUIC的特性被证明是有效的,这些特性以后可能会被迁移到后续版本的TCP协议中。

TCP协议的实现是高度管制的。TCP协议栈通常由操作系统实现,如Linux、Windows内核或者其他移动设备操作系统。修改TCP协议是一项浩大的工程,因为每种设备、系统的实现都需要更新。

相反的,UDP协议在操作系统层面实现相对简单,基于UDP协议实现新的协议以验证Google对于TCP协议改进的理论,验证成本相对较低。

QUIC协议内置了TLS栈,实现了自己的传输加密层,而没有使用现有的TLS 1.2。同时QUIC还包含了部分HTTP/2的实现,因此QUIC的地位看起来是这样的:


9a79ab86fe7a82919d2f93227beb77faa6598e9f

从图上可以看出,QUIC底层通过UDP协议替代了TCP,上层只需要一层用于和远程服务器交互的HTTP/2 API。这是因为QUIC协议已经包含了多路复用和连接管理,HTTP API只需要完成HTTP协议的解析即可。

QUIC特性

避免前序包阻塞

SPDY和HTTP/2协议现在都支持将页面的多个数据(如图片、js等)通过一个数据链接进行传输。该特性能够加快页面组件的传输速度,但是对于TCP协议来说,这会遇到前序包阻塞的问题。这是由于TCP协议在处理包时是有严格顺序的,当其中一个数据包遇到问题,TCP连接需要等待这个包完成重传之后才能继续进行。因此,即使逻辑上一个TCP连接上并行的在进行多路数据传输,其他毫无关联的数据也会因此阻塞。


94a70ccb62d1da092e7a7bbe6b9b61fde65458d0

QUIC协议直接通过底层使用UDP协议天然的避免了该问题。由于UDP协议没有严格的顺序,当一个数据包遇到问题需要重传时,只会影响该数据包对应的资源,其他独立的资源(如其他css、js文件)不会受到影响。


07de7bdf244035d55c360a0be5300dfeb5d3c287

减少数据包

前文已经介绍过QUIC协议在创建连接握手时,只需要1到2个数据包即可。这对于拥有高速互联网连接的网络环境下可能没有太大的感觉,因为此时一个数据包的延时大概在10~50ms之间。

一般来说延迟在50ms之内不会有太大的感觉。但是对于无线网络来说,情况就不太一样了。且不说传统2G/3G网络,即使是4G网络,客户端和服务器之间的延时也通常在100ms以上。传统TCP+TLS协议的传输方式,在创建连接时的4个数据包和QUIC协议的1个数据包相比,连接创建上就会多耗时300ms以上。

向前纠错

QUIC协议有一个非常独特的特性,称为向前纠错(Forward Error Correction),每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。

这类似网络层的RAID 5!

目前默认的冗余量是10%,既每发送10个数据包,其冗余数据就可以重新构建一个丢失的数据包。

向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。

会话重启和并行下载

底层协议切换到UDP协议之后的另一大好处是,连接不再依赖于来源IP。

对于TCP协议来说,标识一个TCP连接需要4个参数,既来源IP、来源端口、目的IP和目的端口。其中的任一参数改变,TCP连接就需要重新创建。

这对于传统网络来说影响不大,因为来源和目的IP相对固定。但是在无线网络中,情况就大不相同了。设备在移动过程中,可能会因为网络切换(如从WIFI网络切换到4G网络环境),导致TCP连接需要重新创建。

QUIC协议使用了UDP协议,不再需要这四元组参数。同时QUIC协议实现了自己的会话标记方式,称为连接UUID。当设备网络环境切换时,连接UUID不会发生变化,因此无需重新进行握手。

该特性除了可以减少无谓的连接重连之外,还可以充分利用设备的不同网络接口,进行资源的并行下载。因为虽然这些网络接口有不同的IP,但只要他们能够共享连接UUID,就能够并行的从服务器下载数据。

QUIC协议实践

Chrome浏览器从2014年开始已经实验性的支持了QUIC协议。可以通过在Chrome浏览器中输入chrome://net-internals/#quic查看是否已经支持QUIC协议。如果还未支持,可以在chrome://flags/#enable-quic中进行开启。

开始Chrome浏览器对QUIC协议的支持之后,可以在chrome://net-internals/#quic中查看到当前浏览器的QUIC一些连接。当然目前只有Google服务才支持QUIC协议(如YouTube、 Google.com)。

(点击放大图像)


ee726448ef6fae47cfda944387ffba2b5f761d31

关于防火墙

通常系统管理员会关注防火墙的TCP规则,而忽略UDP规则。如果要在防火墙之后使用QUIC协议,除了传统web服务需要开放的80/TCP、443/TCP之外,针对QUIC还需要开放443/UDP的访问。

服务端使用QUIC协议

目前支持QUIC协议的web服务只有0.9版本以后的Caddy。其他常用web服务如nginx、apache等都未开始支持。curl表达了对QUIC协议支持的兴趣。

QUIC性能优势

在2015年的博文中,Google分享了一些关于QUIC协议实现的结果。

这些优势在诸如YouTube的视频服务上更为突出。用户报告通过QUIC协议在观看视频的时候可以减少30%的重新缓冲时间。

如果YouTube收集的报告可靠,可以预见视频服务提供商会更快的采用QUIC协议。

总结

QUIC协议开创性的使用了UDP协议作为底层传输协议,通过各种方式减少了网络延迟。

目前QUIC协议已经在运行在最大的网站上,期待QUIC协议规范能够成为终稿,并在其他浏览器和服务器中能够实现。
文章转载自 开源中国社区 [http://www.oschina.net]

相关文章
|
2月前
|
网络协议 网络安全 网络性能优化
使用到UDP协议的情况下该如何防护
使用到UDP协议的情况下该如何防护
|
1月前
|
网络协议 数据格式
|
2月前
|
域名解析 网络协议 安全
【JavaEE初阶】 UDP协议的详细解析
【JavaEE初阶】 UDP协议的详细解析
|
2月前
|
JavaScript 前端开发 Java
MooTools、Backbone、Sammy、Cappuccino、Knockout、JavaScript MVC、Google Web Toolkit、Google Closure、Ember、Batman 以及 Ext JS。
MooTools、Backbone、Sammy、Cappuccino、Knockout、JavaScript MVC、Google Web Toolkit、Google Closure、Ember、Batman 和 Ext JS 都是 JavaScript 框架,用于开发 Web 应用程序。它们分别提供了不同的功能和特性,以帮助开发者更高效地构建和维护 Web 应用程序。
17 2
|
3月前
|
网络协议 网络性能优化
【计算机网络】UDP 协议特点解析
【1月更文挑战第27天】【计算机网络】UDP 协议特点解析
|
3月前
|
网络协议 安全 网络性能优化
【网络工程师】<软考中级>传输层协议TCP/UDP&常用应用层协议
【1月更文挑战第27天】【网络工程师】<软考中级>传输层协议TCP/UDP&常用应用层协议
|
3月前
|
XML 存储 JSON
网络原理之UDP协议
网络原理之UDP协议
|
21天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
29 7
|
1天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式