HTTP/1.0、HTTP/1.1、HTTP/2.0区别

文章目录

  • 区别
  • HTTP/1.0
  • HTTP/1.1
    • 1. 持久连接(长连接)
    • 2. 管道化
    • 3. Host头字段
    • 4. 分块传输编码
    • 5. 缓存机制
    • 6. 请求方法
  • HTTP/2.0
    • 1. 二进制分帧
    • 2. 多路复用
    • 3. 服务器推送
    • 4. 优先级设置
    • 5. 头信息压缩
    • 6. 安全性
    • 7. 流量控制

区别

特性HTTP/1.0HTTP/1.1HTTP/2.0
连接管理非持久连接:每个请求/响应需要新的连接默认持久连接:允许多个请求/响应通过单个连接多路复用(Multiplexing),允许单个连接上并行处理多个请求/响应
请求流水线不支持支持(但受限于阻塞问题)不支持,由多路复用取代
性能较低,由于连接建立和关闭的开销较高,由于持久连接和管道化(Pipelining)最高,由于多路复用、头部压缩和服务器推送
缓存If-Modified-Since、Expires 来做为缓存判断的标准增强了缓存控制,引入了ETag、If-None-Match等增强了缓存策略,更好地支持HTTP/2.0的特性和功能
头信息压缩不支持不支持支持,使用HPACK算法进行头部压缩
服务器推送不支持不支持支持服务器主动推送资源到客户端缓存
安全性无原生安全支持无原生安全支持,但常通过HTTPS扩展实现原生支持通过TLS加密的HTTPS
二进制分帧不支持不支持支持,所有通信都被分解为小的消息和帧,能更有效地使用网络资源
消息依赖性请求/响应是严格有序的请求/响应是严格有序的请求/响应可以并行处理,不依赖于之前的请求/响应
流控制不支持不支持支持流控制,允许客户端和服务器更好地控制资源消耗和分配

HTTP/1.0

浅谈 HTTP


HTTP/1.1

HTTP/1.1是HTTP协议的一个版本,相较于HTTP/1.0,它在多个方面进行了改进和优化。

1. 持久连接(长连接)

HTTP/1.0中,每个HTTP请求都需要建立一个新的TCP连接,完成后立即断开。这种方式在大量请求时会造成很大的性能开销,因为每个连接都需要进行三次握手和四次挥手。

HTTP/1.1引入了持久连接(也称为长连接)的概念。通过在请求头中添加Connection: keep-alive字段,客户端和服务器之间可以保持一个TCP连接,用于多个请求和响应的传输 。这种方式显著减少了建立和关闭连接的次数,提高了网络资源的利用率和性能。

.

2. 管道化

管道化:客户端可以在一个持久的TCP连接上连续发送多个请求,而不需要等待上一个请求的响应,且服务器会按照请求的顺序依次返回响应。

管道网络传输是指:**可以在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。**但是服务器还是按照顺序回应请求。如果前面的回应特别慢,后面就会有许多请求排队等着。这称为队头堵塞。

注意:

  • 管道化同时依赖于客户端和服务器的支持。只有遵守HTTP/1.1的服务器才支持管道化。

  • 虽然管道化可以提高性能,但它也可能引发“队首阻塞”问题。

    如果前面的一个请求在服务器端处理的时间很长,生成响应需要很多时间,那么后面的请求即使已经处理完毕并生成了响应,也需要等待前面的响应发送完毕后才能发送。这会造成一定的延迟。

    HTTP/2通过引入二进制帧和多路复用的概念,以及服务器推送等功能,进一步解决了HTTP/1.1中的队首阻塞问题,并提供了更好的性能和用户体验。

.

3. Host头字段

HTTP/1.0中,由于无法确定请求的资源位于哪个主机上,因此无法实现虚拟主机。

HTTP/1.1在请求头中引入了Host字段,用于指定请求的资源所在的主机和端口号。Host 请求头字段是一个强制性的字段。

