超文本传输协议的第三个主版本,即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 做出贡献。