HTTP/2 协议(帧、消息、流简单的抓包分析)

简介: HTTP/2 协议(帧、消息、流简单的抓包分析)

这篇文章通过 Wireshark 抓包工具逐步分析 HTTP/2 协议中 帧(frame)消息(message)流(stream) 三者之间的关系,加深对 HTTP/2 协议的理解。

1.HTTP/2 核心概念

  • 连接 Connection1TCP 连接,包含一个或者多个 Stream
  • 数据流 Stream:一个双向通讯数据流,包含 1 条或者多条 Message
  • 消息 Message:对应 HTTP/1 中的请求或者响应,包含一条或者多条 Frame
  • 数据帧 Frame:最小单位,以二进制压缩格式存放 HTTP/1 中的内容。

2.帧(frame)、流(stream)、消息(message)示意图

Tips:图中 Stream 表示多个数据流,它们可以源源不断地并发传送,同一个 Stream 流中的 frame 数据是串行发送的。

3.帧头部(9字节)示意图

4.标准帧数据示意图

5.Stream ID 的作用

5.1 实现多路复用

  • 接收端的实现可据此并发组装消息
  • 同一 Stream 内的 frame 必须是有序的(同一 Stream 内的 frame 是串行的)
  • SETTINGS_MAX_CONCURRENT_STREAMS 控制着并发 Stream

5.2 同一组 Stream 流数据示意图

下面展示的是同一组 Stream ID 值为 3HEADERS 帧数据:

5.3 推送依赖性

  • 由客户端建立的 Stream ID 必须是奇数。
  • 由服务端建立的 Stream ID 必须是偶数(如服务端主动向客户端推送消息)。

Tips:Stream ID0 的流仅用于传输控制帧。

5.4 流状态约束

  • 新建立的 Stream ID 必须大于曾经建立过的状态为 openedreservedStream ID
  • 在新建立的流上发送帧时,意味着将更小 ID 且为 idle 状态的 Stream 设置为 Closed 状态。
  • Stream ID 不能复用,长连接耗尽 ID 应创建新连接。

6.帧类型

帧类型 类型编码 含义
DATA 0x0 传递 HTTP 包体
HEADERS 0x1 传递 HTTP 头部
PRIORITY 0x2 指定 Stream 流的优先级
RST_STREAM 0x3 终止 Stream 流
SETTINGS 0x4 修改连接或者 Stream 流的配置
PUSH_PROMISE 0x5 服务端推送资源时描述请求的帧
PING 0x6 心跳检测,兼具计算 RTT 往返时间的功能
GOAWAY 0x7 优雅的终止连接或者通知错误
WINDOW UPDATE 0x8 实现流量控制
CONTINUATION 0x9 传递较大 HTTP 头部时的持续帧

Tips:心跳往返都是 PINGWebSocket 中往返心跳对应 PINGPONG

7.SETTINGS 帧抓包分析

7.1 SETTINGS 帧类型

SETTINGS 帧类型 含义
SETTINGS_HEADERS_TABLE_SIZE(0x1) 通知对端索引表的最大尺寸(单位字节,初始 4096 字节)
SETTINGS_ENABLE_PUSH(0x2) Value 设置为 0 时可禁用服务器推送功能, 1 表示启用
SETTINGS_MAX_CONCURRENT_STREAMS(0x3) 告诉接收端允许的最大并发 Stream 数量
SETTINGS_INITIAL_WINDOW_SIZE(0x4) 声明发送端的窗口大小,用于 Stream 级别流控,初始值 2^16-1,即 65535字节
SETTINGS_MAX_FRAME_SIZE(0x5) 设置帧的最大大小,初始值 2^14,即 16384 字节
SETTINGS_MAX_HEADER_LIST_SIZE(0x6) 知会对端头部索引表的最大尺寸,单位字节,基于未压缩前的头部

7.2 抓取客户端首次 SETTINGS 帧

下面还是以抓取 www.sina.com.cn 首页数据为例,然后使用 显示过滤器只显示 HTTP/2 部分的数据,下面抓取的是 Stream 中首帧,客户端握手的数据:

Tips:从图中可以看出客户端 Settings - Max concurrent streams : 1000 表示客户端允许的最大并发 Stream 数量是 1000,。

7.3 抓取服务端首次 SETTINGS 帧

下面抓取 HTTP/2 握手之后服务端发送的首次 SETTINGS 帧数据分析:

Tips:从图中可以看出服务端的 Settings - Max concurrent streams : 128 表示服务端允许的最大并发 Stream 数是 128Settings - Max frame size : 16777215表示服务端允许的最大帧大小 16777215 字节。


相关文章
|
8天前
|
监控 安全 搜索推荐
设置 HTTPS 协议以确保数据传输的安全性
设置 HTTPS 协议以确保数据传输的安全性
http数据包抓包解析
http数据包抓包解析
|
6天前
|
安全 网络协议 网络安全
在实现HTTPS时,有哪些常见的安全协议
在实现HTTPS时,有哪些常见的安全协议
|
7天前
|
前端开发 JavaScript 安全
深入解析 http 协议
HTTP(超文本传输协议)不仅用于传输文本,还支持图片、音频和视频等多种类型的数据。当前广泛使用的版本为 HTTP/1.1。HTTPS 可视为 HTTP 的安全增强版,主要区别在于添加了加密层。HTTP 请求和响应均遵循固定格式,包括请求行/状态行、请求/响应头、空行及消息主体。URL(统一资源定位符)用于标识网络上的资源,其格式包含协议、域名、路径等信息。此外,HTTP 报头提供了附加信息,帮助客户端和服务端更好地处理请求与响应。状态码则用于指示请求结果,如 200 表示成功,404 表示未找到,500 表示服务器内部错误等。
14 0
深入解析 http 协议
|
14天前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
59 3
|
15天前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
30 2
|
8天前
|
JavaScript 网络协议 Windows
|
16天前
|
Python
HTTP协议不再是迷!Python网络请求实战,带你走进网络世界的奥秘
本文介绍了HTTP协议,它是互联网信息传递的核心。作为客户端与服务器通信的基础,HTTP请求包括请求行、头和体三部分。通过Python的`requests`库,我们可以轻松实现HTTP请求。本文将指导你安装`requests`库,并通过实战示例演示如何发送GET和POST请求。无论你是想获取网页内容还是提交表单数据,都能通过简单的代码实现。希望本文能帮助你在Python网络请求的道路上迈出坚实的一步。
33 0
|
4月前
|
安全 网络协议 网络安全
IP代理的三大协议:HTTP、HTTPS与SOCKS5的区别
**HTTP代理**适用于基本网页浏览,简单但不安全;**HTTPS代理**提供加密,适合保护隐私;**SOCKS5代理**灵活强大,支持TCP/UDP及认证,适用于绕过限制。选择代理协议应考虑安全、效率及匿名需求。
|
1月前
HAProxy的高级配置选项-配置haproxy支持https协议及服务器动态上下线
文章介绍了如何配置HAProxy以支持HTTPS协议和实现服务器的动态上下线。
80 8
HAProxy的高级配置选项-配置haproxy支持https协议及服务器动态上下线
下一篇
无影云桌面