1.介绍
HTTP3是HTTP协议的最新版本。自诞生以来,HTTP就一直是交换超文本文档的首选应用层协议。多年来,为了跟上互联网的发展,增加在万维网上交换的内容的种类,HTTP已经进行了几次重大的升级,HTTP/3是目前最新的版本。
本文将介绍基本概念、技术原理、应用场景以及如何使用HTTP/3来确保您可以在有限的空间内以流行的方式理解它。
2.相关文章
理解HTTP协议从HTTP/0.9到HTTP/2的历史演变和设计思想;
网络编程中的懒人介绍(7):用简单的方式理解HTTP协议
脑残网络编程导论(3):对超文本传输协议的一些必要知识
网络编程中的懒人入门(10):泡在尿里的时候,快速阅读QUIC协议(推荐)
技术素养:新一代基于UDP的低延迟网络传输层协议——quic详细说明(推荐)
3.超文本传输协议的演变历史
当万维网诞生时,它只是一组交换超文本文档的计算机。在计算机之间交换文件是一个简单的过程,包括请求和响应。在此基础上,设计了一个简单的基于文本的协议。超文本传输协议应运而生。后来,它被起草成一个标准化的IETF协议,该协议在RFC 1945中定义,也称为HTTP/1.0。
多年来,HTTP已经从HTTP/1.0发展到HTTP/1.1,再到HTTP/2。在每次迭代中,该协议都会添加新的功能来处理大量需求,例如应用层需求、安全考虑、会话处理和媒体类型。为了深入了解HTTP/2及其演变历史,我们可以阅读从HTTP/0.9到HTTP/2的文章:了解HTTP协议的历史演变和设计思想。
尽管做了几次修改,但是HTTP的基本传输机制基本上保持不变。然而,随着移动电话驱动的互联网流量的激增,在确保网络浏览体验的流畅性方面,HTTP传输机制已经成为问题。
HTTP/3的诞生是为了解决HTTP/2.0的传输相关问题,它可以在各种设备上更快地访问网络。它基于一种新的传输层协议,称为快速UDP互联网协议,并在UDP上工作。这种选择与以前的基于TCP的HTTP版本有很大的不同。TCP是一个比UDP更可靠的协议,那么为什么要在UDP之上重新设计HTTP的传输层呢?
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_x3.jpg
让我们来看看在TCP上运行HTTP的局限性,并深入理解基于QUIC协议的HTTP/3的设计思想。
4.什么是HTTP/3
当IETF正式标准化HTTP/2时,谷歌正在独立构建一种新的传输协议,称为gQUIC。它后来成为新的互联网草案,并被命名为QUIC。gQUIC的初步实验证明,在网络条件较差的情况下,gQUIC在增强网页浏览体验方面非常有效。因此,gQUIC的发展势头越来越好,大部分IETF成员都赞成在gQUIC上建立一个新的HTTP规范。这一新举措被称为HTTP/3,以区别于目前的HTTP/2标准。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_x1.jpg
就语法和语义而言,HTTP/3类似于HTTP/2。HTTP/3遵循相同的请求和响应消息交换顺序,其数据格式包括方法、标题、状态代码和正文。然而,HTTP/3的显著差异在于UDP之上的协议层的堆叠顺序。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_1.jpg
欲了解更多关于QUIC的信息,请参考网络编程懒人介绍(10):尿尿时间、快速阅读QUIC协议和技术素养:基于UDP的新一代低延迟网络传输层协议——QUIC的详细说明。
5.HTTP/3是如何工作的?
HTTP/3功能的核心是围绕底层的QUIC协议实现的。在讨论QUIC和UDP之前,有必要列出TCP的一些局限性,这也是QUIC发展的原因。
5.1TCP可能会间歇地暂停数据传输
如果没有接收到序列号较低的数据段,即使接收到序列号较高的其他数据段,TCP的接收滑动窗口也不会继续处理。这将导致TCP流立即挂起,更糟糕的是,即使没有接收到所有网段中的一个,连接也会关闭。这个问题被称为TCP流的行首阻塞(HoL)。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_2.jpg
5.2TCP不支持流级多路复用
尽管TCP允许在应用层之间建立多个逻辑连接,但它不允许数据包在一个TCP流中被多路复用。使用HTTP/2时,浏览器只能打开一个与服务器的TCP连接,并使用同一连接来请求多个对象,如CSS、JavaScript和其他文件。在接收这些对象时,TCP会序列化同一流中的所有对象。因此,它不知道TCP段的对象级划分。
5.3TCP将产生冗余通信
TCP连接握手具有冗余的消息交换序列,即使它与已知的主机相连。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_3.jpg
基于以下设计选择,QUIC协议通过在底层传输机制中引入一些变化来解决这些问题。
1)选择UDP作为底层传输层协议:在TCP之上建立一个新的传输机制将继承TCP的所有上述缺点。因此,UDP是一个明智的选择。此外,QUIC是在用户级别上构建的,因此没有必要在每次协议升级时修改内核。
2)流复用和流控制:QUIC引入了连接上复用流复用的概念。QUIC通过设计实现了各流程的独立流量控制,解决了整个连接的线头堵塞问题。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_4.jpg
3)灵活的拥塞控制机制:TCP的拥塞控制机制是刚性的。每当协议检测到拥塞时,它会将拥塞窗口的大小减少一半。相比之下,QUIC的拥塞控制设计得更加灵活,可以更有效地利用可用的网络带宽,从而实现更高的吞吐量。
4)更好的错误处理能力:QUIC使用增强的丢失恢复机制和转发纠错功能来更好地处理错误数据包。对于那些只能通过慢速无线网络访问互联网的用户来说,这项功能是一个福音,因为这些网络用户在传输过程中经常会有很高的错误率。
5)更快的握手:QUIC使用相同的TLS模块进行安全连接。然而,与TCP不同,QUIC的握手机制经过优化,避免了每次两个已知对等体建立通信时的冗余协议交换。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_5-2.gif
通过在QUIC上构建基于HTTP/3的应用层,您可以获得增强传输机制的所有优势,同时保留HTTP/2的语法和语义。但是,您还必须注意,HTTP/2不能直接与QUIC集成,因为从应用程序到传输的底层帧映射是不兼容的。因此,IETF的HTTP工作组推荐了HTTP/3作为新的HTTP版本,并根据QUIC协议的帧格式要求修改了帧映射。
此外,HTTP/3还使用了一种新的HTTP报头压缩机制,称为QPACK,它是HTTP/2中使用的HPACK的增强。在QPACK下,在不同的QUIC流中,HTTP头可能会乱序到达。与确保数据包顺序传送的HTTP/2中的TCP不同,QUIC流是无序传送的,不同的流中可能包含不同的HTTP头。因此,QPACK使用查找表机制对报头进行编码和解码。
6.为什么HTTP/3很重要?
TCP已经有40多年的历史了。它在1981年被RFC 793标准化。多年来,它已经更新了许多次,并且是一个非常强大的传输协议,可以支持互联网流量的增长。然而,由于设计原因,传输控制协议永远不适合处理有损无线环境中的数据传输。在互联网的早期,有线网络连接了网络中的每一台计算机。
现在,随着智能手机和便携式设备的数量超过了台式机和笔记本电脑的数量,超过50%的互联网流量已经通过无线传输。这种趋势给整体的网页浏览体验带来了问题,其中最重要的是在无线覆盖不足的情况下,TCP中的线路被阻塞(对于移动网络中TCP的缺点,请阅读“5G时代已经到来,TCP/IP是旧的,它还能吃吗?”).
谷歌的初步实验证明,QUIC作为一些流行的谷歌服务的底层传输协议,大大提高了速度和用户体验。部署QUIC作为YouTube视频的底层传输协议,导致YouTube视频流的缓存率下降30%,直接影响用户的视频观看体验。在显示谷歌搜索结果时也有类似的改进。
在网络条件较差的情况下,改进非常明显,这促使谷歌更加积极地改进协议,最终向IETF提出标准化。
由于这些早期实验带来的所有改进,QUIC已经成为引领万维网走向未来的一个重要因素。在QUIC的支持下,HTTP从HTTP/2变成了HTTP/3,这是朝着这个方向迈出的合理的一步。
懒惰网络编程入门(12):快速阅读Http/3协议,一篇文章就足够了!_x4.jpg
7.HTTP/3的最佳使用案例
HTTP/3将改善我们的互联网体验,特别是在高速无线网络仍然不可用的地区。虽然HTTP/2解决了一些问题,但HTTP/3更进一步。
7.1物联网
HTTP可能不是物联网的首选协议,但在某些情况下,基于HTTP的通信非常适合特定的应用。HTTP/3可以解决手机从传感器采集数据时无线连接丢失的问题。这个问题也适用于安装在车辆或移动资产上的独立物联网设备。通过HTTP访问这些设备更可靠。
7.2大数据
世界各地的企业正在觉醒,认识到从多个部门收集数据的潜力,并将其集成到一个更大的信息共享API中,供内部和外部受众共享。这些应用编程接口还为数据货币化铺平了道路,这可以通过将这些数据作为流应用编程接口服务来实现。随着时间的推移,这些服务会吐出大量的数据。由HTTP/3托管的流API将使它们比HTTP/2更加健壮和灵活。
7.3网络虚拟现实
随着浏览器性能的提高,内容模式正在迅速变化。其中一个领域是基于网络的虚拟现实。尽管它仍处于初级阶段,但有许多用例可以使虚拟现实在加强协作方面发挥关键作用。网络在促进虚拟现实交互中起着核心作用。虚拟现实应用程序需要更多的带宽来渲染虚拟场景中的复杂细节,因此迁移到HTTP/3会受益匪浅。
8.HTTP/3的局限性
过渡到HTTP/3不仅涉及到应用层的变化,还涉及到底层传输层的变化。因此,与它的前身HTTP/2相比,采用HTTP/3更具挑战性,因为后者只需要改变应用层。传输层受到网络中大量中间层的审查。这些中间层,如防火墙、代理、网络地址转换设备等。,将进行大量的深度包检查以满足其功能要求。因此,新传输机制的引入对信息技术基础设施和运维团队有一定的影响。
然而,HTTP/3被广泛采用的另一个问题是它是基于QUIC的,并且运行在UDP上。大多数由IETF定义的网络流量和众所周知的服务都是在传输控制协议上运行的。这就是为什么长期运行HTTP/3的UDP会话会受到防火墙默认包过滤策略的影响。
随着IETF正在进行的标准化工作,这些问题最终将得到解决。此外,考虑到谷歌早期QUIC实验的积极结果,人们对HTTP/3的支持势不可挡,这最终将迫使中间层制造商进行标准化。
对于有限的物联网设备,采用HTTP/3太麻烦了。许多物联网应用部署外形非常小的设备。因此,它们的内存和CPU能力是有限的。为了使设备在电池功率、低比特率和有损连接的有限条件下高效运行,必须实施这一要求。在现有的UDP之上,HTTP/3在传输层以QUIC的形式进行处理,这增加了HTTP/3在整个协议栈中所占的空间。这使得HTTP/3很麻烦,不适合物联网设备。然而,这种情况很少见,而且有一种特殊的协议,它避免了在这种设备上直接支持HTTP的需要。此外,还有以物联网为核心的协议,如MQTT。
9.开始使用HTTP/3
IETF的HTTP工作组正致力于在2020年末发布HTTP/3。因此,它还没有得到主流网络服务器的正式支持,比如NGINX和Apache。然而,可以使用几个lib来试验这个新协议,并且还提供了非官方的补丁。
以下是支持HTTP/3和QUIC传输的库列表。请注意,这些实现基于互联网标准草案的某个版本,该版本可能会被更高版本所取代,最终标准将在征求建议书通告中发布。
1)乳蛋饼:
QUIChe为通过Quic协议发送和接收数据包提供了底层编程接口。它还支持HTTP/3模块,并通过其QUIC协议发送HTTP数据包。此外,它还为NGINX服务器提供了一个非官方的补丁,可以安装和托管一个能够运行HTTP/3的网络服务器。此外,还提供了额外的程序来支持在安卓和iOS移动应用上使用HTTP/3。
2)Aioquic:
AioQUIC是QUIC的python实现。它还内置了HTTP/3测试服务器和客户端库。Aioquic基于asyncio模块,这是Python的标准异步输入/输出框架。
3)Neqo:
Neqo是Mozilla使用Rust实现的QUIC和HTTP/3。
如果你想尝试QUIC,请查看QUIC工作组维护的QUIC协议的开源实现链接:https://github.com/quicwg/base-drafts/wiki/Implementations
哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通
IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载
IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建
新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP
关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建
联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务