HTTP2.0如何优化HTTP1.1

news2024/7/4 18:23:50

目录

HTTP1.1什么缺点

如何解决头部压缩 

静态字典

动态字典

如何解决队头阻塞

Stream

排序 

服务器主动推送资源


HTTP1.1什么缺点

队头阻塞问题

同一连接只能在完成一个 HTTP 事务(请求和响应)后,才能处理下一个事务;(对于应用层http)

HTTP 头部巨大且重复

由于 HTTP 协议是无状态的,每一个请求都得携带 HTTP 头部,特别是对于有携带 Cookie 的部,而 Cookie 的大小通常很大;
 

不支持服务器推送消息

当客户端需要获取通知时,只能通过定时器不断地拉取消息,这无疑浪费大量了带宽和服务器资源

如何解决头部压缩 

HTTP/1.1 报文中 Header 部分存在的问题:

含很多固定的字段,比如 Cookie、User Agent、Accept 等,这些字段加起来也高达几百字节甚至上千字节,所以有必要压缩


大量的请求和响应的报文里有很多字段值都是重复的,这样会使得大量带宽被这些冗余的数据占用了,所以有必须要避免重复性;


字段是 ASCII 编码的,虽然易于人类观察,但效率低,所以有必要改成二进制编码

HTTP/2开发了 HPACK 算法,HPACK 算法主要包含三个组成部分:

静态字典

动态字典

Huffman 编码(压缩算法)

静态字典

HTTP/2 为高频出现在头部的字符串和字段建立了一张静态表,它是写入到 HTTP/2 框架里的

不会变化的,静态表里共有 61 组

表中的 Index 表示索引(Key)

Header Value 表示索引对应的 Value

Header Name 表示字段的名字,比如 Index 为 2 代表 GET

Index 为 8 代表状态码 200。

动态字典

经过 Huffman 编码发送出去后,客户端和服务器双方都会更新自己的动态表添加一个新的 Index 那么在下一次发送的时候,就不用重复发这个字段的数据了,只用发 1 个字节的 Index 号就好了,因为双方都可以根据自己的动态表获取到字段的数据。

比如有新的字段不在字典中,那么双方的动态字典就会为这个字典添加一个新的 Index 

动态表生效有一个前提:必须同一个连接上,重复传输完全相同的 HTTP 头部。

问题:

1,他们的 Index如何同步的?    他们都是按顺序从静态字典的结束 62号开始 顺序生成

2,动态表越来越大怎么办?

如果占用了太多内存,是会影响服务器性能的,因此 Web 服务器都会提供类似 http2_max_requests 的配置,用于限制一个连接上能够传输的请求数量,避免动态表无限增大,请求数量到达上限后,就会关闭 HTTP/2 连接来释放内存。

Huffman 编码(压缩算法)不过多介绍,有兴趣可以自行了解

如何解决队头阻塞

队头阻塞的问题。

我们都知道 HTTP/1.1 的实现是基于请求-响应模型的。

同一个连接中,HTTP 完成一个事务才能处理下一个事务,也就是说在发出请求等待响应的过中,是没办法做其他事情的,如果响应迟迟不来,那么后续的请求是无法发送的

Stream

HTTP/2 通过 Stream 这个设计,多个 Stream 复用一条 TCP 连接,达到并发的效果,解决了 HTTP/1.1 队头阻塞的问题,提高了 HTTP 传输的吞吐量。

为了理解 HTTP/2 的并发是怎样实现的,我们先来理解 HTTP/2 中的 Stream、Message、Frame 

整体如下

1 个 TCP 连接包含一个或者多个 Stream,Stream 是 HTTP/2 并发的关键技术;

Stream里可以包含1个或多个 Message,Message对应HTTP/1中的请求或响应;

Message 里包含一条或者多个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放内容;

排序 

在 HTTP/2 连接上,不同 Stream 的帧是可以乱序发送的(因此可以并发不同的 Stream )

因为每个帧的头部会携带 Stream ID 信息,所以接收端可以通过 Stream ID 有序组装成

HTTP 消息,而同一 Stream 内部的帧必须是严格有序的。 

同一个连接中的 Stream ID 是不能复用的,只能顺序递增

所以当 Stream ID 耗尽时,需要发一个控制帧 GOAWAY,用来关闭 TCP 连接。

服务器主动推送资源

客户端和服务器双方都可以建立 Stream,因为服务端可以主动推送资源给客户端

客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号

服务器在推送资源时,会通过 PUSH_PROMISE 帧传输 HTTP 头部,

并通过帧中的 Promised Stream ID 字段告知客户端,接下来会在哪个偶数号 Stream 中发送包体。

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

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

相关文章

力扣每日一题 7/2 数学、数论、数组/双指针

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 3115.质数的最大距离【中等】 题目: 给你一个整数数组 nums。…

视频字幕提取在线工具有哪些?总结5个字幕提取工具

平时在沉浸式追剧的时候,我们常常都会被影视剧中的各种金句爆梗而逗得开怀大笑~而真正要用到时候却总是一片头脑空白。其实要记住它们最好的办法便是将其提取留档下来,每次有需要的时候打开就能一下子回顾到~ 今天就来带大家盘一盘视频字幕提取的软件好…

[C++]——同步异步日志系统(1)

同步异步日志系统 一、项⽬介绍二、开发环境三、核心技术四、环境搭建五、日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 日志系统: 日志:程序在运行过程中,用来记录程序运行状态信息。 作用&…

