我们在去年Cloudflare生日的时候支持了HTTP/3,也就是HTTP/2的继承者。我们的目标一直是帮助每个人建立一个更好的互联网。在标准方面进行协作是其中很重要的一部分,我们很幸运能够做到这一点。尽管HTTP3仍处于草案状态,但我们的用户对此非常感兴趣。到目前为止,已有超过113,000个地区激活了HTTP/3,如果您使用的是实验性浏览器,则可以使用新协议。很高兴看到这么多人启用HTTP/3:通过HTTP/3访问真实网站意味着浏览器有更多可测试的属性。当我们与Google合作启用HTTP/3支持时,后者也在Chrome中启用了一项实验性HTTP/3功能。从那时起,我们看到更多浏览器添加了实验性支持:Firefox在其夜间构建中支持它,其他基于Chromium的浏览器(如Opera和MicrosoftEdge)以及Safari。我们将密切关注它的发展,并在力所能及的范围内帮助我们的合作伙伴;许多网站都支持和启用HTTP/3,这也为浏览器实施者提供了一个极好的测试平台。现状如何?IETF标准化过程将协议开发为一系列文档的草稿版本,其最终目标是生成RFC。QUIC工作组的成员在分析、实现和互操作性规范方面进行协作,以发现不适当的功能。当我们开始时,我们支持HTTP/3草案23,并且一直跟上每个新草案,直到撰写本文时的草案27。对于每个草案,该小组都提高了QUIC定义的质量,并更接近于对其行为方式的“粗略共识”。为了避免永久性的分析瘫痪和无休止的调整,每个新草案都提高了对规范提出修改建议的门槛。这意味着版本之间的变化更少,我们在生产中运行的协议与最终RFC之间的差异也更少。好处HTTP/3的主要好处是提高了性能,尤其是在同时获取多个对象时。使用HTTP/2,TCP连接中的任何中断(数据包丢失)都会阻塞所有流(队头阻塞)。因为HTTP/3是基于UDP的,所以如果丢包,只会中断一个流,而不是所有流。此外,HTTP/3提供了0-RTT支持,这意味着通过在建立连接时消除服务器的TLS确认,可以更快地启动后续连接。这也意味着客户端可以在完成TLS协商之前请求数据,这意味着网站将提前加载。下面说明丢包及其影响:HTTP/2复用两个请求。请求通过HTTP/2从客户端发送到服务器,请求两种资源(我们将请求及其关联的响应标记为绿色和黄色)。响应被分成数据包,一旦数据包丢失,两个请求都会被阻止。上图显示了HTTP/3多路复用2个请求。虽然黄色数据包丢失了,但绿色数据包传输得很好。会话启动的改进意味着与服务器的“连接”启动得更快,因此浏览器可以更快地开始查看数据。我们很想知道改进有多大,所以我们进行了一些测试。为了衡量0-RTT带来的改进,我们运行了一些基准测试来衡量首字节时间(TTFB)。平均而言,对于HTTP/3,我们看到第一个字节出现在176毫秒之后。使用HTTP/2,对应的时间是201ms,对于HTTP/3来说意味着性能提升了12.4%!有趣的是,该协议的每个方面都不受草案或RFC的约束。实现的选择会影响性能,例如高效的数据包传输和拥塞控制算法的选择。拥塞控制是计算机和服务器用来适应过载网络的一种技术:通过丢弃数据包,限制后续传输。由于QUIC是一种新协议,因此获得正确的拥塞控制需要进行试验和调整。“丢失检测和拥塞控制”规范建议使用Reno算法,但允许选择任何算法。我们的实现从NewReno算法开始,我们通过经验知道可以通过其他方式获得更好的性能。我们最近迁移到CUBIC算法,在我们的网络中,CUBIC的传输和丢包率与NewReno相比有所改善。对于我们现有的HTTP/2堆栈,我们目前支持BBRv1(TCP)。这意味着在我们的测试中,我们无法进行精确比较,因为这些拥塞控制算法在较小和较大的内容传输之间表现不同。也就是说,与HTTP/2相比,我们已经看到使用HTTP/3传输较小内容的速度更快。对于更大内容的传输,改进后的HTTP/2堆栈拥塞控制在性能上大放异彩。对于15KB的小型测试网页,HTTP/3平均加载时间为443毫秒,而HTTP/2为458毫秒。然而,一旦我们将页面大小增加到1MB,优势就消失了:HTTP/3仅比当今Web上的HTTP/2慢一点,HTTP/3的加载时间为2.33秒,而HTTP/2的加载时间为2.30秒。基准测试很有趣,但我们想知道HTTP/3在现实世界中的表现如何。为了测量,我们希望有一个像浏览器一样加载网站的第三方。WebPageTest是一个使用瀑布图来衡量页面加载时间的通用框架。为了分析后端,我们使用BrowserInsights来捕获边缘节点记录的时间。然后我们将这两个数据结合起来。作为测试用例,我们决定在公司博客上执行性能监控。我们在全局配置了WebPageTest实例以通过HTTP/2和HTTP/3加载页面。我们还启用了HTTP/3和BrowserInsight。因此,当我们的测试脚本使用支持HTTP/3的浏览器启动网页时,每当网页加载时,浏览器分析就会报告数据。清理数据并重复测试HTTP/2以进行比较。下图显示了真实页面(blog.cloudflare.com)的页面加载时间,用于比较HTTP/3和HTTP/2性能。此外,我们从不同的地理位置进行了性能评估。如图所示,北美的HTTP/3性能仍然落后于HTTP/2性能平均约1-4%,欧洲、亚洲和南美也有类似的结论。我们怀疑这可能是由于不同的拥塞算法造成的:BBRv1上的HTTP/2与CUBIC上的HTTP/3不同。将来,我们将努力在两者上支持相同的拥塞算法,以便进行更准确的性能比较。结论总的来说,我们很高兴推进这个标准。我们的实现运行良好,在某些情况下提供更好的性能,并且在最坏的情况下接近HTTP/2性能。随着标准的最终确定,我们希望看到浏览器在主流版本中添加对HTTP/3的支持。就我们而言,我们将继续支持最新草案,同时寻找更多方法使HTTP/3实现更好的性能,无论是拥塞调整、优先级排序,还是系统容量(CPU和原始网络吞吐量)。如果您想尝试一下,只需在我们的仪表板上启用HTTP/3并使用支持该功能的浏览器即可。有关如何启用HTTP/3的说明,请参阅我们的开发人员文档。原文地址:https://blog.cloudflare.com/http-3-vs-http-2/