这使得一台物理服务器上可以部署多个Web站点,通过Host字段来区分不同的虚拟主机。对于支持虚拟主机(即一台服务器上托管多个域名)也至关重要。

.

4. 分块传输编码

分块传输编码:当服务器不知道响应内容的长度时,可以使用分块传输编码将响应内容分成多个块进行传输。每个块都包含一个长度字段和一个数据字段。客户端可以逐个接收这些块,直到接收到一个长度为0的块时,表示响应内容已经传输完毕。

分块传输编码允许服务器在传输过程中动态生成响应内容,而不需要提前知道整个响应的大小。这有助于处理大文件传输和动态内容生成等场景。

.

5. 缓存机制

HTTP/1.1引入了更强大的缓存机制,允许客户端和服务器缓存请求和响应的内容。通过缓存,可以减少网络传输的数据量,提高响应速度。

HTTP/1.1还提供了丰富的缓存控制指令,如Cache-ControlExpiresETag等,用于控制缓存的行为和有效性。

彻底理解浏览器的缓存机制

.

6. 请求方法

HTTP/1.1新增了以下五种请求方法:

  • OPTIONS:这个请求方法用于获取目标资源所支持的通信选项。客户端可以对特定的URL使用OPTIONS请求,以了解该URL所支持的HTTP方法。

  • PUT:PUT请求方法用于向指定资源位置上传其最新内容。通常用于更新资源。

  • DELETE:DELETE请求方法用于删除指定资源。

  • TRACE:TRACE请求方法用于回显服务器收到的请求,主要用于测试或诊断目的。

  • CONNECT:CONNECT请求方法通常用于SSL加密服务器的链接(经由非加密的HTTP代理)。这个请求方法允许客户端建立一个到由请求URI标识的资源的隧道。一旦隧道建立,客户端就可以通过隧道发送原始的字节数据,而无需考虑HTTP协议。


HTTP/2.0

1. 二进制分帧

HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。

HTTP/2.0将HTTP报文分为多个帧(Frame),以二进制方式传输,取代了HTTP 1.x中的文本格式。这使得HTTP/2.0在解析数据时更加高效,减少了处理文本数据的开销。

每个帧都包含帧的长度、类型、标志等信息,以及特定类型的数据,如HTTP首部、负荷等。这种分帧机制使得HTTP/2.0能够更灵活地处理数据,提高了传输效率。

.

2. 多路复用

多路复用:允许在同一个TCP连接上同时发送多个请求和响应,而且不用按照顺序一一发送。这解决了HTTP/1.1中的队头阻塞问题,提高了并发性能。

通过多路复用,客户端和服务器可以并行处理多个请求和响应,从而减少了等待时间,提高了网络资源的利用率。

.

3. 服务器推送

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对缩短页面加载时间。

服务器推送可以减少客户端的额外请求,降低网络延迟,提高页面加载速度。

.

4. 优先级设置

HTTP/2.0支持数据流的优先级设置,允许客户端指定请求的优先级。

服务器会根据请求的优先级来分配资源,优先处理重要的请求,从而提高了用户体验。

.

5. 头信息压缩

由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 CookieUser Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。

HTTP/2.0使用HPACK算法对头信息压缩进行压缩,减少了头信息压缩的数据量,节省了带宽

  • 头信息使用 gzip 或 compress 压缩后再发送

  • 客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。

.

6. 安全性

HTTP/2.0默认使用SSL/TLS加密传输网络数据,增强了安全性。

这使得HTTP/2.0更加适用于敏感数据的传输,如在线支付、登录等场景。

.

7. 流量控制

HTTP/2.0引入了流量控制机制,允许客户端和服务器控制数据的传输速度。

这可以防止发送方发送过多的数据导致接收方缓冲区溢出,从而保证了数据传输的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔试训练】day23

