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

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

  从TCP协议说起

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

物联网

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

物联网

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

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

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

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

物联网

  图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的地位看起来是这样的:

物联网

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

  QUIC特性

  避免前序包阻塞

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

物联网

  图片来源 Next generation multiplexed transport over UDP (PDF)

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

物联网