图片转pdf,图片转pdf在线转换,在线图片转pdf,图片转pdf格式怎么弄

在数字化时代,图片和PDF文件成为了我们日常生活中不可或缺的元素。有时候,我们需要将图片转换成PDF格式以便更好地分享、存储或打印。那么,图片格式怎么转换成PDF呢?本文将为您详细介绍简单实用的转换方法。 方法一、使用pdf转换软…

Python容器 之 字典--字典的常用操作方法

1.增加和修改 字典[键] 值 键 存在, 修改 键 不存在, 添加 # 定义非空字典, 姓名, 年龄, 身高, 性别 my_dict {"name": "小明", "age": 18, "height": 1.78, "isMen": True} print(my_dict) # {name: 小明, age: 18, h…

【知识】DGL中graph默认的稀疏矩阵格式和coo格式不对的坑

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 先给结论 源码解读 代码验证 网上没找到相关的讨论,因此只能从源码上一步步查。 先给结论 对于自己使用dgl.graph接口创建的图&am…

【HTML入门】列表与表格

文章目录 前言一、列表与表格是什么?列表表格 二、使用标签列表标签表格标签 三、组合情况列表的组合表格的组合 四、示例代码总结 好的,以下是一个关于HTML列表与表格的文章示例: 前言 随着网页开发的普及,HTML成为了构建网页的…

LVS FILTER UNUSED OPTION

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 过滤一些版图与spice网表对不上的器件。 一般后端遇不到这个问题,因为通常是需要写到网表中的decap没有写出来造成的,如下图。

来不及啦!怎样找回删除的照片,2个解决方案【安卓通用】

一不小心手滑,手机里那些珍贵的照片竟然全都被删了!现在心急如焚,怎样找回删除的照片呢?别担心,小编我这就为你带来2个快速有效的解决方案,让你在分分钟找回那些失去的照片!快来学习一下吧&…

Java语法系列 小白入门参考资料 方法

方法的概念及使用 方法概念 方法出现的原因 在编程中,某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会: 1. 使程序变得繁琐 2. 开发效率低下,做了大量重复性的工作 3. 不利于维护,需要…

自动驾驶水泥搅拌车在梁场的应用(下)

自动驾驶水泥搅拌车在梁场的应用(下) 北京渡众机器人科技有限公司的自动驾驶水泥搅拌车在梁场(也称为预制梁场)的应用可以带来多方面的优势和效益: 1. 自动化搅拌和运输 在梁场中,通常需要大量的混凝土搅…

探索大型语言模型自动评估 LLM 输出长句准确性的方法

LLM现在能够自动评估较长文本中的事实真实性 源码地址:https://github.com/google-deepmind/long-form-factuality 论文地址:https://arxiv.org/pdf/2403.18802.pdf 这篇论文是关于谷歌DeepMind的,提出了新的数据集、评估方法和衡量标准&am…

零基础学习MySQL---MySQL入门

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、什么是数据库 问:存储数据用文件就可以了,为什么还要弄个数据库呢? 这就不得不提…

收集了很久的全网好用的磁力搜索站列表分享

之前找资源的时候,收集了一波国内外大部分主流的磁力链接搜索站点。每一个站可能都有对应的优缺点,多试试,就能知道自己要哪个了。 全网好用的磁力链接 大部分的时候,我们用国内的就可以了,速度块,而且不…

Free Pascal语言基础学习:定义变量、数据类型、循环语句、case语句、条件判断、with语句、运算符

Pascal是一种结构化编程语言,而Free Pascal作为其现代编译器,不仅支持跨多种操作系统和处理器架构,还提供了高效的内存使用和函数重载等先进功能。Free Pascal继承了Pascal语言的核心特性,同时进行了扩展和优化,使其成…

操作系统真象还原:编写硬盘驱动程序

第13章-编写硬盘驱动程序 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 13.1 硬盘及分区表 13.1.1 创建从盘及获取安装的磁盘数 要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 hd60M.img,但它只…

理解MySQL存储引擎:掌握数据存储与管理

在工作或学习过程中,作为一名数据库管理员或开发者,我们常常需处理大量数据,同时确保数据的可靠性与高效性。MySQL作为最受欢迎的开源数据库之一,其强大的性能和灵活性广为人知。而在MySQL背后的存储引擎则起到了至关重要的作用。…

深度学习项目GPU开发环境安装

注安装环境:ubuntu22.04, cuda 11.7, cudnn8.9 1.安装nvidia驱动 看可安装的Nvidia驱动版本:执行 ubuntu-drivers devices 安装合适版本的Nvidia驱动: sudo apt-get install nvidia-driver-515 注意:合适的版本需要尝试&#x…

【区块链+基础设施】银联云区块链服务 | FISCO BCOS应用案例

为了顺应区块链基础设施化的发展趋势,中国银联推出了银联云区块链服务——UPBaaS,为金融行业采用区块链 技术提出了解决方案,微众银行为平台提供 FISCO BCOS 区块链开源技术支持。通过银联云区块链服务,用户可 以用可视化的方式创…

ERROR: No matching distribution found for torch==2.0.1+cu117(比手动下载方便)

ERROR: No matching distribution found for torch2.0.1cu117 遇见这种报错可以把pip install -r requirements.txt修改为 pip install -r requirements.tx --extra-index-url https://download.pytorch.org/whl/cu117 -i https://pypi.tuna.tsinghua.edu.cn/simple或者直接…