HTTP / 2
序言
在之前的文章中我们介绍过了 HTTP/1.1 协议,现在再来认识一下迭代版本 2。了解比起 1.1 版本,后面的版本改进在哪里,特点在哪里?话不多说,开始吧⭐️!
一、 HTTP / 1.1 存在的问题
很多时候新的版本的产生都是需要解决老的版本存在的问题,HTTP / 1.1 存在的问题如下:
头部字段过大且重复
如果大家抓过包的话,就很能直观的感受这句话。HTTP / 1.1 的头部携带着数据量在有时候会很大,特别是 Cookies
和 User-Agent
的体量,让大家直观感受一下:
Cookie:
Hm_lvt_ab984c6961d35319708c19c75e093eee=1737127750; Hm_lpvt_ab984c6961d35319708c19c75e093eee=1737127750; HMACCOUNT=8DE7CD8295FF210E; UM_distinctid=19474e1e9808f-0fac1ea52408b5-4c657b58-190140-19474e1e9811325
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
因为 HTTP 是无状态的,所以说每次传输数据的时候都需要带上,这就会造成报文体量的增加。
响应队头阻塞
HTTP / 1.1 为了提升速度,支持同时发送多个请求。但是不管你同时发多少请求,我都会优先处理先到达的,只有第一个请求响应处理完成之后才回去处理之后的请求。这样的话,如果第一个请求的数据特别大,那好,你后面的人全给我等着,这就是队头阻塞。
在这里列举一个餐馆的例子(来自于知乎,特别形象,理解这个就很好理解 HTTP 2 的并发是咋回事):一个餐厅同时可以容纳多个客人(请求),但是餐厅每次会将先来客人的菜上齐了才会取准备下一桌,如果前面一桌的才特别多,那后面的人只有干等着。
被动传输数据
在 HTTP / 1.1 中 只有客户端向服务器请求数据,服务器不能向客户端主动推送数据。如果一个页面需要渲染的内容很多,需要请求较多数据,只能客户端主动请求,服务器不能主动的推送。
二、 HTTP / 2 的新特性
1. 二进制格式传输数据
在 HTTP / 1.1 的协议是使用文本的格式传输数据,但在 HTTP / 2 采用了二进制的格式传输数据,这样提高了 数据处理效率 以及 数据传输效率。
数据处理效率,我们的机器本身只能识别并运算二进制的数据,使用文本传输的话还需要对数据进行解析机器才能够直接使用,但是使用二进制传输就省去了这一过程。
数据传输效率,就拿一个整数 123456
示例:
- 在文本中,需要使用
6
个字节表示 - 在二进制中,一个整数类型只需要
4
字节
这不就节约了传输成本,增加了传输效率吗。
在 HTTP / 1.1 中,我们的一个请求对应一个请求报文,一个响应对应一个响应报文,这是在应用层传输的基本单位。但是 HTTP / 2 的话就不一样了,传输的基本单位是一个 帧 (大小默认是 16 KB),当我们数据太大时会被分为多个帧。
2. 头部压缩(HPACK)
在 HTTP / 1.1 中,每个 HTTP 请求和响应都会携带头部数据,而这些头部数据大多数情况下是重复的。例如,许多请求和响应都会重复包含相同的字段,如 User-Agent、Host、Accept-Encoding 等。
HTTP / 2 使用了 HPACK (HEAD PACK 把头打包
)的方式来压缩头部信息:
- 静态表(Static Table):
- HPACK 使用一个静态表来存储常见的 HTTP 头部字段及其值(总共 61 条)。静态表的内容是固定的,所有 HTTP/2 实现都共享这一表:
- 可以发现每一个字段都对应了一个
index
,在压缩时,HPACK 会使用这个索引值来代替字段名,从而减少传输的字节数,效率是很客观的
- 动态表(Dynamic Table):
- 动态表用来存储当前连接中未出现在静态表的头部字段信息
- 当该新的头部字段发送时会记录下来,当下一次使用到时就可以使用索引
3. 服务器推送(Server Push)
是的,服务器也能主动的给我们的客户端推送数据了。就比如下面的场景,当浏览器请求一个 HTML 页面时,也许这个页面还需要各种图片,css等数据。原来只能浏览器主动的请求,服务器才会被动的给我们。现在的话,服务器知道我们还缺什么,直接主动的推送给我们。
这样的话减少了客户端请求的次数,提升了页面渲染的效率。
4. 并发传输数据(多路复用)
最重要的特性来啦!但是在开始之前,我想先给大家接着列举餐馆的例子。让大家粗俗的目标他的大致原理,这样也许就更能好好的理解。
HTTP / 2 开的餐馆,也可以同时接纳许多客人,但是为了照顾每一位客人的感受,避免等待太多的时间。他选择了交替的给每一桌上菜,这样后来的客人不要等着前面的吃完了才轮着他。
首先我们先理解 HTTP / 2 中新增的 stream 流 的概念,流使得同一个连接可以同时并行处理多个请求和响应,而不必等待某个请求的处理完成才能开始下一个请求。
一个流当中可以传输多个信息,一个信息由一个或多个帧组成,所以一个流中包含了多个帧。我们现在来看图说话:
这是 HTTP / 1.1,熟悉的队头阻塞。现在来看看 HTTP / 2,是如何解决的:
不同的流可以交替的发送数据,因为每一个帧都会携带 stream 的 id,所以到客户端之后数据会组装成一个完整的 stream。
三、HTTP / 2 不足之处
1. TCP 队头阻塞问题
咦?HTTP / 2不是有效的解决了队头阻塞问题吗?是的,但是他解决的是响应队头阻塞问题,但是我这里说的是 TCP 队头阻塞,比如:
TCP 协议,如果前面的数据丢了,后面的数据即使到了也需要等待前面的数据就绪。对于上层来说拿不到数据,不久阻塞了吗?所以说不管你上层怎么设计也离不开下层的坎儿。
HTTP / 3 会采用 UDP 传输数据,就算是数据丢了也不会阻塞。但是回依靠其他技术实现可靠性。
2. 连接建立时间消耗
HTTP/2 依然基于 TCP 进行连接建立,而 TCP 连接的建立过程需要经过三次握手。尽管 HTTP/2 允许在一个连接中复用多个请求,但每次新连接的建立仍然需要一定的时间。
在客户端和服务器之间建立新连接时,由于需要执行三次握手过程,连接建立的延迟可能会影响 Web 页面的加载速度,尤其在需要频繁建立连接的场景中。
相关文章:

