网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!

本文中文译文由做者“ably.io”发布于公众号“高可用架构”,译文原题:《深刻解读HTTP3的原理及应用》、英文原题:《HTTP/3 deep dive》(文末有译文和原文连接),即时通信网收录时有少量改动,感谢原做者和译者的分享。html

一、引言

HTTP3是HTTP协议的最新版本。从诞生之初,HTTP就是交换超文本文档的首选应用层协议。多年来,为了跟上互联网的发展,以及WWW上交换的内容种类增长,HTTP进行了几回重大升级,而HTTP/3就是目前的最新版本。python

本文将从HTTP/3的基本概念、技术原理、应用场景和如何使用它等方面进行介绍,确保在有限的篇幅内,能让你通俗地理解它。git


 

本文是系列文章中的第12篇,本系列文章的大纲以下:github

网络编程懒人入门(一):快速理解网络通讯协议(上篇)web

网络编程懒人入门(二):快速理解网络通讯协议(下篇)编程

网络编程懒人入门(三):快速理解TCP协议一篇就够浏览器

网络编程懒人入门(四):快速理解TCP和UDP的差别安全

网络编程懒人入门(五):快速理解为何说UDP有时比TCP更有优点服务器

网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门网络

网络编程懒人入门(七):深刻浅出,全面理解HTTP协议

网络编程懒人入门(八):手把手教你写基于TCP的Socket长链接

网络编程懒人入门(九):通俗讲解,有了IP地址,为什么还要用MAC地址?

网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议

网络编程懒人入门(十一):一文读懂什么是IPv6

网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!》(本文)

学习交流:

- 即时通信/推送技术开发交流5群:215477170 [推荐]

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

欢迎关注“即时通信技术圈”,更多好文会同步发布在公众号:

(本文同步发布于:http://www.52im.net/thread-3020-1-1.html

二、相关文章

从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

网络编程懒人入门(七):深刻浅出,全面理解HTTP协议

脑残式网络编程入门(三):HTTP协议必知必会的一些知识

网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议》(推荐)

技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》(推荐)

三、HTTP协议的演进史

在万维网诞生之时,万维网仅仅是一群交换超文本文件的计算机。在计算机之间交换文件是一个简单的程序,包括请求和响应。在此基础上设计了一个简单的基于文本的协议。HTTP(超文本传输协议)应运而生。后来,它被起草成了一个标准化的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的传输相关问题而生的,能够在各类设备上更快地访问Web。它基于一个新的传输层协议,称为QUIC(Quick UDP Internet Protocol),在UDP之上工做。这一选择与以前版本的HTTP大相径庭,以前版本都是基于TCP。TCP是一个比UDP更可靠的协议,那么为何要在UDP之上从新设计HTTP的传输层呢?


 

让咱们来看看在TCP上运行HTTP的局限性,并深刻了解一下基于QUIC协议的HTTP/3的设计思想。

四、什么是HTTP/3

当IETF正式标准化HTTP/2时,Google正在独立构建一个新的传输协议,名为gQUIC。它后来成为新互联网草案,并被命名为QUIC。gQUIC最初的实验证实,在网络条件较差的状况下,gQUIC在加强网页浏览体验方面的效果很是好。所以,gQUIC的发展势头愈来愈好,IETF的大多数成员同意创建一个在QUIC上运行的HTTP新规范。这个新的倡议被称为HTTP/3,以区别于当前的HTTP/2标准。


 

从语法和语义上看,HTTP/3与HTTP/2类似。HTTP/3遵循相同的请求和响应消息交换顺序,其数据格式包含方法、标题、状态码和body。然而,HTTP/3的显著的误差在于协议层在UDP之上的堆叠顺序。


 

有关QUIC的更多资料,能够看看《网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议》、《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》。

五、HTTP/3 是如何工做的?

HTTP/3功能的核心是围绕着底层的QUIC协议来实现的。在讨论QUIC和UDP以前,咱们有必要先列出TCP的某些限制,这也是致使QUIC发展的缘由。

5.1 TCP可能会间歇性地挂起数据传输

若是一个序列号较低的数据段尚未接收到,即便其余序列号较高的段已经接收到,TCP的接收机滑动窗口也不会继续处理。这将致使TCP流瞬间挂起,在更糟糕的状况下,即便全部的段中有一个没有收到,也会致使关闭链接。这个问题被称为TCP流的行头阻塞(HoL)。


 

5.2 TCP不支持流级复用

虽然TCP确实容许在应用层之间创建多个逻辑链接,但它不容许在一个TCP流中复用数据包。使用HTTP/2时,浏览器只能与服务器打开一个TCP链接,并使用同一个链接来请求多个对象,如CSS、JavaScript等文件。在接收这些对象的同时,TCP会将全部对象序列化在同一个流中。所以,它不知道TCP段的对象级分区。

5.3 TCP会产生冗余通讯

TCP链接握手会有冗余的消息交换序列,即便是与已知主机创建的链接也是如此。


 

QUIC协议在如下设计选择的基础上,经过引入一些底层传输机制的改变,解决了这些问题。

1)选择UDP做为底层传输层协议:在TCP之上创建新的传输机制,将继承TCP的上述全部缺点。所以,UDP是一个明智的选择。此外,QUIC是在用户层构建的,因此不须要每次协议升级时进行内核修改。

