HTTP/1和HTTP/2与HTTP/3 的区别(http1.1与http2.0)
csdh11 2025-03-17 17:02 2 浏览
HTTP/2自从诞生大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何降级应该是不普遍使用的原因之一。虽然 HTTP/2 提高了网页的性能,但是并不代表它已经是完美的了,HTTP/3 就是为了解决 HTTP/2 所存在的一些问题诞生的。
一、HTTP/1.1诞生
近年来加载网站首页需要的下载的数据量在逐渐增加。但我们更应该关心的是:平均每个页面为了完成显示与渲染所需要下载的资源数已经大大增加。
如下图所示,传输数据大小与平均请求资源数量不断持续增长,并没有减缓的迹象。该图表中绿色直线展示了传输数据大小的增长,红色直线展示了平均请求资源数量的增长。
HTTP/1.1自从发布以来,随着近十年互联网的爆炸式发展,从当初网页内容以文本为主,到现在以富媒体(如图片、声音、视频)为主,而且对页面内容实时性高要求的应用越来越多(比如聊天、视频直播),于是当时协议规定的某些特性,已经无法满足现代网络的需求了。
二、HTTP/1.1的缺陷
1、高延迟--带来页面加载速度的降低
虽然近几年来网络带宽增长非常快,网络延迟有对应程度的降低。网络延迟问题主要由于队头阻塞(Head-Of-Line Blocking),导致带宽无法被充分利用。
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。针对队头阻塞,人们尝试过以下办法来解决:
- 将同一页面的资源分散到不同域名下,提升连接上限。 Chrome有个机制,对于同一个域名,默认允许同时建立 6 个 TCP持久连接,使用持久连接时,虽然能公用一个TCP管道,但是在一个管道中同一时刻只能处理一个请求,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。另外如果在同一个域名下同时有10个请求发生,那么其中4个请求会进入排队等待状态,直至进行中的请求完成。
- Spriting合并多张小图为一张大图,再用JavaScript或者CSS将小图重新“切割”出来的技术。
- 内联(Inlining)是另外一种防止发送很多小图请求的技巧,将图片的原始数据嵌入在CSS文件里面的URL里,减少网络请求次数。
.icon1 { background: url(data:image/png;base64,) no-repeat; }.icon2 { background: url(data:image/png;base64,) no-repeat; }
- 拼接(Concatenation)将多个体积较小的JavaScript使用webpack等工具打包成1个体积更大的JavaScript文件,但如果其中1个文件的改动就会导致大量数据被重新下载多个文件。
2、无状态特性--带来的巨大HTTP头部
报文Header一般会携带"User Agent""Cookie""Accept""Server"等许多固定的头字段(如下图),多达几百字节甚至上千字节,但Body却经常只有几十字节(比如GET请求、204/301/304响应),成了不折不扣的“大头儿子”。Header里携带的内容过大,在一定程度上增加了传输的成本。更要命的是,成千上万的请求响应报文里有很多字段值都是重复的,非常浪费。
3、明文传输--带来的不安全性
HTTP/1.1在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。
4、不支持服务器推送消息
三、SPDY 协议与 HTTP/2
1、SPDY 协议
谷歌推出SPDY,才算是正式改造HTTP协议本身。降低延迟,压缩header等等,SPDY的实践证明了这些优化的效果,也最终带来HTTP/2的诞生。
HTTP/1.1有两个主要的缺点:安全不足和性能不高,由于背负着 HTTP/1.x 庞大的历史包袱,所以协议的修改,兼容性是首要考虑的目标,否则就会破坏互联网上无数现有的资产。如上图所示,SPDY位于HTTP之下,TCP和SSL之上,这样可以轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可以使用已有的SSL功能。SPDY 协议在Chrome浏览器上证明可行以后,就被当作 HTTP/2 的基础,主要特性都在 HTTP/2 之中得到继承。
2、HTTP/2 简介
2015年,HTTP/2 发布。HTTP/2是现行HTTP协议(HTTP/1.x)的替代,但它不是重写,HTTP方法/状态码/语义都与HTTP/1.x一样。HTTP/2基于SPDY,专注于性能,最大的一个目标是在用户和网站间只用一个连接(connection),使用HTTP/2能带来20%~60%的效率提升。
HTTP/2由两个规范(Specification)组成:
- Hypertext Transfer Protocol version 2 - RFC7540
- HPACK - Header Compression for HTTP/2 - RFC7541
四、HTTP/2 新特性
1.二进制传输
HTTP/2传输数据量的大幅减少,主要有两个原因:以二进制方式传输和Header 压缩。先来介绍二进制传输,HTTP/2 采用二进制格式传输数据,而非HTTP/1.x 里纯文本形式的报文 ,二进制协议解析起来更高效。HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。
它把TCP协议的部分特性挪到了应用层,把原来的"Header+Body"的消息"打散"为数个小片的二进制"帧"(Frame),用"HEADERS"帧存放头数据、"DATA"帧存放实体数据。HTP/2数据分帧后"Header+Body"的报文结构就完全消失了,协议看到的只是一个个的"碎片"。
HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
2.Header 压缩
HTTP/2并没有使用传统的压缩算法,而是开发了专门的"HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串,可以达到50%~90%的高压缩率。
具体来说:
- 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
- 首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
- 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值
如下图中有两个请求, 请求一发送了所有的头部字段,第二个请求则只需要发送差异数据,这样可以减少冗余数据,降低开销。
3.多路复用
在 HTTP/2 中引入了多路复用的技术。多路复用很好的解决了浏览器限制同一个域名下的请求数量的问题,同时也接更容易实现全速传输,毕竟新开一个 TCP 连接都需要慢慢提升传输速度。
在 HTTP/2 中,有了二进制分帧之后,HTTP /2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2中,
- 同域名下所有通信都在单个连接上完成。
- 单个连接可以承载任意数量的双向数据流。
- 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。
好处是使性能有了极大提升:
- 同个域名只需要占用一个 TCP 连接,使用一个连接并行发送多个请求和响应,这样整个页面资源的下载过程只需要一次慢启动,同时也避免了多个TCP连接竞争带宽所带来的问题。
- 并行交错地发送多个请求/响应,请求/响应之间互不影响。
- 在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。如下图所示,多路复用技术可以通过一个 TCP 连接就可以传输所有的请求数据。
4.Server Push
HTTP2还在一定程度上改变了传统的“请求-应答”工作模式,服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息。比如,在浏览器刚请求HTML的时候就提前把可能会用到的JS、CSS文件发给客户端,减少等待的延迟,这被称为"服务器推送"( Server Push,也叫 Cache push)
如下图所示,服务端主动把JS和CSS文件推送给客户端,不需要客户端解析HTML时再发送这些请求。
而且服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方确认才行。
5、提高安全性
HTTP/2延续了HTTP/1的“明文”特点,可以像以前一样使用明文传输数据,不强制使用加密通信,不过格式还是二进制,只是不需要解密。主流的浏览器等都公开宣布只支持加密的HTTP/2,所以“事实上”的HTTP/2是加密的。也就是说,互联网上通常所能见到的HTTP/2都是使用"https”协议名,跑在TLS上面。HTTP/2协议定义了两个字符串标识符:“h2"表示加密的HTTP/2,“h2c”表示明文的HTTP/2。
五、HTTP/3 新特性
1.HTTP/2 的缺点
虽然 HTTP/2 解决了很多之前旧版本的问题,但是它还是存在一个巨大的问题,主要是底层支撑的 TCP 协议造成的。HTTP/2的缺点主要有以下几点:
1.1.TCP 以及 TCP+TLS建立连接的延时
①在建立TCP连接的时候,需要和服务器进行三次握手来确认连接成功,也就是说需要在消耗完1.5个RTT之后才能进行数据传输。
②进行TLS连接,TLS有两个版本——TLS1.2和TLS1.3,每个版本建立连接所花的时间不同,大致是需要1~2个RTT。
1.2.TCP的队头阻塞并没有彻底解决
在HTTP/2中,多个请求是跑在一个TCP管道中的。但当出现了丢包时,HTTP/2 的表现反倒不如 HTTP/1 了。因为TCP为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,HTTP/2出现丢包时,整个 TCP 都要开始等待重传,那么就会阻塞该TCP连接中的所有请求(如下图)。而对于 HTTP/1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
可能有人考虑为什么不直接去修改 TCP 协议?其实这已经是一件不可能完成的任务了。因为 TCP 存在的时间实在太长,已经充斥在各种设备中,并且这个协议是由操作系统实现的,更新起来不大现实。
2.HTTP/3简介
Google 在推SPDY的时候就已经意识到了这些问题,于是就另起炉灶搞了一个基于 UDP 协议的“QUIC”协议,让HTTP跑在QUIC上而不是TCP上。而这个“HTTP over QUIC”就是HTTP协议的下一个大版本,HTTP/3。它在HTTP/2的基础上又实现了质的飞跃,真正“完美”地解决了“队头阻塞”问题。
3.QUIC新功能
上面提到QUIC基于UDP,而UDP是“无连接”的,根本就不需要“握手”和“挥手”,所以就比TCP来得快。此外QUIC也实现了可靠传输,保证数据一定能够抵达目的地。它还引入了类似HTTP/2的“流”和“多路复用”,单个“流"是有序的,可能会因为丢包而阻塞,但其他“流”不会受到影响。具体来说QUIC协议有以下特点:
3.1实现了类似TCP的流量控制、传输可靠性的功能。
虽然UDP不提供可靠性的传输,但QUIC在UDP的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些TCP中存在的特性。
3.2实现了快速握手功能。
由于QUIC是基于UDP的,所以QUIC可以实现使用0-RTT或者1-RTT来建立连接,这意味着QUIC可以用最快的速度来发送和接收数据,这样可以大大提升首次打开页面的速度。0RTT 建连可以说是 QUIC 相比 HTTP2 最大的性能优势。
3.3集成了TLS加密功能。
目前QUIC使用的是TLS1.3,相较于早期版本TLS1.3有更多的优点,其中最重要的一点是减少了握手所花费的RTT个数。
3.4多路复用,彻底解决TCP中队头阻塞的问题
和TCP不同,QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了TCP中队头阻塞的问题。
六、总结
- HTTP/1.1有两个主要的缺点:安全不足和性能不高。
- HTTP/2完全兼容HTTP/1,是“更安全的HTTP、更快的HTTPS",头部压缩、多路复用等技术可以充分利用带宽,降低延迟,从而大幅度提高上网体验;
- QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
相关推荐
- deepseek VS chatgpt (399)—— 算法导论25.2 8题
-
八、给出一个〇(VE)时间复杂度的算法来计算有向图G=(V,E)的传递闭包。如果要写代码,请用go语言。chatgpt:...
- 智能算法导论 第十章 差分进化算法
-
遗传算法流程:1.初始化种群2.选择操作:根据适应度函数选择个体,将其复制到下一代3.交叉操作:将选择的个体随机组合,生成新的个体...
- deepseek VS chatgpt (400)-- 算法导论25.2 9题
-
九、假定我们可以在的时间内计算出一个有向无环图的传递闭包,其中是一个自变量为和的单调递增函数。证明:计算一个通用的有向图,的传递闭包的时间复杂度为。如果要写代码,请用go语言。...
- 文心一言 VS 讯飞星火 VS chatgpt (370)—— 算法导论24.4 2题
-
二、请给出下面差分约束系统的可行解或证明该系统没有可行解。...
- deepseek VS chatgpt (398)—— 算法导论25.2 6题
-
六、我们怎样才能使用Floyd-Warshall算法的输出来检测权重为负值的环路?如果要写代码,请用go语言。chatgpt:...
- deepseek VS chatgpt (405)-- 算法导论25.3 5题
-
五、假定在一个权重函数为w的有向图上运行Johnson算法。证明:如果图包含一条权重为0的环路,那么对于环路上的每条边,。如果要写代码,请用go语言。...
- 推荐引擎算法学习导论(算法引擎是什么意思)
-
之前已经介绍过推荐算法基础知识,在此再介绍一点基础的知识,方便大家温故学习。作者:July。出处:结构之法算法之道引言昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了。于是昨天下午开...
- 文心一言 VS 讯飞星火 VS chatgpt (200)—— 算法导论15.2 4题
-
四、用go语言,对输入链长度为n的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?文心一言:...
- 操作系统概论:第三章 进程调度与死锁
-
进程调度的功能是按照某种策略或算法从就绪态进程中为当前空闲的cPU选择在其上运行的新进程。选择调度方式和算法的若干准则:1)周转时间短周转时间是指从作业被提交给系统开始,到作业完成为止系统的平均...
- C#经典算法实践,回顾往生,更是致敬《算法导论》
-
概述本系列博文将会向大家介绍本人在钻研《算法导论第3版》过程中的点点滴滴,并使用C#语言实现该书中所有的经典算法,附带相应的时间复杂度分析。知识储备C#算法设计之知识储备...
- deepseek VS chatgpt (401)-- 算法导论25.3 1题
-
一、请在图25-2上使用Johnson算法来找到所有结点对之间的最短路径。给出算法计算出的和值。如果要写代码,请用go语言。chatgpt:...
- 《算法导论》随笔3-1 Kruskal算法 第23章
-
这个是图论的倒数第二章。我会着重讲解最小生成树和拓扑排序两个算法。如果哪些地方我写错的,或者没写清楚的,可以评论区吐槽~先看一道洛谷上面的题目。...
- 算法圣经——《算法导论》中文版PDF免费分享
-
作为最著名的算法书之一,这本书深入浅出,全面论述了算法的内容,从一定深度上涵盖了算法的诸多方面,同时其讲授和分析方法又兼顾了各个层次读者的接受能力。各章内容自成体系,可作为独立单元学习。全书选材经典、...
- 洛阳规划馆版地图(分解版)(洛阳规划馆什么时候闭馆)
-
规划馆版地图组图规划馆版地图组图规划馆版地图组图规划馆版地图组图规划馆版地图组图规划馆版地图组图规划馆版地图组图规划馆版地图组图...
- 《意义地图》(意象地图五大要素)
-
意义是人的终极命题。人对于世界的意义,也就是世界对于人的意义。本书从人性的层面,从人际的视角,探讨了人如何活出意义的心理和精神路径,描绘了属于人的意义地图。我们都乘坐在属于自己的意义之舟上,时刻在掂量...
- 一周热门
- 最近发表
-
- deepseek VS chatgpt (399)—— 算法导论25.2 8题
- 智能算法导论 第十章 差分进化算法
- deepseek VS chatgpt (400)-- 算法导论25.2 9题
- 文心一言 VS 讯飞星火 VS chatgpt (370)—— 算法导论24.4 2题
- deepseek VS chatgpt (398)—— 算法导论25.2 6题
- deepseek VS chatgpt (405)-- 算法导论25.3 5题
- 推荐引擎算法学习导论(算法引擎是什么意思)
- 文心一言 VS 讯飞星火 VS chatgpt (200)—— 算法导论15.2 4题
- 操作系统概论:第三章 进程调度与死锁
- C#经典算法实践,回顾往生,更是致敬《算法导论》
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 反恐24小时电话铃声 (33)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)