详解HTTP1.0、1.1、2.0版本区别/优化-程序员宅基地

技术标签: 网络  服务器  Unix网络编程  tcp/ip  

HTTP1.0、1.1、2.0版本区别/优化

1、HTTP 1.0
  • 是一种无状态,无连接的应用层协议
    • 规定浏览器和服务器保持短暂的链接。
    • 浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成以后立即断开TCP连接(短连接),服务器不跟踪也每个客户单,也不记录过去的请求(无状态)。
    • 这种无状态性可以借助cookie/session机制来做身份认证和状态记录
  • 存在的问题:
    • 无法复用连接:每次发送请求/返回响应,都需要进行一次TCP连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率变低。
    • 队头阻塞(head of line blocking):由于HTTP1.0规定下一个请求必须在前一个请求响应到达之后才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。

Http 1.0的致命缺点:

  1. 无法复用TCP连接和并行发送请求,这样每次一个请求都需要三次握手,而且其实建立连接和释放连接的这个过程是最耗时的,传输数据相反却不那么耗时。

  2. 不支持文件断点续传。

  3. 本地时间被修改导致响应头expires的缓存机制失效的问题。


2、HTTP1.1

HTTP1.1继承了HTTP1.0的简单,克服了HTTP1.0性能上的问题。
HTTP1.1也是当前使用最为广泛的HTTP协议

  • 1. 长连接:HTTP1.1增加Connection字段,通过设置Keep-Alive保持HTTP连接不断开,直到连接的某一段主动提出断开连接的请求(Connection:Close)。避免每次客户端与服务器请求都要重复建立释放建立TCP连接。提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection:Close来告知服务器关闭请求。
  • 2. 管道化:HTTP1.1支持请求管道化(pipelining)。基于HTTP1.1的长连接,使得请求管线化成为可能。 管线化使得请求能够“并行”传输。但需要注意的是:服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。
    • 也就是说,HTTP管道化可以让我们把先进先出队列从客户端(请求队列)迁移到服务端(响应队列),如果,客户端同时发了两个请求分别获取html和css,假如说服务器的css资源先准备就绪,服务器也会先发送html,再发送css。 换句话来说,只有等到html响应的资源完全传输完毕后,css响应的资源才开始传输,不允许同时存在两个并行的响应。
    • 可见,HTTP1.1还是无法解决队头阻塞(head of line blocking)的问题,只是把先进先出队列从客户端(请求队列)迁移到服务端(响应队列)。
  • 3. RANGE:bytes字段: 是HTTP/1.1新增内容,断点续传,表示要求服务器从文件XXXX字节处开始传送。
  • 4. 真并行传输 — 浏览器优化策略
    • HTTP1.1支持管道化,但是服务器也必须进行逐个响应的送回,这个是很大的一个缺陷。实际上,现阶段的浏览器厂商采取了另外一种做法,它允许我们打开多个TCP的会话,也就是说,其实是不同的TCP连接上的HTTP请求和相应,这也就是我们所熟悉的浏览器对同域下并行加载6~8个资源的限制。
  • 5. 缓存处理 — 强缓存、协商缓存,启发式缓存(新增)
    • 此外,HTTP1.1还加入了缓存处理(强缓存和协商缓存),新的字段如cache-control,支持断点传输,以及增加了Host字段(使得一个服务器能够用来创建多个Web站点)

Http 1.1的致命缺点:

  • 1.明文传输。
  • 2.其实还是没有解决无状态连接的。
  • 3.当有多个请求同时被挂起的时候 就会拥塞请求通道,导致后面请求无法发送(没有真正的解决队头阻塞)。
  • 4.臃肿的消息首部:HTTP/1.1能压缩请求内容,但是消息首部不能压缩;在现今请求中,**消息首部占请求绝大部分(**甚至是全部)也较为常见。

我们也可以用dns-prefetch和 preconnect tcp来优化~

<link rel="preconnect" href="//example.com" crossorigin>
<link rel="dns=prefetch" href="//example.com">
  • Tip: webpack可以做任何事情,这些都可以用插件实现

3、HTTP2.0

相较于HTTP1.1,HTTP2.0的主要优点有:

  1. 采用二进制帧封装
  2. 传输变成多路复用
  3. 流量控制算法优化
  4. 服务器端推送
  5. 首部压缩
  6. 优先级

1、 二进制帧封装 / 二进制分帧

HTTP1.x的解析是基于文本的,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多。