2)流复用和流控:QUIC引入了链接上的多路流复用的概念。QUIC经过设计实现了单独的、针对每一个流的流控,解决了整个链接的行头阻塞问题。


 

3)灵活的拥塞控制机制:TCP的拥塞控制机制是刚性的。该协议每次检测到拥塞时,都会将拥塞窗口大小减小一半。相比之下,QUIC的拥塞控制设计得更加灵活,能够更有效地利用可用的网络带宽,从而得到更好的吞吐量。

4)更好的错误处理能力:QUIC使用加强的丢失恢复机制和转发纠错功能,以更好地处理错误数据包。该功能对于那些只能经过缓慢的无线网络访问互联网的用户来讲是一个福音,由于这些网络用户在传输过程当中常常出现高错误率。

5)更快的握手:QUIC使用相同的TLS模块进行安全链接。然而,与TCP不一样的是,QUIC的握手机制通过优化,避免了每次两个已知的对等者之间创建通讯时的冗余协议交换。


 

经过在QUIC之上构建基于HTTP/3的应用层,您能够得到加强型传输机制的全部优点,同时保留HTTP/2的语法和语义。可是,你也必须注意到,HTTP/2不能直接与QUIC集成,由于从应用到传输的底层帧映射是不兼容的。所以,IETF的HTTP工做组建议将HTTP/3做为新的HTTP版本,并根据QUIC协议的帧格式要求修改了帧映射。

除此以外,HTTP/3还使用了一种新的HTTP头压缩机制,称为QPACK,是对HTTP/2中使用的HPACK的加强。在QPACK下,HTTP头能够在不一样的QUIC流中不按顺序到达。与HTTP/2中的TCP确保数据包的按顺序传递不一样,QUIC流是不按顺序传递的,在不一样的流中可能包含不一样的HTTP头。所以,QPACK使用查找表机制对报头进行编码和解码。

六、为何HTTP/3很重要?

TCP已经有40多年的历史了。它在1981年经过RFC 793从而标准化。多年来,它经历了屡次更新,是一个很是强大的传输协议,能够支持互联网流量的增加。然而,因为设计上的缘由,TCP历来就不适合处理有损无线环境中的数据传输。在互联网的早期,有线网络将网络中的每一台计算机链接起来。

如今,随着智能手机和便携式设备的数量超过台式机和笔记本电脑的数量,超过50%的互联网流量已经经过无线传输。这种趋势给总体的网络浏览体验带来了问题,其中最重要的是在无线覆盖率不足的状况下,TCP中的行头阻塞(关于TCP在移动网络下的不足,请阅读《5G时代已经到来,TCP/IP老矣,尚能饭否?》)。

Google的一些初步实验证实,QUIC做为Google部分热门服务的底层传输协议,极大地提升了速度和用户体验。部署QUIC做为YouTube视频的底层传输协议,致使YouTube视频流的缓冲率降低了30%,这直接影响了用户的视频观看体验。在显示谷歌搜索结果时,也有相似的改善。

网络条件较差的状况下提高很是明显,这促使谷歌更加积极地完善该协议,并最终向IETF提出标准化。

因为这些早期的试验所带来的全部改进,QUIC已经成为带领万维网走向将来的重要因素。在QUIC的支持下,HTTP从HTTP/2到HTTP/3的改头换面,朝着这个方向合理地迈出了一步。


 

七、HTTP/3的最佳用例

HTTP/3将改善咱们上网的体验,特别是在仍没法使用高速无线网络的地区。尽管HTTP/2已经解决了一部分问题,然而HTTP/3更进一步。

7.1 物联网(IoT)

HTTP可能不是物联网的首选协议,但在某些状况下,基于HTTP的通讯很是适合特定的应用。HTTP/3能够解决从传感器收集数据的移动电话的无线链接损耗问题。这个问题一样适用于安装在车辆或可移动资产上的独立IoT设备。经过HTTP来访问这些设备,能够更加可靠。

7.2 大数据

全球各地的企业都在觉醒,意识到从多个部门收集数据的潜力,并将其整合成更大的信息共享API,供内部和外部受众共享。这些API也为数据的货币化铺平了道路,经过托管这些数据做为流API服务能够实现数据的货币化。随着时间的推移,这些服务会吐出海量的数据。经过HTTP/3托管的流API将使它们比HTTP/2更健壮、更有弹性。

7.3 Web VR

