HTTP(Hypertext Transfer Protocol)超文本传输协议是万维网中应用最广泛的应用层传输协议。HTTP起源于80年代末,最初构想是一个基于单行文本的的协议,第一个协议版本是HTTP/0.9,其第一个全功能迭代(1.0版)于1996年被记录在RFC 1945中。
随着互联网的使用和期望的增长,HTTP协议也需要改进。1.1版于1997年被记录在RFC 2068和1999年的RFC 2616中,随后的RFC(7230-7235)于2014年被记录下来——整整十年半之后!——记录消息语法/路由;语义/内容;条件和范围请求;缓存;和身份验证。
HTTP/2基于Google的SPDY项目,是该协议的第一次重大修改,于2015年在RFC 7540中标准化,同年RFC 7541引入了报头压缩(HPACK)。
HTTP/2推出仅四年后,一个基于谷歌实验性QUIC协议的新标准开始出现:HTTP/3。其目的:提高用户与网站和API交互的速度和安全性。HTTP/3于2022年6月份正式发布第一个官宣版本RFC 9114,这意味着HTTP/3已经标准化了,ASP.NET Core 7.0 已经支持HTTP/3 且 ASP.NET Core 8.0 Preview 1中已经默认启用HTTP/3了!
HTTP/3已经标准化了,那么有人会问HTTP/3是不是会替换HTTP/2?本文描述并比较了协议的两个版本,并给出了各自在何处找到合适应用程序的一些建议。
HTTP protocol stack transition and comparison
Comparo of HTTP protocol stack changes from HTTP/1.1 to HTTP/3
HTTP/2的创建目的是为了解决HTTP/1.1的非结构化发展所带来的许多问题,其中大部分与性能有关。
HTTP/1.1的问题
这些问题很多都是协议本身的限制造成的,归结为响应时间随着流量的增加而增加。
2009 年,Google 宣布了SPDY,一种实验性协议,作为解决 HTTP/1.x 问题的结构化方法。HTTP 工作组注意到 Google 在使用 SPDY 实现更高的性能目标方面取得的成功。2012 年 11 月,以 SPDY 规范为起点,发起了 HTTP/2 提案征集活动RFC 7540
多年来,HTTP 一直在不断发展,从 5 年的 0.9 版,一年的 1.0 版,到大约 15 年的 1.1 版,最终在 2014 年到达第 2 版。在每次迭代中,都会添加新功能满足多种需求的协议,例如应用层要求、安全考虑、会话处理和媒体类型
在这个演变过程中,HTTP 的底层传输机制大体上保持不变。然而,随着公众大量采用移动设备技术,互联网流量呈爆炸式增长,新开箱的 HTTP/2 一直难以提供流畅、透明的 Web 浏览体验。它承受着现代互联网流量的数量和速度,尤其是在实时应用程序及其用户不断增长的需求下。这导致在使用此版本的协议时出现许多警告,暴露出明显的改进机会。
Lucidchart 在其负载均衡器(LB)上启用 HTTP/2 后遇到了意想不到的问题
如果不小心使用,HTTP/2 推送功能弊大于利。例如,回访者可能有文件的缓存副本,在这种情况下,服务器不应推送资源。使推送缓存感知可以解决这个问题,但这有其自身的注意事项并且很快就会变得复杂。
HTTP/2 解决了 HTTP 级别的线头阻塞问题,它允许资源被多路发送,同时通过同一连接分解成块。然而,当数据包丢失并且必须以正确的顺序重新发送时,TCP 级别 的线头阻塞仍然会发生。
HTTP/3 的目标是通过解决 HTTP/2 的传输相关问题,在所有形式的设备上提供快速、可靠和安全的 Web 连接。为此,HTTP/3基于谷歌开发的QUIC协议。
HTTP/2 和 HTTP/3 之间的根本区别在于 HTTP/3 运行在 QUIC 上,而 QUIC 运行在无连接的 UDP 上而不是面向连接的 TCP(所有以前版本的 HTTP 都使用)。
Comparison of connection-oriented TCP vs. connectionless UDP, as used in QUIC
在语法和语义结构方面,HTTP/3 与 HTTP/2 类似。HTTP/3 参与相同类型的请求/响应消息交换,其数据格式包含方法、标头、状态代码和正文。但是,HTTP/3 引入的显着差异在于 UDP 之上协议层的堆叠顺序,如下图所示。
Stacking order in HTTP/3 showing QUIC encompassing the security layer and part of the transport layer
下表比较了 HTTP/2 和 HTTP/3 的特性和功能:
Comparison table of features and capabilities of HTTP/2 and HTTP/3 Part 1/2
Comparison table of features and capabilities of HTTP/2 and HTTP/3 Part 2/2
HTTP/2 是 HTTP/1.1 的扩展,而不是它的替代品。应用程序语义保持不变,具有相同的 HTTP 方法、状态代码、URI 和标头字段。
每个 HTTP/2 连接都以 HTTP/1.1 开始,如果客户端支持 HTTP/2,则连接会升级。HTTP/2 在客户端和服务器之间使用单个 TCP 连接,该连接在交互期间保持打开状态。
Requests and responses between a client and a server over TCP, the transport protocol underlying HTTP/2
HTTP/2 引入了许多旨在提高性能的功能:
HTTP/2 支持 HTTP/1.x 的所有用例,无论它是在浏览器中实现的,包括桌面 Web 浏览器、移动 Web 浏览器、Web API 和 Web 服务器。但是,它也可以用于代理服务器、反向代理服务器、防火墙和内容分发网络,以及以下情况:
HTTP/3 支持快速、可靠和安全的连接。默认情况下,它使用 Google 的 QUIC 协议对 Internet 传输进行加密。
ASP.NET Core 2.2,开始对 HTTP/2 的支持
ASP.NET Core 3.0,默认启用HTTP/2
ASP.NET Core 5.0,性能改进
ASP.NET Core 6.0,包含对HTTP/3支持的实验功能
ASP.NET Core 7.0,HTTP/3完全受ASP.NET Core支持,不再是实验性的。
ASP.NET Core 7.0,HTTP/2性能改进
ASP.NET Core 8.0-preview 1,默认启用HTTP/3,HTTP/2 在MacOS受支持
Name
Client
Server
Programming language
Company
Repository
lsquic
Yes
Yes
C
https://github.com/litespeedtech/lsquic
nghttp3
Yes
Yes
C
https://github.com/ngtcp2/nghttp3
No
Yes
C
Yes
No
C
Yes
Yes
C
https://github.com/microsoft/msquic
proxygen
Yes
Yes
C++
https://github.com/facebook/proxygen#quic-and-http3
Cronet
Yes
Yes
C++
https://github.com/chromium/chromium/tree/main/net/quic
Yes
Yes
C# (using MsQuic)[33]
quic-go
Yes
Yes
Go
https://github.com/quic-go/quic-go
http3
Yes
Yes
Haskell
https://github.com/kazu-yamamoto/http3
Kwik
Yes
Yes
Java
Flupke
Yes
Yes
Java
https://bitbucket.org/pjtr/flupke
aioquic
Yes
Yes
Python
https://github.com/aiortc/aioquic
quiche
Yes
Yes
Rust
https://github.com/cloudflare/quiche
neqo
Yes
Yes
Rust
https://github.com/mozilla/neqo
quinn
Yes
Yes
Rust
https://github.com/quinn-rs/quinn
s2n-quic
Yes
Yes
Rust
https://github.com/aws/s2n-quic
主流浏览器Chrome Edge Safari对HTTP/2支持良好,但是对于HTTP/3Safari明显落后。
像Google,Facebook这些互联网巨头也都在使用HTTP/3,并且HTTP/3流量占比高。
来自万维网技术调查网站的一份调查显示,25.2%的受调查的网站(数百万的样本数规模)使用HTTP/3。
HTTP/2 要求TLS1.2+,而HTTP/3要求TLS1.3,这对于大多数落后的系统而言升级HTTPS,并且要求支持较高版本的TLS版本很难,因为无法合适的协商加密套件 TLS1.3在Windows 7是没办法支持的,而要支持TLS1.2也需要开放更多已经被证明存在安全漏洞的加密套件。总言之,兼容性和安全性之间的矛盾让实施HTTP/2/3带来了巨大的挑战。参考阅读
HTTP/3 提供了大量的性能和安全改进,这是互联网下一阶段发展所需要的。尽管如此,尽管事实上存在对 HTTP/2 增强的明显需求,但对于 HTTP/3 是否会最终成为 HTTP/2 网络状态的全面改进尚无定论。
此外,使用 QUIC_协议和_ UDP(而不是 TCP_)迁移到 HTTP/3 在具有可靠_互联网连接的用例中留下了一些 QoS 问题。这增加了使用新兴协议所固有的不确定性。
HTTP/3 是Web 协议的一项激动人心的新发展,它将成为许多当前或未来用例的合适解决方案。但它旨在改进的标准还有很多生命,而且 HTTP/2 不会很快消失。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章