HTTP2.0会将所有传输的信息分割为更小的消息和帧,然后采用二进制的格式进行编码HTTP1.x的头部信息会被封装到HEADER frame(单独成帧,不再在后续数据传输中携带),而相应的RequestBody则封装到DATAframe里面

不改动HTTP的语义,使用二进制编码,实现方便且健壮。

2、 多路复用 && 优先级

所有的请求都是通过一个 TCP 连接并发完成。

HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求

同时,流还支持优先级和流量控制。当流并发时,就会涉及到流的优先级和依赖

即:HTTP2.0对于同一域名下所有请求都是基于流的,不管对于同一域名访问多少文件,也只建立一路连接。优先级高的流会被优先发送和响应。图片请求的优先级要低于 CSS 和 SCRIPT,这个设计可以确保重要的东西可以被优先加载完(相较HTTP1.1,响应不再死板的按照请求顺序返回,而是根据流中请求数据的优先级响应)。

3、 流量控制

TCP协议通过sliding window(滑动窗口)的算法来做流量控制。

发送方有个sending window,接收方有receive window。http2.0的flow control是类似receive window的做法数据的接收方通过告知对方自己的flow window大小表明自己还能接收多少数据。

只有Data类型的frame才有flow control的功能。对于flow control,如果接收方在flow window为零的情况下依然更多的frame,则会返回block类型的frame,这种场景一般表明http2.0的部署出了问题。

4、 服务器端推送

服务端推送是一种在客户端请求之前发送数据的机制。可以做到(客户端的)缓存。

服务器端的推送,就是服务器可以对一个客户端请求发送多个响应

除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。 当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求。

5、 首部压缩

  1. HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;

    通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。

  2. 如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面新增或修改的首部帧会被追加到“首部表”首部表在 HTTP 2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新

  3. 本质上是为了减少请求,通过多个js或css合并成一个文件,多张小图片拼合成Sprite图,可以让多个HTTP请求减少为一个,减少额外的协议开销,而提升性能。

    当然,一个HTTP的请求的body太大也是不合理的,有个度。文件的合并也会牺牲模块化和缓存粒度,可以把“稳定”的代码or 小图 合并为一个文件or一张Sprite,让其充分地缓存起来,从而区分开迭代快的文件。

    HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47826078/article/details/127960493

智能推荐

CAN总线的物理层分析(三)_can物理层需求分析-程序员宅基地

文章浏览阅读2.4k次。一、CAN拓扑网络连接在CAN总线上的设备叫做节点设备(CAN Node),CAN网络的拓扑一般为线型。线束最常用的是双绞线,线上传输为对称的差分电平信号。下图为CAN总线网络示意图,节点主要包括Host、控制器和收发器。Host常集成有CAN控制器,CAN控制器负责处理协议相关功能,以减轻Host的负担。CAN收发器将控制器连接到传输媒介。通常控制器和总线收发器通过光耦或磁耦隔离,这样即使总..._can物理层需求分析

2020解读中国互联网:局部领先、快进的数字化发展_解读中国互联网:局部领先-程序员宅基地

文章浏览阅读133次。局部领先的当前格局:中国互联网特色分明,部分领域世界领先应对不确定性,是未来十年数字经济发展的重要命题。突如其来的新冠疫情为全球发展秩序带来了巨大的不确定性,政府、企业和个体迅速进入了一场全社会参与的数字化实验,以数字化作为应对不确定性的有效方针。在全社会数字化的进程中,中◿互联网“数智化”的步伐加快,呈现以下特色格局:在产业端,局部领先全球:产业互联网发展水平在不同行业差异明显。在需求端个性化程度高且供给端分散的行业,例如餐饮、服饰等,数字化程度已开始引领全球,互联网巨头赋能行业供应链各环节的B端企业_解读中国互联网:局部领先

关于Linux如何加入windows创建的域_linux账户验证使用windows域 活动目录-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏11次。一、场景描述在某系统微服务改造中,在某windows域环境下,创建了3台Linux 虚拟机来进行功能性验证,为更好地彼此间信任和融合域环境,需要将Linux虚拟机加入到现有的Windows域内,那如何实施呢,本次将对此进行讨论阐述。回顾AD 域验证过程:自 Windows 2000 以来,AD 一直是 Windows 的身份验证和目录服务,AD 基于 LDAP 实现其功能,其使用 DNS 进行主机名的解析,使用 Kerberos V5 进行用户身份验证,使用 LDAP V3 进行统一的帐户管理。二、常_linux账户验证使用windows域 活动目录

qt设计为磨砂玻璃效果_Pixyz的2020.1更新为数据准备带来了磨砂和光泽-程序员宅基地