随着浏览器能力的提高,内容格局正在快速变化。其中一个领域就是基于网络的VR。虽然还处于起步阶段,但有不少的用例可让VR在增强协做方面发挥关键做用。网络在促进VR互动方面占据了核心位置。VR应用须要更多的带宽来渲染虚拟场景中的复杂细节,所以迁移到HTTP/3会大有收获。

八、HTTP/3的局限性

过渡到HTTP/3不只涉及到应用层的变化,还涉及到底层传输层的变化。所以,与它的前身HTTP/2相比,HTTP/3的采用更具挑战性,由于后者只须要改变应用层。传输层承受着网络中的大量中间层审查。这些中间层,如防火墙、代理、NAT设备等会进行大量的深度数据包检查,以知足其功能需求。所以,新的传输机制的引入对IT基础设施和运维团队来讲有一些影响。

然而,HTTP/3被普遍采用的另外一个问题是,它是基于QUIC的,在UDP上运行。大多数的Web流量,以及IETF定义的知名服务都是在TCP之上运行的。这也是为何长时间运行HTTP/3的UDP会话会被防火墙的默认数据包过滤策略所影响的缘由。

随着IETF正在进行的标准化工做,这些问题最终都会获得解决。此外,考虑到Google在早期QUIC实验所显示的积极结果,人们对HTTP/3的支持是压倒性的,这将最终迫使中间层厂商标准化。

针对受限的IoT设备,HTTP/3因为过于繁琐从而没法采用。许多IoT应用部署的设备的外形尺寸很是小。所以,它们的RAM和CPU功率都是有限的。为了使设备在电池功率、低比特率和有损链接等限制条件下高效运行,必须执行此要求。HTTP/3在现有的UDP之上,以QUIC的形式在传输层处理,增长了HTTP/3在整个协议栈中的占用空间。这使得HTTP/3较为笨重,不适合那些IoT设备。但这种状况不多出现,并且存在专门的协议,这就避免了直接在此类设备上支持HTTP的须要。此外,还有以物联网为核心的协议,如MQTT

九、开始使用HTTP/3

IETF的HTTP工做组正致力于在2020年后期发布HTTP/3。所以它尚未被NGINX和Apache等主流web服务器正式支持。不过,有几个lib能够用来实验这个新协议,也提供了非官方的补丁。

如下是支持HTTP/3和QUIC传输lib的列表。请注意,这些实现都是基于互联网标准草案某一个版本,而这个版本极可能会被更高的版本所取代,最终的标准会在RFC中发布。

1)Quiche :

Quiche提供了经过QUIC协议发送和接收数据包的底层编程接口。它还支持HTTP/3模块,经过其QUIC协议实现发送HTTP数据包。除此以外,它还为NGINX服务器提供了一个非官方的补丁,能够安装和托管一个可以运行HTTP/3的Web服务器。除此之外,还提供了额外的程序来支持Android和iOS移动应用上使用HTTP/3。

2)Aioquic

Aioquic是QUIC的python实现。它还内置HTTP/3的测试服务器和客户端库。Aioquic创建在asyncio模块之上,asyncio模块是Python的标准异步I/O框架。

3)Neqo

Neqo 是 Mozilla 使用 Rust 实现 QUIC 和 HTTP/3。

若是你想尝试QUIC,请查看这个由QUIC工做组维护的QUIC协议的开源实现连接:https://github.com/quicwg/base-drafts/wiki/Implementations

(本文英文原文连接:点此进入、中文译文连接:点此进入

附录:更多有关HTTP协议的文章

网络编程懒人入门(七):深刻浅出,全面理解HTTP协议

技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

让互联网更快:新一代QUIC协议在腾讯的技术实践分享

从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

脑残式网络编程入门(三):HTTP协议必知必会的一些知识

脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

Comet技术详解:基于HTTP长链接的Web端实时通讯技术

WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)

WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)

快速理解高性能HTTP服务端的负载均衡技术原理

一分钟理解 HTTPS 到底解决了什么问题

一篇读懂HTTPS:加密原理、安全逻辑、数字证书等

即时通信安全篇(八):你知道,HTTPS用的是对称加密仍是非对称加密?

IM开发基础知识补课(四):正确理解HTTP短链接中的Cookie、Session和Token

即时通信安全篇(七):若是这样来理解HTTPS原理,一篇就够了

一分钟理解 HTTPS 到底解决了什么问题

一篇读懂HTTPS:加密原理、安全逻辑、数字证书等

小白必读:闲话HTTP短链接中的Session和Token

IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等

美图App的移动端DNS优化实践:HTTPS请求耗时减少近半

HTTPS时代已来,打算更新你的HTTP服务了吗?

移动端网络优化之HTTP请求的DNS优化

(本文同步发布于:http://www.52im.net/thread-3020-1-1.html

相关文章
相关标签/搜索