HTTP / 2
序言 在之前的文章中我们介绍过了 HTTP/1.1 协议,现在再来认识一下迭代版本 2。了解比起 1.1 版本,后面的版本改进在哪里,特点在哪里?话不多说,开始吧⭐️! 一、 HTTP / 1.1 存在的问题 很多时候新的版本的…...
【深度学习】利用Java DL4J 训练金融投资组合模型
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…...
跨域cookie携带问题总结
背景 我们知道很多场景,都需要前端请求带上cookie,例如用户鉴权、登陆校验等。而有些场景下,我们会发现请求不会带上cookie,这是为什么呢? 概念 cookie是种在域名下的信息。只有请求同域且同站的请求,才…...

Pytorch使用教程(12)-如何进行并行训练?
在使用GPU训练大模型时,往往会面临单卡显存不足的情况。这时,通过多卡并行的形式来扩大显存是一个有效的解决方案。PyTorch主要提供了两个类来实现多卡并行:数据并行torch.nn.DataParallel(DP)和模型并行torch.nn.Dist…...

指针之旅:从基础到进阶的全面讲解
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…...

FPGA与ASIC:深度解析与职业选择
IC(集成电路)行业涵盖广泛,涉及数字、模拟等不同研究方向,以及设计、制造、封测等不同产业环节。其中,FPGA(现场可编程门阵列)和ASIC(专用集成电路)是两种重要的芯片类型…...
PostgreSQL 中进行数据导入和导出
在数据库管理中,数据的导入和导出是非常常见的操作。特别是在 PostgreSQL 中,提供了多种工具和方法来实现数据的有效管理。无论是备份数据,还是将数据迁移到其他数据库,或是进行数据分析,掌握数据导入和导出的技巧都是…...
SDL2基本的绘制流程与步骤
SDL2(Simple DirectMedia Layer 2)是一个跨平台的多媒体库,它为游戏开发和图形应用提供了一个简单的接口,允许程序直接访问音频、键盘、鼠标、硬件加速的渲染等功能。在 SDL2 中,屏幕绘制的流程通常涉及到窗口的创建、渲染目标的设置、图像的绘制、事件的处理等几个步骤。…...
面试-业务逻辑2
应用 给定2个数组a、b,若a[i] b[j],则记(i,j)为一个二元数组,求具体的二元数组及其个数。 实现 a input("请输入数组a的元素个数:") # print(a) a_list list(map(int, input("请输入数组a的元素,…...

