HTTP/3 就在这里,它对 Web 性能来说意义重大。看看它能让网站速度变多快吧!
等等,等等,HTTP/2 发生了什么?这不是几年前还挺火的吗?
确实是这样,但是出现了一些问题。为了解决这些问题,这个古老的协议的改进版本正在标准轨道上运行。
HTTP 3 正式标准化
2022年6月7日,IETF QUIC和HTTP工作组成员Robin Mars 在Twitter上宣布,历时5年,HTTP/3终于被标准化为 RFC 9114,这是HTTP超文本传输协议的第三个主要版本。
与此同时, HTTP/2 也被更新为新的 RFC 9113。
Robin写道,新发布的HTTP/3标准将与RFC 9204(QPACK header压缩) 和 RFC 9218(可扩展的优先级)一起为Web打开重要的新一页。
并且,cURL作者Danniel已经将HTTP/3 设置为缺省状态。
但是 HTTP/3 真的让事情变更快了吗?来看一下基准测试。
基准测试
先看一下基准测试结果的快速预览。
在下面的图中,同一个浏览器被用来通过同一个网络请求同一个站点,只改变正在使用的 HTTP 协议。每个站点被检索 20 次,响应时间通过性能 API 测量。
可以清楚地看到使用 HTTP 协议的每个新版本时的性能改进:
当在更大的地理距离和不太可靠的网络上请求资源时,这些变化变得更加明显。
在完全了解所有 HTTP/3 基准测试细节之前,需要一点上下文。
HTTP 简史
HTTP(超文本传输协议 1.0)的第一个正式版本于 1996 年完成。由于存在一些实际问题和部分标准需要更新,因此HTTP/1.1于一年后的 1997 年发布。根据作者的说法:
然而,HTTP/1.0 没有充分考虑分层代理、缓存、持久连接的需求和虚拟主机的影响。此外,自称为“HTTP/1.0”的未完全实现的应用程序激增,需要更改协议版本,以便两个通信应用程序确定彼此的真实能力。
新版本的 HTTP 发布等了 18 年。2015 年, RFC 7540开始大肆宣传,将 HTTP/2 标准化为该协议的下一个主要版本。
一次一个文件
如果一个网页需要 10 个 javascript 文件,浏览器需要在页面完成加载之前检索这 10 个文件。在 HTTP/1.1-land 中,Web 浏览器一次只能通过与服务器的 TCP 连接下载一个文件。这意味着文件是按顺序下载的,一个文件中的任何延迟都会阻止它后面的所有其他内容。这称为行头阻塞,对性能不利。
为了解决这个问题,浏览器可以打开到服务器的多个 TCP 连接以并行化数据检索。但这种方法是资源密集型的。每个新的 TCP 连接都需要客户端和服务器资源,当您在混合中添加 TLS 时,也会发生大量 SSL 协商。这需要一种更好的方法。
与 HTTP/2 多路复用
HTTP/2 的一大卖点是多路复用。它通过切换到允许多路复用文件下载的二进制在线格式修复了应用程序级别的线头阻塞问题。也就是说,客户端可以一次请求所有 10 个文件,并开始通过单个 TCP 连接并行下载它们。
不幸的是,HTTP/2 仍然存在线头阻塞问题,只是低了一层。TCP 本身成为链条中的薄弱环节。任何丢失数据包的数据流都必须等到该数据包被重新传输才能继续。
但是,由于 HTTP/2 多路复用的并行特性对 TCP 的丢失恢复机制不可见,因此丢失或重新排序的数据包会导致所有活动事务都经历停顿,无论该事务是否直接受到丢失数据包的影响。
事实上,在丢包率高的环境中,反而是 HTTP/1.1 性能更好,因为浏览器打开了多个并行 TCP 连接。
使用 HTTP/3 和 QUIC 实现真正的多路复用
HTTP/2 和 HTTP/3 之间的主要区别在于它们使用的传输协议。HTTP/3 使用一种称为QUIC的新协议来代替 TCP 。
QUIC 是一种通用传输协议,旨在解决 HTTP/2 与 TCP 的线头阻塞问题。它允许您通过 UDP 创建一系列有状态的流(类似于 TCP)。
QUIC 传输协议结合了流多路复用和每个流的流控制,类似于 HTTP/2 提供的成帧层。通过提供流级别的可靠性和整个连接的拥塞控制,与 TCP 映射相比,QUIC 能够有效提高 HTTP 的性能。
为什么 HTTP/3 这么快?
真正的多路复用
HTTP/3 真正的多路复用特性意味着堆栈上的任何地方都不会发生线头阻塞。当从更远的地方请求资源时,在地理上,丢包的可能性要高得多,并且 TCP 需要重新传输这些数据包。
0-RTT 改变游戏规则
此外,HTTP/3 支持O-RTT QUIC 连接,这减少了与服务器建立安全 TLS 连接所需的往返次数。
QUIC 中的 0-RTT 功能允许客户端在握手完成之前发送应用程序数据。这可以通过重用来自先前连接的协商参数来实现。为了实现这一点,0-RTT 依赖于客户端记住关键参数并向服务器提供允许服务器恢复相同信息的 TLS 会话票证。
但是不应盲目启用 0-RTT。根据你的威胁模型而定,否则可能存在安全问题。
0-RTT 数据的安全属性弱于其他类型的 TLS 数据。具体来说:
此数据不是前向机密,因为它仅在使用提供的 PSK 派生的密钥下加密。
不保证连接之间不重放。
今天可以使用 HTTP/3 吗?
目前该协议目前处于标准化状态,也已经有很多现有的实现。
NGINX 也有实验性支持,并正在努力在不久的将来发布官方 HTTP/3 版本。像 Google 和 Facebook 这样的大型科技公司已经通过 HTTP/3 为他们的流量提供服务。Google已经完全通过 HTTP/3 为现代浏览器提供服务。
对于那些在 Windows 生态系统中的人来说,据说 Windows Server 2022 将支持 HTTP/3,但需要一些步骤才能启用它。
结论
HTTP/3 可以对网站的用户体验方式产生重大影响。
一般来说,站点需要的资源越多,你会看到 HTTP/3 和 QUIC 的性能提升就越大。随着HTTP/3标准最终确定,是时候开始考虑为你的网站启用它了。