HTTP 1 2 3 的演变过程

news2024/10/6 18:24:08

1 HTTP/1.1 相比 HTTP/1.0 提高了什么性能?

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

  • 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
  • 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

但 HTTP/1.1 还是有性能瓶颈:

  • 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  • 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
  • 没有请求优先级控制;
  • 请求只能从客户端开始,服务器只能被动响应。

2 HTTP/2 做了什么优化?

HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。

在这里插入图片描述
那 HTTP/2 相比 HTTP/1.1 性能上的改进:

  • 头部压缩
  • 二进制格式
  • 并发传输
  • 服务器主动推送资源

2.1 头部压缩

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。

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

2.2 二进制格式

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。

在这里插入图片描述
这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。

比如状态码 200 ,在 HTTP/1.1 是用 ‘2’‘0’‘0’ 三个字符来表示(二进制:00110010 00110000 00110000),共用了 3 个字节,如下图:

在这里插入图片描述
在 HTTP/2 对于状态码 200 的二进制编码是 10001000,只用了 1 字节就能表示,相比于 HTTP/1.1 节省了 2 个字节,如下图:

在这里插入图片描述
Header: :status: 200 OK 的编码内容为:1000 1000,那么表达的含义是什么呢?

在这里插入图片描述

  • 最前面的 1 标识该 Header 是静态表中已经存在的 KV。
  • 在静态表里,“:status: 200 ok” 静态表编码是 8,二进制即是 1000。

因此,整体加起来就是 1000 1000。

2.3 并发传输

我们都知道 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应),才能处理下一个事务,也就是说在发出请求等待响应的过程中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的,也造成了队头阻塞的问题。

而 HTTP/2 引入了 Stream 概念,多个 Stream 复用在一条 TCP 连接。

在这里插入图片描述
从上图可以看到,1 个 TCP 连接包含多个 Stream,Stream 里可以包含 1 个或多个 Message,Message 对应 HTTP/1 中的请求或响应,由 HTTP 头部和包体构成。Message 里包含一条或者多个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放 HTTP/1 中的内容(头部和包体)。

针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应。

比如下图,服务端并行交错地发送了两个响应: Stream 1 和 Stream 3,这两个 Stream 都是跑在一个 TCP 连接上,客户端收到后,会根据相同的 Stream ID 有序组装成 HTTP 消息。

在这里插入图片描述

2.4 服务器推送

HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务端不再是被动地响应,可以主动向客户端发送消息。

客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。

比如下图,Stream 1 是客户端向服务端请求的资源,属于客户端建立的 Stream,所以该 Stream 的 ID 是奇数(数字 1);Stream 2 和 4 都是服务端主动向客户端推送的资源,属于服务端建立的 Stream,所以这两个 Stream 的 ID 是偶数(数字 2 和 4)。

再比如,客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返,如下图左边部分:

在这里插入图片描述

如上图右边部分,在 HTTP/2 中,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。

HTTP/2 有什么缺陷?

HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。

HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。

在这里插入图片描述
在这里插入图片描述
图中发送方发送了很多个 packet,每个 packet 都有自己的序号,你可以认为是 TCP 的序列号,其中 packet 3 在网络中丢失了,即使 packet 4-6 被接收方收到后,由于内核中的 TCP 数据不是连续的,于是接收方的应用层就无法从内核中读取到,只有等到 packet 3 重传后,接收方的应用层才可以从内核中读取到数据,这就是 HTTP/2 的队头阻塞问题,是在 TCP 层面发生的。

所以,一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。

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

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

相关文章

【ECharts+Vue】学习笔记(快速入门版)

一、ECharts 1.1 什么是Echarts ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。提供了丰富的可视化图标,帮助你轻松实现大屏展示。 官网地址:Apache ECharts 1.2 ECharts的安装 直接下载 下载官…

分布式之搜索解决方案es

一 ES初识 1.1 概述 ElasticSearch:是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。是ELK的一个组成,是一个产品,而且是非常完善的产品,ELK代表…

webRtc播放rtsp视频流(vue2、vue3+vite+ts)

一、下载webRtc 开发环境用的win10版本的。 github上直接下载,速度感人。 Releases mpromonet/webrtc-streamer GitHub 提供资源下载,0积分 https://download.csdn.net/download/weiqiang915/87700892 二、启动,测试 webrtc-streame…

PDD滑块分析