HTML之拜年/跨年APP(改进版)
目录: 一:目录 二:效果 三:页面分析/开发逻辑 1.页面详细分析: 2.开发逻辑: 四:完整代码(不多废话) index.html部分 app.json部分 二:效果 三:页面…...
嵌入式硬件篇---ADC模拟-数字转换
文章目录 前言第一部分:STM32 ADC的主要特点1.分辨率2.多通道3.转换模式4.转换速度5.触发源6.数据对齐7.温度传感器和Vrefint通道 第二部分:STM32 ADC的工作流程:1.配置ADC2.启动ADC转换 第三部分:ADC转化1.抽样2.量化3.编码 第四…...

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式
打开 HBuilderX,点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件: 参考地址:Chrome插件 - B站下载助手(轻松下载bilibili哔哩哔哩视频)…...
Access数据库教案(Excel+VBA+Access数据库SQL Server编程)
文章目录: 一:Access基础知识 1.前言 1.1 基本流程 1.2 基本概念?? 2.使用步骤方法 2.1 表【设计】 2.1.1 表的理论基础 2.1.2 Access建库建表? 2.1.3 表的基本操作 2.2 SQL语句代码【设计】 2.3 窗体【交互】? 2.3.1 多方式创建窗体 2.3.2 窗体常用的控件 …...
09、PT工具用法
目录 1、PT工具原理 2、在线修改表结构 3、使用pt-query-diges分析慢查询 4、使用pt-kill来kill掉一些垃圾SQL 5、pt-table-checksum进行主从一致性排查和修复 6、pt-archiver进行数据归档 7、其他一些pt工具 1、PT工具原理 创建一张与原始表结构相同的临时表 然后对临时…...
华为OD机试E卷 --矩形相交的面积--24年OD统一考试(Java JS Python C C++)
文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码题目描述 给出3组点坐标(x, y, w, h),-1000<x,y<1000,w,h为正整数。 (x,y, w, h)表示平面直角坐标系中的一个矩形:x, y为矩形左上角坐标点,w, h向右w,向下h。(X, y, w, h)表示x轴…...
C++ 内存分配和管理(八股总结)
C是如何做内存管理的(有哪些内存区域)? (1)堆,使用malloc、free动态分配和释放空间,能分配较大的内存; (2)栈,为函数的局部变量分配内存,能分配…...
如何使用 JSONP 实现跨域请求?
以下是使用 JSONP 实现跨域请求的步骤: 实现步骤: 1. 客户端设置 在客户端,你需要创建一个 <script> 标签,并将其 src 属性设置为跨域请求的 URL,并添加一个 callback 参数。这个 callback 参数将包含一个函数…...

【机器学习实战入门】基于深度学习的乳腺癌分类
什么是深度学习? 作为对机器学习的一种深入方法,深度学习受到了人类大脑和其生物神经网络的启发。它包括深层神经网络、递归神经网络、卷积神经网络和深度信念网络等架构,这些架构由多层组成,数据必须通过这些层才能最终产生输出。…...

Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配
文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…...

Kafka 日志存储 — 日志索引
每个日志分段文件对应两个索引文件:偏移量索引文件用来建立消息偏移量到物理地址之间的映射;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...