文章浏览阅读753次。qt设计为磨砂玻璃效果For their 2020.1 release, our partners at Pixyz have focused on improvements ranging from core geometry capabilities and new import formats to visualization and user interface enhancements...._qt将图片添加毛玻璃效果

网络协议 (三) Http1.0 vs Http1.1 vs Http2.0 (应用层)_http1.0和http1.1哪个占用资源-程序员宅基地

文章浏览阅读2.1k次。这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1:响应状态码 缓存处理 连接方式 Host头处理 带宽优化1. 响应状态码Http1.1 与 Http1.0 相比,新加入了大量的状态码。2. 缓存处理Http1.0 中的缓存机制非常简单,服务端使用 Expires 标签来标识一个相应体,在 Expires 标志的时间内的所有请求,获得的都会是缓存。服务端 初次返回给 客户端 的响应体中,会有一个 Last-Modified 标签,该标签标记了被请求资源在_http1.0和http1.1哪个占用资源

【指纹识别】基于matlab指纹图像细节特征提取 【含Matlab源码 227期】_matlab指纹特征提取代码-程序员宅基地

文章浏览阅读6.2k次,点赞4次,收藏53次。指纹图像细节特征提取 完整的代码,方可运行;可提供运行操作视频!适合小白!_matlab指纹特征提取代码

随便推点

网站显示不出来,怎么排查?_网站访问不了抓包判断-程序员宅基地

文章浏览阅读954次。网站显示不出来,怎么排查?_网站访问不了抓包判断

【无标题】_stm32 串口 tc标志位可以自动清0-程序员宅基地

文章浏览阅读629次。一:STM32的外部中断类型:外部中断分为两部分,初始化和处理。1. 外部中断初始化项目  分三部分:GPIO、通用中断、EXTI(External interrupt/event controller)1.1. GPIO:时钟、端口、引脚、输入模式 时钟:需要同时使能GPIO时钟 引脚:需要选择指定的引脚 输入模式:一般选择浮空输入 1.2. 通用中断:优先级分组、中断源、优先级、使能 优先级分组:设定合适的优先级分组 中断源:选择指定的EXT_stm32 串口 tc标志位可以自动清0

Spring Data JPA关于懒加载的那些事_jpa fetchtype.lazy-程序员宅基地

文章浏览阅读389次。另外 OSIV 将 service 层的技术细节暴露到了 controller 层,造成了一定的耦合,因而不建议开启,对应的解决方案就是在 controller 层中使用 response,而非 detached 状态的 entity,所需的数据不再依赖延时加载,在组装 response 的时候根据需要显式查询。至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。_jpa fetchtype.lazy

统计学习方法——模型与问题分类_统计模型分类-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏8次。0. 写在前面在这一讲中,我们主要介绍一下模型的类别以及问题的类别,并对课后习题进行相应的分析。1. 模型的类型我们知道,统计学习主要包括监督学习、非监督学习、半监督学习和强化学习。那么在统计学习方法一书中主要涉及的是监督学习。而监督学习主要分为两类,一种是生成模型,一种是判别模型。1. 生成模型生成模型是由数据学习联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测模型,其样子为:_统计模型分类

敏捷项目经理_敏捷项目经理需要关注的11个领域-程序员宅基地

文章浏览阅读293次。敏捷项目经理 在我以前的文章中,我重点介绍了一个伟大的软件开发人员 的态度和一个伟大的软件测试 人员 的态度 。 敏捷项目的成功也很大程度上取决于敏捷项目经理。 他做出的决定以及他对某些领域的重视将为成功的敏捷项目铺平道路。 在本文中,我提供了敏捷项目经理应该关注的一些关键点,以改善敏捷项目。 员工招聘 首先,敏捷项目经理需要为项目雇用合适的人员。 技术和非技术修饰 进入项目后,..._敏捷经理

Python教程——Python本地环境安装_python3.10.11安装教程-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏8次。Python 是 Guido van Rossum 于 1989 年发明,Python 源码遵循 GPL(GNU General Public License)协议。Python 是一个高层次的结合了解释性、编译性、互动性和面向对象解释型语言:这意味着开发过程中没有了编译这个环节。类似于 PHP 和 Perl 语言。交互式语言: 这意味着,您可以在 Python 提示符>>>后直接执行程序。面向对象语言: 这意味着 Python 支持面向对象的风格或代码封装在对象的编程技术。_python3.10.11安装教程

推荐文章

热门文章

相关标签