超文本传输协议的第三个主版本,即HTTP/3,上个月被正式采纳为IETF 标准(互联网工程任务组)。
HTTP/3 是超文本传输协议 (HTTP) 的第三个版本,以前称为 HTTP-over-QUIC。 QUIC 最初由 Google 开发,是 HTTP/2 的继承者。Google 和 Facebook 等已经使用 QUIC 来加速网络。
HTTP 简史
对于游戏开发者来说,重要的协议是UDP(用户数据报协议)。UDP是快速、即发即弃的标准:你在网络上扔了一个数据包,它就被抓住或者有时被丢掉了。
像Web这样要求稳定的系统,正确使用的底层协议是TCP(传输控制协议)。这是一个更正式的系统,它保证了数据包的交付与正确顺序。TCP 创建了可靠连接,后来又创建了可靠的信息流。
随后,它们被正式命名为“TCP/IP 堆栈”。
后来,基于 TCP/IP 编写的WWW和 HTTP 成为互联网的主要用途。另一个缺失的首字母缩略词是TLS(传输层安全),它提供了加密相关元素,并成为事实上的安全标准。
而在那个年代里, PC 之间的连接通常是有线的,任何损失都是由于旧铜线上的噪音造成的。
TCP 协议非常适合收集偶尔出错的数据包,而随着Web的发展使用 UDP 协议逐渐减少。
进入QUIC
今天的互联网已经进入一个发展非常不同的场景了。
比如现在家中的 PC 都有良好的光纤连接和线路,大多数用户通过手机或笔记本电脑体验互联网。
举个例子,当你从一根桅杆移动到另一根桅杆时,遇到阻挡或反弹信号的墙后,网络连接通常会被切断并重新启动。这种情况并不是 TCP 所喜欢的——如果没有正式的介绍和良好的握手,它就不想进行通信。事实上,TCP 对最后一个散数据包的严格记账和等待,意味着用户必须等待网页加载和新应用程序下载,或者超时时再重新建立连接。
为了利用好 UDP 的非连接正式性,并让网络在运行中使用一些智能的东西,新的QUIC(快速 UDP 互联网连接)格式得到了更多人们的关注。
虽然人们不希望在网络本身中看到太多智能属性,但如今我们对自动决策感到更加自在。QUIC 协议会知道一个网站是由多个文件组成的,它不会因为一个文件没有完成加载而破坏整个连接。
QUIC 发展的另一个趋势是内置安全性。而之前加密是可选的(使用 HTTP 或 HTTPS)而 QUIC 协议将始终是加密的。
经过几年的进化,每个站点都已经加密——尽管开销很大。这不仅仅是为了确保中间人看不到你点的是什么类型的橙汁,它还确认你是在与真正的橙汁供应商交谈。
协议格式几乎总是在改进,但它们真正做的是随着时间的推移解决不同的问题。
主动使用
那么HTTP/3的实施进展如何?这里我们实际上要考虑的有三个方面:浏览器、云基础设施和用户程序。
第一个考虑的是浏览器。
这是来自“我可以使用”网站上可以支持HTTP/3的表格:
很明显,谷歌很热衷此协议——从Chrome v87(2020 年末)开始的版本就已经能够使用 HTTP/3 协议。而苹果最近在浏览器开发方面有点保守,Safari 是落后的。
你现在可以使用以下网站中的任何一个,来检查自己的浏览器是否支持 HTTP/3(可能需要重新启动):
cloudflare-quic.com
quic.nginx.org
https://http3.is/
如何测试现有的网站是否支持呢?要测试现有站点,请尝试如下网址:
https://geekflare.com/tools/http3-test。
一个好消息是,如果你的网站在 HTTP/2 下运行良好,那么它在 HTTP/3 下会更好或更好。
谁在推广 HTTP/3?
现在,谁在推动 HTTP/3?好吧,你已经知道了;它是Google,还有众多 CDN 厂商。
他们的面包和黄油是网络响应速度。因此实现 HTTP/3 的最简单方法是通过 CDN,这也是一项让移动用户受益更多的变化。
现在也存在使用 QUIC 构建的Web服务器(例如Litespeed),但采用率参差不齐。
许多Web服务器依赖于第三方库,因此在这种情况下重用现有的、经过验证的工作的模式会中断。现有的服务器,如 Node.js、NGINX 和 Apache,在开始实施新的内部结构时,就会失去用户体验优势。新的QUIC库相对未经证实,而使用 Web 服务器的关键在于它是可靠的、经过良好测试和维护的。
采用 HTTP/3的编程语言
在正常情况下,我会深入研究一些代码——虽然我觉得现阶段这样做有点为时过早。有很多项目可能都在变化,因此要深入研究。
语言 | 实现库 |
---|---|
Python | aioquic |
Go | quic-go |
Rust | quiche (Cloudflare), Quinn, Neqo (Mozilla), s2n-quic (AWS) |
C and C++ | mvfst (Facebook), MsQuic, (Microsoft), LSQUIC (Litespeed), picoquic, quicly (Fastly) |
Ruby | :-( |
可以浏览一些简单的最小工作示例(例如,一个简单的服务器和客户端),我们可以识别出几个级别的任务。
第一点,连接。这个更高级别的通道最初是在两个端点之间建立的,先建立连接标识符。一旦建立,如果下面的协议发生变化(例如,电话切换 Wi-Fi),连接将保持不变,以避免重新开始会话协商。
然后连接打开携带自己的数据类型,并且是不会相互干扰的字符流。
下面仍然是数据包。每个数据包,就像一封地址良好的信件,都有它的连接和加密信息。信封里面是框架,这些代表正在传输的实际数据。
正如之前所说,进步实际上只是反映了不断变化的使用模式。
今天如此重视安全性和速度,因为我们不再将网络视为不可靠的魔法——因此可以使用它来管理我们的个人事务。
HTTP/3 将更有助于解决以上这些问题,而HTTP/3房间里的大象可能是 Web3 和新兴的元宇宙世界,也许这些领域的新想法将在未来为 HTTP/4 做出贡献。