HTTP/1、HTTP/2 和 HTTP/3
你每天都在使用它,你现在就在使用它。但是你真的了解 HTTP 协议的工作原理吗?你知道 HTTP 1、2 和 3 之间的区别吗?
让我们看看这三种协议,并解释它们的优点和缺点、区别以及 HTTP/3 如何开始变得更加流行。
在开始之前,请务必阅读我们关于HTTP/1.1、HTTP/2 和 HTTP/3 之间差异的文章。它涵盖了相同的总体主题,但如果您感兴趣的话,它会更详细地介绍协议版本的一些具体特性。
什么是 HTTP?
HTTP(超文本传输协议)是万维网上数据通信的方式(不要与互联网混淆,两者有区别)。HTTP 有三个主要版本,我们将在这里逐一介绍。
简单来说,该协议定义了浏览器如何与服务器通信并来回传递数据。在所有版本的协议中,浏览器都会发出请求(“请求”),服务器则会返回数据(“响应”)。这是一个简单的概念,但随着时间的推移,事情变得越来越复杂,作为 Web 开发者,了解协议后续版本的差异至关重要。
HTTP/1.x
HTTP/1.0 的第一个版本大约发布于 1996 年。HTTP/1.1 于 1999 年发布,并迅速被采用。
HTTP/1.1 的概念非常简单。我们先来看一下请求是如何工作的:
- 你导航到一个网站,比如本例中的accreditly.io(为了厚颜无耻地宣传一下)。你的浏览器
GET
向服务器发送了一个请求:
GET accreditly.io
- 服务器接收请求和带有文档的响应:
200 OK
<html>
<head>
<title>Accreditly - Web Development Certifications</title>
[...]
- 该文档中可能包含各种资源,例如图片、样式表(CSS 文件)和 JavaScript 资源(.js 文件)。浏览器会读取该文档,并对队列中的每个资源重复步骤 1 和 2。
这是一个简单的流程,很容易理解,但这里存在一些问题:
a. 队头阻塞:每个 HTTP/1.x 连接每次只能处理一个请求。这种限制通常会导致网络资源利用效率低下,因为后续请求必须等待前一个请求完成。
b. 缺乏优先级:HTTP/1.x 没有提供对请求进行优先级排序的方法,这可能导致不太重要的资源阻塞更重要的资源。
c. 还有其他问题,例如发送的纯文本标头很大,尤其是在使用 cookie 时。
所有这些问题都会对性能产生很大的影响,尤其是在现代网络上。
HTTP/2
HTTP/2 于 2015 年发布。HTTP/2 的目标是解决上述问题。在 HTTP/1.1 称王的 16 年里,网络发生了变化,人们的移动设备使用的是不太稳定的 4G 连接,与 90 年代相比,固定电话连接的吞吐能力有了巨大的提升(拨号上网,还有人用吗?),但与过去相比,网站的规模也变得庞大了。
(图片由HTTP Archive提供)
与过去相比,如今网页的平均大小变得非常庞大。此外,网页加载资源的速度也远超网络连接速度的提升。根据 HTTP Archive 的数据,网页上图片的平均大小增长了 8000% 以上,图片数量也随之增长,这还不包括 JavaScript 和其他资源。这是一个大问题。
那么 HTTP/2 有何帮助?
HTTP/2 中引入了许多功能,其中最主要的好处是人们关注的多路复用。
多路复用
看看上面 HTTP/1.1 中的例子,你的浏览器请求一个包含多个资源的文档。在 HTTP/1.1 中,这些资源请求会被排队,一次只请求一个。
在 HTTP/2 中,情况略有不同。使用多路复用,浏览器可以有效地同时请求资源,然后以相同的方式在同一个连接上接收它们。
请看下图:
其他福利
除了多路复用之外,HTTP/2 还实现了一些其他功能,重点关注性能:
- 标头压缩:HTTP/2 使用 HPACK 算法压缩请求和响应标头,显著减少传输的数据量。
- 服务器推送:通过 HTTP/2,服务器可以在请求资源之前主动将其推送到客户端的缓存中,从而减少延迟并改善整体用户体验。
- 流优先级:HTTP/2 使客户端能够对请求进行优先排序,从而允许首先获取和呈现更关键的资源。
- 二进制框架:HTTP/2 使用二进制框架层来封装消息,与 HTTP/1.x 的纯文本方法相比,这使得协议更高效、更不容易出错。
HTTP/2 依赖于相同的底层协议:TCP。这既有好处,也有坏处。由于 HTTP/1.x 已经使用了 TCP,这意味着采用起来更容易;浏览器无需实现新的底层协议,服务器只需进行一些调整即可继续运行,从而实现 HTTP/2 的功能。缺点是 TCP 存在一些问题,尤其是在高延迟和高丢包的网络中。
HTTP/3 简介
HTTP/3 取消了 TCP,而是利用了一种称为快速 UDP 互联网连接或“QUIC”的 UDP 形式(看看他们在那里做了什么?)。
QUIC 有几个好处:
- 内置加密:QUIC 默认集成传输层安全性 (TLS) 1.3,无需单独的 TLS 握手即可确保安全连接。这降低了延迟并缩短了连接建立时间。
- 减少队头阻塞:与 TCP 不同,QUIC 在单个流级别处理数据包丢失。这意味着单个数据包的丢失不会阻塞整个连接,从而进一步减少队头阻塞问题。
- 连接迁移:QUIC 旨在更好地支持连接迁移,允许客户端在不丢失连接或造成额外延迟的情况下更改 IP 地址。使用移动/蜂窝网络连接的用户尤其会从中受益。
- 0-RTT 连接建立:QUIC 在某些情况下支持 0-RTT(零往返时间)连接建立,这可以显著减少连接到以前访问过的服务器时的延迟。
- 改进的拥塞控制:QUIC 提供更先进的拥塞控制机制,使其能够更好地适应不同的网络条件并提高整体性能。
HTTP/3 和 QUIC 听起来很棒,对吧?
嗯,理论上是的。问题在于,浏览器和提供商实现这些功能的任务非常艰巨,更不用说与网络基础设施的兼容性问题了。
许多大型网络根本不支持 UDP,因此在 UDP 之上的新协议上传输流量可能还不太现实。
话虽如此,像Cloudflare这样的巨头正在大力推进为客户提供 HTTP/3 支持,Chrome、Edge 和 Firefox 等浏览器也已支持 HTTP/3。您可能会注意到 Safari 不在其中;苹果通常迟迟不提供对新功能和协议的支持,并且经常会实现自己的版本。根据CanIUse的说法,Safari 对 HTTP/3 的支持是部分性的,并且仅适用于部分用户。不过请记住,HTTP/3 尚未正式发布,因此情况可能会发生变化。
文章来源:https://dev.to/accreditly/http1-vs-http2-vs-http3-2k1c