文章目录 1.流程分析2.关键点分析3.结果展示 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 欢迎大佬加群一起交流哇( Q群:985475126…

基于web的电动车租赁管理系统C#+asp.net+sqlserver

具体功能如下:个人信息管理:实现登陆后对个人信息进行修改和查看的功能。 修改登录密码:实现登陆后对个人密码进行修改的功能。 申请租车订单:客户用户登陆后可以申请租车订单。同时可以查看租赁订单信息。 售后评价管理&#xff…

深度学习中的一阶段目标检测

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

飞行机器人专栏(十二)-- 提高机器人系统可靠性的关键要素与实践

本文将介绍如何在机器人系统的开发过程中融入关键要素,从而提高系统的可靠性。我们将从需求分析、设计阶段、开发与调试、验证与优化、迭代与升级等方面进行详细讨论,并提供示例代码以帮助您更好地理解相关概念。 目录 一、需求分析与规划 二、…

XML与JSON知识学习

目录 XML简介 XML的结构 小结 使用DOM 练习 小结 使用SAX 练习 小结 使用Jackson 练习 小结 使用JSON 反序列化 练习 小结 XML简介 XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种数据表示格式&#xf…

管理后台项目-01-项目模板-登录相关-路由搭建-品牌相关

目录 1-项目模板 1.1-项目目录结构说明​编辑 1.2-前置项目相关配置 2-登录相关开发 3-路由的搭建 4-品牌管理 4.1-品牌列表 4.2-新增/修改品牌 4.3-删除品牌名称 1-项目模板 前端的后台管理系统我们采用github上有的成熟项目作为模板来开发; 简洁版:GitHu…

【CocosCreator入门】CocosCreator组件 | ScrollView(滚动视图)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中的ScrollView组件是一种用于实现滚动视图效果的重要组件。它可以让我们在游戏中实现各种滚动视图效果,例如列表、地图等。 目录 一、组件介绍 二、组件属性 三、详细说明…

java+mysql crm客户关系管理系统的设计与实现

在众多网站开发技术中,JSP支持现在绝大多数操作平台,它在代码执行效率、代码可移植性及组建的应用上均优越于其他动态网页技术。因此,本文研究了基于JSP技术的系统动态网站。根据JSP的原理按照网站时机原则以及步骤,对动态网站的定义了目标、分析了网站功能需求,进行了结构…

windows 10 下安装配置mysql8.0 (保姆级教程)

文章目录 一、MySQL 8.0的基本信息二、MySQL 8.0的系统要求三、MySQL 8.0的安装步骤3.1. 下载MySQL 8.03.2. 运行MySQL安装文件3.3. 选择安装类型3.4. 配置MySQL Server3.5 mysql shell 的使用 四、总结 一、MySQL 8.0的基本信息 MySQL是一种开放源代码的关系型数据库管理系统…

2023Java高频面试题,jvm虚拟机体系结构,收藏必看!

1. 前言 最近很多小伙伴在找工作. 在面试中, 面试官经常问到的一个面试题是 : 请说出Jvm虚拟机体系结构? 小伙伴们, 一般会说堆, 栈.....然后面试官问, 那还知道其他的吗, 然后小伙伴们就语塞了....... 面试后来问千锋健哥, 所以健哥在这里为大家来讲讲这个Jvm虚拟机体系结…

【一起啃书】《机器学习》第三章 线性模型

第三章 线性模型 3.1 基本形式 给定由 d d d个属性描述的示例 x ( x 1 ; x 2 ; . . . ; x d ) {\bf{x}} ({x_1};{x_2};...;{x_d}) x(x1​;x2​;...;xd​),其中 x i x_i xi​是 x \bf{x} x在第 i i i个属性上的取值,线性模型试图学得一个通过属性的线性…

瀚高股份吕新杰:创新开源双驱动,躬耕国产数据库

作者 | 伍杏玲 近年来,国际形势不断变幻,也给人们带来巨大警示:关键核心技术是买不来、讨不来的,中国科技企业需寻找研发自强之路。 瀚高基础软件股份有限公司(简称瀚高股份)专注数据库十八年,始…

信息安全-reNgine-Web应用渗透测试的自动化网络侦察框架

目录 reNgine介绍 工具运行机制 安装部署 安装rengine 安装python依赖包 合并Django前端静态文件 安装Postgresql 创建reNgine账号 启动reNgine 启动reNgine成功 启动reNgine后在浏览器访问:http://localhost:8000/ 这时会发现前端静态资源加载失败&…

【自然语言处理】【大模型】极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码

极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码 相关博客 【自然语言处理】【大模型】极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码 【自然语言处理】【大模型】DeepMind的大模型Gopher 【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言…

Froala V4.0.18 Crack Froala 编辑器

Froala V4.0.18:复制和粘贴图像变得更好,还有更多! 2023 年 3 月 25 日最忠实用户编辑器,新版本发表评论 Froala Editor团队很高兴地宣布发布Froala Editor 4.0.18。这个新版本在质量和稳定性方面有很多改进,并修复了…

优雅的处理sping项目全局异常

全局异常处理 为了达到系统的各个模块中都能够共用同一个异常处理逻辑,避免代码重复和错误。在Spring框架中,可以通过全局异常处理来捕获应用程序中抛出的异常,并根据需要进行处理。 ControllerAdvice ControllerAdvice是Spring MVC框架中…

TCP CUBIC 动力学

曾陪经理一起面试,问过一个问题: CUBIC 的公式: W ( x ) C ( x − K ) 3 W m a x W(x)C(x−K)^3W_{max} W(x)C(x−K)3Wmax​ 其中 x 是什么意思? 本意是想候选人回答 “x 是绝对时间”,然后我会接着问 “这个 x …