What is QUIC?
QUIC(Quick UDP Internet Connections)是Google推出的一套基于UDP的传输协议。2018年11月,国际互联网工程任务组(The Internet Engineering Task Force,IETF)将HTTP over QUIC实验性协议重命名为HTTP/3,成为HTTP协议的第三个正式版本。在普及程度上,由于QUIC为Google主导,所以有些曲高和寡,虽然使QUIC成为HTTP/3的标准传输协议的提案已经被广泛接受,但在浏览器中目前仅有Chrome支持。
不过也有像腾讯这样于2017年就在生产环境应用了QUIC的例子,其优势十分明显:
灰度实验的效果也非常明显,其中 quic 请求的首字节时间 (rspStart) 比 http2 平均减少 326ms, 性能提升约25%; 这主要得益于 quic 的 0RTT 和 1RTT 握手时间,能够更早的发出请求。
此外 quic 请求发出的时间(reqStart) 比 h2 平均减少 250ms; 另外 quic 请求页面加载完成的时间 (loadEnd) 平均减少2s,由于整体页面比较复杂,很多其它的资源加载阻塞,导致整体加载完成的时间比较长约 9s,性能提升比例约 22%。
————《让互联网更快的协议,QUIC在腾讯的实践及性能优化》
QUIC的特点
QUIC在UDP上实现了类似TCP + TLS + HTTP/2的功能,目的是保证可靠性的同时降低网络延迟。
QUIC 与现有 TCP + TLS + HTTP/2 方案相比,有以下几点主要特征:
- 利用缓存,显著减少连接建立时间
- 改善拥塞控制,拥塞控制从内核空间到用户空间
- 没有 Head-of-Line 阻塞的多路复用
- 前向纠错,减少重传
- 连接平滑迁移,网络状态的变更不会影响连接断线
QUIC可以实现UDP上的可靠传输,且同时复用了HTTP/2协议的多路复用(Multiplexing)功能,但由于QUIC基于UDP所以避免了HTTP/2的线头阻塞(Head-of-Line Blocking)问题(参考:当我们在谈论HTTP队头阻塞时,我们在谈论什么?)。相比于 TCP,它的流控功能在用户而不在内核,所以不受限于内核的CUBIC或BBR(拥塞算法),而是可以自由选择,甚至根据应用场景自由调整优化。
HTTP/2 over QUIC相比HTTP/2 over TLS 1.3最大的优势是首次连接是的RTT开销降低了1-RTT(25%)。在连接复用的情况,QUIC的RTT开销与TLS1.3相等。
0-RTT握手建立连接可以说是QUIC相比HTTP2最大的性能优势。其包含两层含义:①传输层0-RTT就能建立连接。②加密层0-RTT就能建立加密连接。
由于QUIC建立在UDP的基础上,同时又实现了0-RTT的安全握手,所以在大部分情况下,只需要0个RTT就能实现数据发送,在实现前向加密的基础上,并且0-RTT的成功率相比TLS的Sesison Ticket要高很多。
QUIC支持连接迁移(Connection Migration),即在客户端切换网络IP以后(例如从WiFi网络切换至4G网络),也能够保持连接不间断,在移动网络、弱网环境提供低延迟的用户体验。
QUIC的缺点也很明显,很多运营商对UDP的QoS级别是比TCP低的,甚至只允许DNS 53端口的UDP包,其它UDP包都会被封锁的。在IDC中,UDP的优先级一般也比TCP低。这在国内公共网络环境下几乎是致命的。
因此,即使以后大规模普及QUIC,也不会完全替代TCP + TLS,毕竟需要确保在QUIC不可用时,可以回落到TCP + TLS。