http3.0 QUIC协议为什么快

338 阅读2分钟

背景

http2

http2的多路复用相对旧版本能更好的提升速度,不过并发数量在浏览器实现上有限制,以Chrome为例为6。

缺点

使用HTTP/2所提供的多路复用功能在链路出现丢包时,TCP的按序确认机制使得丢失的数据包需要等待重新发送和确认,滑动窗口停滞,其后的所有数据包都被阻塞,这样一来HTTP/2在这种情形下的表现反而不如HTTP/1。

此外,HTTP/2在建立TCP连接的时,需要和服务器进行三次握手来确认连接成功,会消耗1.5个RTT,如果使用HTTPS的话,还需要使用TLS协议进行加密,而TLS也根据版本需要1~2个RTT(TLS1.2需要1RTT),也就是说,使用HTTP/2在信息得到传输前就需要消耗3~4个RTT(至少2.5RTT)的时间。

  • 连接耗时 TCP + TSL 握手占用时间(至少2.5RTT)
  • TCP头部浪费
  • TCP头部拥塞
  • TCP连接无法迁移(源IP + 源Port + 目标IP + 目标Port + 传输层协议)(如wifi切换5g)

QUIC

QUIC是基于UDP的,在传输层层面并没有固定的连接,可以根据需要开辟任意逻辑链路。QUIC一次建立一个Connection,一个Connection下包含多个Stream流(每个stream独自维护一个逻辑连接,因为UDP层面上是无连接的),每个流对应一个文件传输,并将不同的Stream中的数据交付给不同的上层应用。QUIC的一个Connection对应多个Stream,Stream之间相互独立,因此任意一条链路断开都不会导致其他数据阻塞。

快速握手

QUIC基于UDP,其实本身是不需要建立连接的,建连主要是为了交换TLS密钥。这里建连主要分两个场景:

  1. 首次建立连接(1RTT),需要交换加密密钥,再发送业务数据
  2. 非首次建立链接(0RTT),已经交换过加密密钥,直接发送业务数据
    而非首次实现1RTT建连的核心是使用了Diffie-Hellman算法进行密钥交换,DH算法是一个密钥协商算法,双方最终协商出一个共同的密钥,而这个密钥不会通过网络传输。

解决队头阻塞

在http2中,虽然支持多路复用,但对于tcp来说仍然只有 1 个滑动窗口来发送这些数据包。

而在quic协议中如上图所示,解决了对头阻塞的问题。

参考

juejin.cn/post/706699…

juejin.cn/post/703113…

zhuanlan.zhihu.com/p/405387352