一、打怪 思路 由于是先手攻击,如果一次攻击就能杀死小怪,那么说明可以为无限杀小怪。 再计算杀一只小怪要扣多少血就好了,再用总生命值去除这个扣血量,得到的就是最多杀死小怪的数量。注意,由于最后一定要活下来&am…

博客系统问题

1.数据库相关的问题,包括定义表的结构、创建数据库表、增删改查操作的实现: Flask程序中,使用了ORM(Object Relation Mapping, 对象关系映射)这种思想来定义实体类并据此创建数据库表。 创建:首先是在代码中定义python类&#xf…

React面试经验2

1.执行顺序题 onClick () > {//athis.setState({num: this.state.num 1,})console.log(1:,this.state.num);//bthis.setState({num: this.state.num 1,})console.log(2:,this.state.num);setTimeout(() > {//cthis.setState({num: this.state.num 1,});console.log(…

将矩阵按对角线排序(Lc1329)——排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 给你一个 m * n 的整…

DevEco:智能、灵活、实时的集成开发环境

引言 前端性能是一个老生常谈的话题了,它不单单是一个技术概念,而是用户体验中非常重要的一环。通常在一些面向用户的产品中它直接影响了用户转化率、粘性等重要指标。 那么是不是不在乎转化率的中后台产品就可以不在乎性能了?显然不是&…

API接口开发实现一键智能化自动抓取电商平台商品评论数据支持高并发免费接入示例

为了实现一键智能化自动抓取电商平台商品评论数据可支持高并发免费接入,你可以使用Python编程语言和相关库(如requests、BeautifulSoup等)来开发一个API接口,也可以使用封装好的api接口获取,注册一个api账号获取key和s…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日,旅行者1号工程团队时隔5个月,终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天,工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代,NASA喷…

【QT教程】QT6硬件数据库编程 QT硬件数据库

QT6硬件数据库编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

Oracle中blob和clob的区别和例子

在Oracle数据库中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用于存储大量数据的两种大型对象(LOB)类型,但它们之间存在一些关键的区别。 数据存储方式&#xff1…

FFmpeg常用API与示例学习(二)

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…

vue3速览

在您的Vue.js 3应用中,createApp 是用于创建一个Vue应用实例的函数。您已经正确地引入了它并开始创建应用,但目前根组件内部是空的。下面我将为您展示一个更完整的例子,说明如何设置根组件的模板、数据、方法等选项,并挂载到DOM上…

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力&a…

Python | Leetcode Python题解之第71题简化路径

题目: 题解: class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

W801学习笔记二十四:NES模拟器游戏

之前已经实现了NES模拟器玩游戏。W801学习笔记九:HLK-W801制作学习机/NES游戏机(模拟器) 现在要在新版本掌机中移植过来。 1、把NES文件都拷贝到SD卡中。 这回不会受内存大小限制了。我这里拷贝了4个,还可以拷贝更多。 2、应用初始化中,加载…

React 学习-7-组件API

设置状态:setState setState(object nextState[, function callback]) nextState,将要设置的新状态,该状态会和当前的state合并 callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。 替…

FFmpeg常用API与示例学习(一)

工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…

如何使用 await-to-js 库优雅的处理 async await 错误

通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文章进行总结对整个学习的过程进行一个梳理同时分享给其他人。 JS 异步编程进化之路 回调地狱阶段 在正式介绍 await-to-js 这个库之前,让我们先简单的回顾一下有关于在 JavaScript 这门语言…

ctfshow web入门 php反序列化 web275--web278(无web276)

web275 这道题和序列化一点关系都没有 整个代码并没有说filename(f)怎么传参只有fn并且屏蔽了flag highlight_file(__FILE__);class filter{public $filename;public $filecontent;public $evilfilefalse;public function __construct($f,$fn){$this->filename$f;$this-&g…

bash: docker-compose: 未找到命令

bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时,报错说 docker-compose 命令找不到,在网上试了一些安装方法,良莠不齐,所以在这块整理一下,如何正确快速的安装 docker-compose cd…