HTTP2协议介绍
前言
HTTP是现代互联网通信的基础协议之一,早在1991年,HTTP/0.9版本就诞生了,之后又陆续发布了HTTP/1.0和HTTP/1.1,为互联网应用提供了更高效和可靠的通信方式。
随着时间的推移,互联网的规模和复杂性不断扩大,HTTP/1.1的一些限制也逐渐显现出来,例如串行的请求-响应机制、头部冗余和响应阻塞等。这些问题影响了网页加载速度、性能和用户体验。
为了克服这些挑战并引领下一代Web协议的发展,HTTP2在2015年正式发布。
HTTP2
在HTTP2出现之前,HTTP一直都是一个基于文本的协议,这种协议足够简单、对人类而言具备良好的可读性,但是对于计算机而言,处理的效率就不高了。所以HTTP2在数据传输上做了大刀阔斧的改动,从一个文本协议升级为二进制协议,且带来了很多新特性。
多路复用
多路复用功能是HTTP2最重要的特性之一,它彻底改变了HTTP/1.1中的串行请求-响应模型,允许多个请求和响应同时在一个TCP连接上进行交互。
在HTTP/1.1中,一个TCP连接上同时只能有一个请求-响应,整体是串行的,尽管连接可以复用,但是如果有任何一个请求因为处理过慢或网络原因发生阻塞,就会导致队头阻塞(Head-of-line blocking或缩写为HOL),后续请求除了干等什么也做不了,TCP连接没有得到有效的利用。
为了解决这个问题,HTTP2针对每一个物理连接可以同时打开多个流Stream,消息都是基于Stream去发送的。这使得在同一个TCP连接上,可以并发进行请求-响应,资源得到更有效的利用。
Stream
Stream是逻辑上的概念,一个TCP连接上可以同时打开多个Stream,大多数Web服务的默认配置是可以同时打开100/128个Stream。
每个Stream都有一个唯一的标识符StreamID,用于区分不同的Stream。Stream的开启可以由客户端发起,也可以由服务端开启,为了StreamID不发生冲突,客户端使用奇数递增的方式,服务端使用偶数递增的方式。0号Stream比较特殊,它用来对整个TCP连接进行设置。
每个流都是独立的,有自己的流控设置,包括流的优先级、流的权重等。通过设置流的优先级,可以确保服务器在处理多个流时能够优先处理重要的请求,提高了资源的利用效率。
流量控制
HTTP1.x时代,一个连接上同时只能处理一个请求-响应,流量控制直接依赖于底层TCP协议即可,当一方缓冲区满时就会开始丢包,另一方则会停止发送数据,等待有更大的窗口再继续发送。
对于HTTP2来说,因为有多路复用,TCP的流控就显得不够用了,所以HTTP2有了自己的更精细化的流量控制。
HTTP2的流控采用滑动窗口的设计,连接建立后,双方发送的第一个Frame一定是SETTINGS
Frame,用于对连接进行配置,其中一个属性SETTINGS_INITIAL_WINDOW_SIZE
用于设置初试窗口大小,默认是65535字节。发送方每次发送数据都会减小窗口大小,当窗口为0时发送方必须停止发送数据,等待对方发送WINDOW_UPDATE
Frame调整窗口大小后才能继续发送。
除此之外,还有流优先级控制。每个流都可以分配一个优先级,用于指示请求的重要性。优先级通过整数表示,数值越小表示优先级越高。接收方可以根据优先级来调度处理请求,优先级较高的请求将被优先处理。
通过流量控制机制,HTTP2 能够更好地适应不同网络环境和处理能力,提高传输效率和用户体验。它可以防止发送方过度发送数据导致接收方不堪重负,同时也可以确保优先处理重要请求,提高整体性能。
Frame
HTTP2在消息结构上并没有做太大的改动,对于请求/响应来说,依然有头部和消息体,只是在数据的传输上,HTTP2采用了消息分帧发送的方式。
Frame(帧)是HTTP2通信的最小单位,HTTP2定义了种不同类型的Frame,每个类型都有特定的用途和结构。
Frame类型 | 描述 |
---|---|
DATA | 传输实际的数据 |
HEADERS | 传输请求或响应的头部信息 |
PRIORITY | 指定请求的优先级 |
RST_STREAM | 取消或重置一个流 |
SETTINGS | 协商连接参数 |
PUSH_PROMISE | 服务器主动推送资源给客户端 |
GOAWAY | 告知对端连接即将关闭 |
WINDOW_UPDATE | 更新流或连接的窗口大小 |
CONTINUATION | 继续发送大型首部块,用于超过单个HEADERS帧大小限制的情况 |
Frame的通用结构如下:
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...|
+---------------------------------------------------------------+
字段 | 长度(位) | 描述 |
---|---|---|
Length | 24 | Frame有效载荷的长度(不包括Frame头的9个字节) |
Type | 8 | Frame的类型 |
Flags | 8 | 携带关于Frame的额外信息和控制选项 |
Reserved Bit | 1 | 保留位,未使用 |
Stream Identifier | 31 | 与Frame相关联的HTTP/2流的标识符(唯一标识一个流) |
Payload | 可变 | 根据Frame类型和长度不同,携带不同的信息 |
为了传输不同的数据,HTTP2定义了不同类型的Frame,不同类型的Frame职责明确,结构清晰,相较于HTTP/1.1使用换行符来区分头部和消息体,Frame显得更加高效且不容易出错。
头部压缩
HTTP/1.1协议中只有消息体支持压缩,头部是不支持压缩的。但现实情况是,对于每一次请求,头部信息有大量重复的数据,例如:Host、Accept、User-Agent等,这些数据几乎每次请求都不会变,但是每次都需要传输给对方,如果能将这些数据压缩传输,可以进一步提高协议的效率。
在HTTP2中,头部终于也支持压缩了,HTTP2中使用的头部压缩算法称为HPACK。HPACK使用了两个重要的机制来减小头部信息的大小:首先,它使用了静态表和动态表来存储常见的头部字段,这些字段只需发送一次,并在整个会话中重复使用;其次,HPACK使用基于差异编码的技术,将头部字段与之前发送的字段进行比较,并只发送增量部分。
静态表是在HTTP/2规范中定义的一个固定的头部字段集合,包含了常见的HTTP头部字段,例如"content-type"、"content-length"等。使用静态表时,只需发送静态表中字段的索引号,而不需要发送完整的字段名称和值。
动态表是根据实际请求和响应中出现的头部字段动态生成的,并在整个会话中进行维护。每当遇到一个新的头部字段时,会将其添加到动态表中,并为其分配一个索引号。当再次遇到相同的头部字段时,只需发送该字段的索引号和增量部分。
头部压缩不仅减小了请求和响应的大小,还显著降低了网络传输延迟和带宽消耗。同时,由于头部压缩是在传输层进行的,应用层的逻辑不需要任何更改,开发人员可以相对轻松地迁移到HTTP2协议。
服务端推送
在HTTP/1.1协议中,请求只能由客户端发起,服务端负责响应请求,服务端没法主动推送资源给客户端。HTTP2开始支持服务端推送了。
服务端推送 允许服务器在客户端请求之前将额外的资源主动推送给客户端。这意味着服务器可以预测客户端可能需要的资源并主动发送,而无需等待客户端显式请求。
例如:浏览器请求首页HTML,首页会额外依赖其它的CSS/JS等资源,此时服务端就可以直接推送这些额外的资源,浏览器下次请求时就可以直接从缓存里获取到了,减少了往返时间,提高页面的加载速度。
遗憾的是:目前主流网站对服务端推送的支持并不好,原因是很难精准的提前预测客户端要请求的资源,如果推送了客户端不需要的资源,反而是个负担。
常用的Frame
Frame是HTTP2通信的最小单位,HTTP2定义了种不同类型的Frame,这里介绍几个常见的Frame。
SETTINGS
SETTINGS Frame是客户端和服务端必须发送的第一个Frame。
TCP连接建立完毕后,双方会发送SETTINGS Frame来对连接进行配置。SETTINGS Frame结构如下:
SETTINGS Frame {Length (24),Type (8) = 0x04,Unused Flags (7),ACK Flag (1),Reserved (1),Stream Identifier (31) = 0,Setting (48) ...,
}Setting {Identifier (16),Value (32),
}
前64Bit是通用结构,Payload部分是若干个键值对。一个键值对由48Bit构成,前16Bit是Key,后32Bit是Value。
ID | 标志位 | 默认值 | 说明 |
---|---|---|---|
SETTINGS_HEADER_TABLE_SIZE | 0x1 | 4,096 | 请求头表最大大小, |
和HPACK压缩有关 | |||
SETTINGS_ENABLE_PUSH | 0x2 | 1 | 是否允许推送 |
SETTINGS_MAX_CONCURRENT_STREAMS | 0x3 | - | 允许的最大并发流数 |
SETTINGS_INITIAL_WINDOW_SIZE | 0x4 | 65,535 | 初始窗口大小 |
SETTINGS_MAX_FRAME_SIZE | 0x5 | 16,384 | 最大Frame大小 |
SETTINGS_MAX_HEADER_LIST_SIZE | 0x6 | - | 头列表的最大大小 |
HEADERS
SETTINGS Frame发送完,连接就配置好了。接下来,就可以发起请求了。
HTTP请求从一个HEADERS Frame开始。HEADERS Frame结构如下:
HEADERS Frame {Length (24),Type (8) = 0x01,Unused Flags (2),PRIORITY Flag (1),Unused Flag (1),PADDED Flag (1),END_HEADERS Flag (1),Unused Flag (1),END_STREAM Flag (1),Reserved (1),Stream Identifier (31),[Pad Length (8)],[Exclusive (1)],[Stream Dependency (31)],[Weight (8)],Field Block Fragment (..),Padding (..2040),
}
PADDED
Flag用来设置是否有填充数据,Pad Length
代表填充数据长度,Padding
是填充数据,全都是0。填充数据没有任何含义,只是出于安全考虑,用来隐藏真实的消息长度。PRIORITY
Flag用来设置资源请求的优先级。END_HEADERS
Flag用来设置当前Frame包含请求的所有头部,后续没有CONTINUATION Frame了。END_STREAM
Flag用来结束流,代表后续没有DATA Frame了。
Tips:如果头部非常大,一个Frame塞不下,HEADERS Frame后面会紧跟一个CONTINUATION Frame,而不是多个HEADERS Frame,这点要注意。
Field Block Fragment
部分解码后就是我们常见HTTP头部,如下示例:
:method: GET
:path: /
:scheme: https
:authority: www.taobao.com
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/1.45.1
DATA
在HTTP1协议中,头部和消息体是通过换行符来区分的,到了HTTP2是通过Frame类型区分的。
一般情况下,HEADERS Frame后面跟着的就是DATA Frame了,它用来发送消息体,结构如下:
DATA Frame {Length (24),Type (8) = 0x00,Unused Flags (4),PADDED Flag (1),Unused Flags (2),END_STREAM Flag (1),Reserved (1),Stream Identifier (31),[Pad Length (8)],Data (..),Padding (..2040),
}
DATA Frame极其简单,只有真实数据和填充数据。因为是二进制的,所以你可以用DATA Frame来传输任何格式的数据,可以是HTML、图片、视频、音频等等。
PADDED
Flag:是否包含填充数据。END_STREAM
Flag:流结束,当前Frame是最后一个。
关于其它Frame的定义请参考:https://httpwg.org/specs/rfc9113.html#FrameTypes
相关文章:
HTTP2协议介绍
前言 HTTP是现代互联网通信的基础协议之一,早在1991年,HTTP/0.9版本就诞生了,之后又陆续发布了HTTP/1.0和HTTP/1.1,为互联网应用提供了更高效和可靠的通信方式。 随着时间的推移,互联网的规模和复杂性不断扩大&#x…...
矩阵的转置
题目: 给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]]class Solution(object):def transpose(self, matrix):"&q…...
web集群学习:nginx+keepalived实现负载均衡高可用性
目录 项目架构 一,环境介绍 二,项目部署 在Web服务器上配置Web测试页面 nginx负载均衡配置 配置Nginx_Master 通过vrrp_script实现对集群资源的监控(1>通过killall命令探测服务运行状态) 通过vrrp_script实现对集群资源…...

