概念

HTTP/2

HTTP/3

协议

传输控制协议 (TCP) 提供了可靠性,但是存在队头阻塞的问题。

快速 UDP 互联网连接 (QUIC) 可减少延迟并避免 TCP 队头阻塞问题。

复用

支持多路复用并允许通过单个连接发送多个请求和响应。

支持并优化复用能力,流优先级划分更加灵活高效。

连接建立

TCP 三次握手建立连接,这可能会增加延迟。

QUIC 结合了加密和传输握手。

安全

鼓励使用 TLS 进行加密,但并不强制要求。

默认支持 TLS 1.3。

性能

通过标头压缩和服务器推送来提高性能。

基于 QUIC 的报头压缩,提高了速度和可靠性

错误恢复

TCP 错误恢复机制可能会比较慢。

QUIC 新颖的错误恢复功能,例如前向纠错(FEC),可最大限度地减少拥塞并控制数据包丢失的影响。

服务器推送

移动性和全球可访问性

网络之间的移动需要重新建立。

支持连接迁移。因此,网站和服务可让任何人、任何地点顺利运行。

TCP 有什么问题?

什么是 Quic

优势

  • HTTP/3 利用 QUIC 加速 HTTP 请求,QUIC 提供比 TCP 和 TLS 更高的加密和性能

  • QUIC 是一种默认加密的新传输协议,旨在加快 HTTP 传输速度以及使其更加安全

  • HTTP/3 基于 UDP,如果数据包丢失,只会中断一个流,而不会中断所有流,提高了同时获取多个对象的性能

  • 支持 0-RTT,消除服务器的 TLS 确认,使后续连接的启动速度更快

HTTP/2 多路复用 2 个请求。响应被分解为多个数据包,一旦一个数据包丢失了,两个请求都被阻止。

HTTP/3 复用 2 个请求。虽然浅色的数据包丢失了,但是深色的数据包传输得很好。

在相同丢包率的条件下,HTTP/3 和 HTTP/2 性能测试对比如下

测试环境:服务端(HTTP/3 with cubic & HTTP/2 with bbr)、客户端(cubic)

参考

谁在用

参考:https://w3techs.com/technologies/details/ce-http3

到 2021 年中,QUIC 占互联网流量的 12%。第一个也是最引人注目的 QUIC 采用者是谷歌(这并不奇怪,因为它是由谷歌员工开发的)。谷歌在其自己的生态系统中拥有服务器、应用程序、服务和客户端,因此该公司可以轻松证明一个概念并将大量应用程序迁移到新框架。30% 的 Youtube 流量已经转换到 QUIC。

Facebook 是下一个转换的网站,它已经将超过 75% 的流量迁移到 QUIC。Facebook 和 Instagram 移动应用程序都已充分利用 QUIC。

然而,QUIC 的采用目前基本已经结束。微软的流量很少使用该协议,在流媒体视频中,只有 YouTube 和 Facebook Live 支持 QUIC,但流媒体视频却占到网络流量的近 80%,而这些流量大多仍基于 TCP。Netflix 和 Amazon Prime 等巨头不使用 QUIC。然而,微软倾向于将其 VPN 产品从 TCP 转向 QUIC

国内

国外

主要采用者

尽管 QUIC 的采用还在增长,但已经有一些主要的互联网巨头开始采用该协议。以下是一些主要的QUIC采用者:

  1. Google: 作为 QUIC 的创建者,Google 是第一个采用该协议的大公司之一。在 Google 生态系统中,包括服务器、应用程序、服务和客户端,QUIC 的部署相对容易。例如,Google 将其视频平台 YouTube 的30%流量迁移到了 QUIC 上。

  1. Facebook: Facebook已将超过75%的流量迁移到QUIC。Facebook和Instagram的移动应用程序也充分利用了QUIC的性能优势。

  1. 微软: 尽管微软的采用程度相对较低,但它正在考虑将其VPN产品从TCP转向QUIC,这表明微软也在积极探索QUIC的潜力。

参考:

生态

目前支持 QUIC 的生态系统包括:

  • 浏览器:Chrome(默认);Edge、Firefox、Safari 和其他浏览器默认使用 TCP,但也可以选项 QUIC。

  • 应用程序:所有来自 Google 的移动应用程序,例如 Gmail 和 YouTube;Facebook 应用程序;Uber。

  • 服务器/CDN:Akamai、Microsoft、Apple、Google、Cloudflare、Fastly、Caddy 和 NetApp。其中一些 CDN 使用 QUIC 作为概念验证,但几乎所有流量仍使用 TCP。

  • Web 服务器:LiteSpeed、H20、Ngnix 和 Apache。

  • 负载均衡器:LiteSpeed 和 F5 BIG-IP。

  • 社区项目:基于chromium实现的 libquic,以及反向代理——作为反向代理服务器的 Docker 镜像。

  • 编程语言:Go(quic-go)、Quic.NET(C#)

框架和开源实现

C/C++

Name

Version

Roles

Handshake

Microsoft's MsQuic

draft-27/28/29/30/31/32

client, server

TLS 1.3 RFC

Facebook's mvfst

draft-29

library, client, server

TLS 1.3

Google's Chromium

Q043, Q046, Q050, T050, T051, draft-27, draft-29

library, client, server

QUIC Crypto, TLS

ats (Apache Traffic Server)

draft-29

client. server

TLS 1.3

LiteSpeed's lsquic

Draft-32, Draft-29, Draft-28, Draft-27, Q043, Q046, and Q050.

library, client, server

QUIC Crypto, RFC 8446

ngtcp2

draft-29, draft-30, draft-31, and draft-32

library, client, server

TLSv1.3 (RFC 8446)

Cloudflare's nginx-cloudflare

draft-27, draft-28, draft-29

server

TLSv1.3 (RFC8446)

picoquic

draft-32/31/30/29/28/27

library and test tools, test client, test server

TLS 1.3 (using picotls)

Pluginized QUIC

draft-29

library, client, server

TLS 1.3 (using picotls)

quant

draft-33, draft-34, v1

library, client, server

TLS 1.3

Fastly's quicly

draft-27

client, server

TLS 1.3 (final)

nginx-quic

draft-27 .. draft-32

server

TLSv1.3 (RFC8446)

Rust

Name

Version

Roles

Handshake

Cloudflare's quiche

draft-27, draft-28, draft-29

library, client, server

TLSv1.3 (RFC8446)

Mozilla/Firefox's Neqo

draft-30

library, client, server

TLS 1.3

Quinn

draft-28

library, client, server

TLS 1.3

Go

Name

Version

Roles

Handshake

quic-go

always the current draft

library, client, server

TLS 1.3 RFC

Node.js

Name

Version

Roles

Handshake

Node.js QUIC

draft-25

client, server

TLS 1.3

Python

Name

Version

Roles

Handshake

aioquic

draft-29

library, client, server

TLS 1.3

Haskell

Name

Version

Roles

Handshake

Haskell quic

draft-29

library, client, server

TLS 1.3

Java

Name

Version

Roles

Handshake

kwik

draft-29, draft-30, draft-31, draft-32

library, client

TLS 1.3

IETF进展