HTTP / 2

序言

 在之前的文章中我们介绍过了 HTTP/1.1 协议,现在再来认识一下迭代版本 2。了解比起 1.1 版本,后面的版本改进在哪里,特点在哪里?话不多说,开始吧⭐️!


一、 HTTP / 1.1 存在的问题

 很多时候新的版本的产生都是需要解决老的版本存在的问题,HTTP / 1.1 存在的问题如下:

头部字段过大且重复
 如果大家抓过包的话,就很能直观的感受这句话。HTTP / 1.1 的头部携带着数据量在有时候会很大,特别是 CookiesUser-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 使用了 HPACKHEAD PACK 把头打包)的方式来压缩头部信息:

  1. 静态表(Static Table):
  • HPACK 使用一个静态表来存储常见的 HTTP 头部字段及其值(总共 61 条)。静态表的内容是固定的,所有 HTTP/2 实现都共享这一表:
    在这里插入图片描述
  • 可以发现每一个字段都对应了一个 index,在压缩时,HPACK 会使用这个索引值来代替字段名,从而减少传输的字节数,效率是很客观的
  1. 动态表(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://www.mzph.cn/pingmian/67633.shtml

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

相关文章

BUUCTF_Web(October 2019 Twice SQL injection)

October 2019 Twice SQL injection 知识点: 二次注入: 当用户提交的恶意数据被存入数据库后,应用程序再把它读取出来用于生成新的SQL语句时,如果没有相应的安全措施,是有可能发生SQL注入的,这种注入就叫…

电商项目高级篇08-springCache

电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点&#xff0c;一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的&#xff0c;所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接&#xff01; sudo apt update sudo apt in…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()

目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget&#xff08;一般情况下默认会自带&#xff09; 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…

IO多路复用详解-selectpollepoll

目录 1.IO多路复用概念 2.系统调用函数 2.1select 2.1.1select函数细节 2.2基于select实现并发处理 2.2.1处理流程 2.2.2服务端通信代码 2.2.3客户端通信代码 2.3基于poll函数实现并发处理 2.3.1select与poll函数区别 2.3.2poll函数 2.3.3服务器端代码实现 2.3.4客…

IDEA下载安装

目录 IDEAWin下载安装 Mac下载安装 IDEA中基本配置&注释修改背景主题为白色修改字体大小鼠标滚轮控制字体大小控制字母大小写提示&#xff08;取消勾选&#xff09;设置自动编译&#xff08;打勾&#xff09;自动保存&#xff08;参数为1&#xff09;设定参数提示&#xff…

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集

前面两篇已经交代AI和AENC模块的配置&#xff0c;这篇就让这两个模块绑定起来&#xff0c;绑定的原因是&#xff0c;Aenc从Ai模块拿到采集的原始数据进行编码。 使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定&#xff0c;其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32C…

2.5G PoE交换机 TL-SE2109P 简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK&#xff08;普联&#xff09;的万兆上联的2.5G网管交换机TL-SE2109P简单开箱测评。8个PoE 2.5G电口&#xff0c;1个万兆SFP上联口。 2.5G交换机 TL-SE2420 简单开箱评测&#xff0c;16个2.5G电口4个10G光口(SFP)&#xff1a;https://blog.zeruns.com/archives/837.html…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…

GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 GCPAAS/DashBoard&#xff0c;一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理…

登录校验Cookie、Session、JWT

目录 基础知识&#xff1a;登录校验的场景 基础知识&#xff1a;会话 ​编辑方案一&#xff1a;Cookie 方案二&#xff1a;Session 方案三&#xff1a;令牌技术 JWT 令牌 基础知识&#xff1a;登录校验的场景 基础知识&#xff1a;会话 什么是会话&#xff1f;什么是会话跟…

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

ABP - 缓存模块(1)

ABP - 缓存模块&#xff08;1&#xff09; 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching &#xff0c;而对于分布式缓存…

浅谈云计算22 | Kubernetes容器编排引擎

Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…

如何在linux系统上完成定时开机和更新github端口的任务

任务背景 1.即使打开代理&#xff0c;有的时候github去clone比较大的文件时也会出问题。这时需要每小时更新一次github的host端口&#xff1b; 2.马上要放假&#xff0c;想远程登录在学校的台式电脑&#xff0c;但学校内网又不太好穿透。退而求其次&#xff0c;选择定时启动电…

vector迭代器的使用以及迭代器失效

一、iterator的使用注意 begin与end 遵循左闭右开的原则&#xff0c;begin 指向vector的第一个元素&#xff0c;end 指向vector的最后一个元素的往下一个位置。 rbegin 与 rend rbegin指向最后一个元素的位置&#xff0c;rend指向第一个元素的往前一个位置。 二、vector的常…