MFC第二十九天 CView类的分支(以及其派生类的功能)、MFC六大关键技术
文章目录 CView类的分支CEditViewCHtmlViewMainFrm.h CMainFrame 类的接口CMainView .h CListCtrl与CListView的创建原理 CTreeViewCTreeCtrl类简介CTreeCtrl类的原理以及常用功能 MFC六大关键技术视图和带分割栏的框架开发与消息路由CLeftView.cppCRightView.hCRightView.cppC…...
SpringBoot复习:(37)自定义ErrorController
所有接口统一返回的数据格式 package cn.edu.tju.domain;public class MyResponse {private int code;private String message;private String exception;private String stack;public int getCode() {return code;}public void setCode(int code) {this.code code;}public S…...
Linux学习之防火墙概述
防火墙分类: 软件防火墙:常用于数据包的过滤,比如限制某些ip或者端口,进行某些数据的转发或者传送 硬件防火墙:防御地域攻击 软件防火墙的分类: 包过滤防火墙:控制比较宽泛,防御效果…...

JS_围绕圆形滑动
需求:滑动手势最大不能超过一个半径为50的圆形,超出围绕圆形边线滑动 这里只提供一个思路,下面代码可以运行,但是要使用需要改成自己的参数 <div style"width: 100%;height: 100vh;display: flex;justify-content: cente…...
Ubuntu上安装RabbitMQ
在Ubuntu上安装RabbitMQ并设置管理员用户为"admin",密码为"123456",并开启开机自启 更新系统软件包列表。在终端中执行以下命令: sudo apt update安装RabbitMQ服务器软件包。运行以下命令: sudo apt insta…...

统计学和机器学习之间的联系和区别
一、说明 老实说,我厌倦了几乎每天都在社交媒体和我的大学里听到这场辩论。通常,这伴随着一些模糊的陈述来解释这个问题。双方都为此感到内疚。我希望在本文结束时,您将对这些有些模糊的术语有更明智的立场。 二、论点 与普遍的看法相反&…...
linux中profile.d和profile的区别
profile.d在profile中加载 profile文件 PATH"/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/scripts:/soc/bin:/soc/scripts" LD_LIBRARY_PATH"/usr/local/lib:/usr/lib:/opt/lib:/soc/lib" export SSL_LDPATH/usr/local/lib/ export ZLIB_LDPATH/usr/lo…...
MobaXterm sftp 不能拖拽文件夹了?
原因是我把mobaxterm设置成Windows管理员权限运行了,结果就不能拖动文件。把管理员权限去掉就恢复正常了。 原因是我把mobaxterm设置成Windows管理员权限运行了,结果就不能拖动文件。把管理员权限去掉就恢复正常了。 原因是我把mobaxterm设置成Windows管理员权限运行了,结果就不…...
【ArcGIS Pro二次开发】(59):Editing(编辑)模块
ArcGIS Pro SDK中的"Editing"(编辑)模块提供了一系列API和工具,允许开发人员在ArcGIS Pro中实现各种地图数据编辑操作,从简单的要素绘制到复杂的数据集编辑。 下面列举一些常用编辑工具的实现方法。 1、获取所选要素的…...

WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链接,但…...

5.1 web浏览安全
数据参考:CISP官方 目录 Web应用基础浏览器所面临的安全威胁养成良好的Web浏览安全意识如何安全使用浏览器 一、Web应用基础 1、Web应用的基本概念 Web ( World wide Web) 也称为万维网 脱离单机Web应用在互联网上占据了及其重要的地位Web应用的发展…...
(六)Unity开发Vision Pro——词汇表
1.PolySpatial Core (com.unity.polyspatial):基础 PolySpatial 包,初始化和所有设置从这里开始。它执行更改跟踪和处理、序列化/反序列化,并包括 ShaderGraph 到 MaterialX 转换器 2.PolySpatial XR (com.unity.polyspatial.xr):…...

算法随笔:图论问题之割点割边
割点 定义 割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例: 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。…...

【虚幻引擎】UE5数字人的创建
安装插件 在插件里面找到MetaHuman,设置激活,然后重启引擎 找到bridge,并开启,这个需要我们制作完成的metahuman需要在这个插件里下载,unreal5自动安装 创建metahuman 首先添加一个metahuman本体,如果你的插…...

算法:深度优先遍历
文章目录 什么是深搜典型题目积累 本篇主要积累的是深度优先遍历算法 什么是深搜 深度优先搜索英文缩写为 DFS 即Depth First Search 其过程是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次 简单来说就是: 一路走到头,不撞墙…...

Stable Diffusion + Deform制作指南
1.安装sd以及deform插件,更新后记得重启 需要安装ffmpeg https://ffmpeg.org/download.html 选择对应版本然后安装 如果是windows需要解压后将ffmpeg的bin目录配置在电脑的环境变量里面。 2.准备一张初始开始图片 3.填写参数,这里面参数要注意,宽高一定是32的倍数。如果填写…...

ssm+vue网上花店设计源码和论文
ssmvue网上花店设计源码和论文017 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...