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月前
|
缓存 负载均衡 网络协议
HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践
面向企业网络与数据团队的代理协议选型与治理指南,基于流量特征选择HTTP或SOCKS5协议,通过多协议网关统一出站,结合托管网络降低复杂度,实现稳定吞吐、可预测时延与合规落地。
|
11月前
|
缓存 监控 搜索推荐
301重定向实现原理全面解析:从HTTP协议到SEO最佳实践
301重定向是HTTP协议中的永久重定向状态码,用于告知客户端请求的资源已永久移至新URL。它在SEO中具有重要作用,能传递页面权重、更新索引并提升用户体验。本文详解其工作原理、服务器配置方法(如Apache、Nginx)、对搜索引擎的影响及最佳实践,帮助实现网站平稳迁移与优化。
1225 68
|
10月前
|
运维 网络协议 安全
为什么经过IPSec隧道后HTTPS会访问不通?一次隧道环境下的实战分析
本文介绍了一个典型的 HTTPS 无法访问问题的排查过程。问题表现为 HTTP 正常而 HTTPS 无法打开,最终发现是由于 MTU 设置不当导致报文被丢弃。HTTPS 因禁止分片,对 MTU 更敏感。解决方案包括调整 MSS 或中间设备干预。
|
10月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
880 2
|
10月前
|
应用服务中间件
HTTP协议中常见的状态码
HTTP协议状态码分为1xx、2xx、3xx、4xx、5xx五类,常见状态码包括:101(请求已接受)、200(请求成功)、302(重定向)、400(请求错误)、401(未认证)、403(无权限)、404(资源不存在),以及500(服务器错误)、502(网关错误)、503(服务不可用)、504(网关超时)等。
677 0
|
10月前
|
网络协议 安全 网络安全
什么是HTTP协议
HTTP协议是超文本传输协议,基于TCP,规定了客户端与服务器端通信规则,但数据以明文传输,安全性低。HTTPS则通过SSL加密保障数据安全。两者默认端口不同,HTTP为80,HTTPS为443。HTTPS安全性更高,但消耗更多服务器资源。
481 0
|
10月前
|
数据采集 Web App开发 JSON
Python爬虫基本原理与HTTP协议详解:从入门到实践
本文介绍了Python爬虫的核心知识,涵盖HTTP协议基础、请求与响应流程、常用库(如requests、BeautifulSoup)、反爬应对策略及实战案例(如爬取豆瓣电影Top250),帮助读者系统掌握数据采集技能。
787 0
|
11月前
|
存储 网络协议 安全
HTTP 协议及会话跟踪机制详解
本文详解了 HTTP 协议的核心知识,包括其定义(超文本传输协议,基于 TCP,规定客户端与服务器通信规则)及与 HTTPS 的区别(安全性、端口、资源消耗)。 介绍了 GET 与 POST 请求的差异(参数限制、安全性、应用场景),以及 Restful 风格(通过 URL 定位资源,请求方式决定操作)。列举了常见 HTTP 状态码(如 200 成功、404 资源未找到),对比了转发与重定向的区别(服务器端一次请求 vs 客户端两次请求)。 还阐述了会话跟踪机制:Cookie 基于客户端存储,通过Set-Cookie和Cookie头实现,安全性较低;Session 基于服务端存储,依赖 C
787 1
|
缓存
HTTP协议深度剖析:常见请求头信息讲解
这就是HTTP请求头背后的工作原理,希望通过比作“邮差”和“标签”,可以让你对这个繁琐技术更有感触,更得心应手。尽管这些信息可能很琐碎,但了解了它们的含义和工作方式,就等于揭开了HTTP协议神秘的面纱,掌控了网络交流的核心。你还等什么,赶快动手尝试一下吧!
392 17

热门文章

最新文章