http 二进制_HTTP/2协议之二进制桢

HTTP/2的报文是以二进制桢发送的。那桢格式、桢大小、桢类型是怎么样的?本文会整理桢的格式以及十种桢类型。

一、桢格式

cb376ea5f3cb74a424fc9a2bbc629351.png

桢格式

1.桢格式说明

桢的格式由9个字节的桢头和桢数据Payload构成。
桢头由3个字节的桢长度、1个字节的桢类型、1个字节的标志位、4个字节的流标识符(含1位R保留位)构成。

桢长度

桢长度由24位3个字节大小表示。取值在2^14(16,384)与2^24-1(16,777,215)之间;可在接收方SETTINGS_MAX_FRAME_SIZE设置。

桢类型

桢类型用8位1个字节表示,说明桢的格式和语义。具体桢的类型详见下文介绍。

标志位

标志位用8位1个字节表示。例如:END_HEADERS标志表示头数据传输结束;END_STREAM表示单方向数据传输结束。

R

R即1位保留字段,未定义,以0x0结尾。

流标识符

流标识符用31位表示,上限为2^31。接收方可以根据流标识ID进行组装,同一个Stream中内Frame必须是有序的,所以接受方根据流ID可以拼接成有序的流。另外:客户端发起的流用奇数表识;服务器发起的流用偶数标识。正因为使用了流标识,接收端可以将并发的Stream进行有序拼接,实现多路复用。

桢数据

传输的数据内容Payload由桢类型决定。

2.Wireshark抓包截图

f76ed119867105043b0163e5939eed2d.png

桢报文

二、桢类型

1.DATA桢

数据桢主要存储HTTP/2数据报文,具体格式如下图:

709e2a65d0e42962851f62db9ec5edef.png

DATA桢图示

字段含义

Padding: 8位填充字节,填充字节可以改变DATA桢的大小,可以启到安全性功能Pad Length: 填充字节的长度;PADDED标记为true时表明有填充字节Data: 具体传输的数据

Wireshark抓包截图

040ffb2a9eab2862cae26cabce4bf1e9.png

DATA桢报文

2.Header桢

Header桢的结构如下图:

a0fd8d45e3fc817a646c75960d4f64ea.png

Header桢图示

字段含义

Pad Length

填充字节的长度,填充字节含义同上述Data桢

E

表识流是否为独占的。设置PRIORITY时才有值

Stream Dependency

该流的依赖流。设置PRIORITY时才有值

Weight

流优先级权重。设置PRIORITY时才有值

Header Block Fragment

Header块片段

Padding

填充的字节长度

Wireshark抓包截图

14fd80f253869bb63ee26fccdb342f52.png

Header桢报文

3.PRIORITY帧

发送流的优先级,格式如下,各字段含义与抓包截图见Header桢。

1aaf20ac4b7b8ff9a0dbffb23a573cc4.png

PRIORITY桢图示

4.RST_STREAM帧

当发生错误或者取消时,用于终止一个流。

064a3a16d2e6c19de2a05afc770cfb91.png

RST_STREAM桢图示

字段含义

Error Code

32位错误代码,指发生错误的原因。

Wireshark抓包截图

c364bcf1a12e9811ca7001489243c550.png

RST_STREAM帧报文

5.SETTINGS帧

用于传达连接端点之间的配置参数。SETTINGS帧的标记ACK为0表示被对等的SETTINGS桢使用;ACK不为0时表示FRAME_SIZE_ERROR的连接错误。

桢格式

dbb4b878889ca62b3761b72c71cc2e7d.png

SETTINGS帧格式

Identifier参数含义

SETTINGS_HEADER_TABLE_SIZE:通知接收方header解码表(解码header块)的最大尺寸SETTINGS_ENABLE_PUSH:初始值1表示允许服务端推送,0表示不允许服务端推送SETTINGS_MAX_CONCURRENT_STREAMS:最大的并发流数(发送者)SETTINGS_INITIAL_WINDOW_SIZE:stream窗口大小,默认为65535
SETTINGS_MAX_FRAME_SIZE:桢负载大小
SETTINGS_MAX_HEADER_LIST_SIZE:Header列表的最大值

Wireshark抓包截图

b13da141f966ca5d7c18ca86c3da1f35.png

SETTINGS帧报文

6.PUSH_PROMISE帧

服务端向客户端推送的桢,客户端可以返回RST_STREAM拒绝。图中R为保留位。

e4695460cf644d181c4d3ae347073d2c.png

PUSH_PROMISE帧图示

7.PING帧

心跳检测,测量发送往还时间,确定连接是否正常。标记ACK为0即false表示为PING桢的响应(response);1即True表示PING桢。

桢格式

27d77dcfdf277e8728f93276b368321f.png

PING帧图示

Wireshark抓包截图

4b1e077a86d445ad8076a4725df54e74.png

PING帧报文

8.GOAWAY帧

用于关闭连接或者发出错误,允许停止接受新的流并完成前面的流处理。

桢格式

b33b0cb604c92a1754ef1e7dd2af80fc.png

GOAWAY帧图示

Wireshark抓包截图

c8ccfebf6afd02a2968907aa6e3b3361.png

GOAWAY帧报文

9.WINDOW_UPDATE帧

用于连接和流的流量控制。

e5eca0837d3d19646e132d3d539821d8.png

WINDOW_UPDATE帧图示

Wireshark抓包截图

685240ad2aba904411e504ae244faed9.png

WINDOW_UPDATE帧报文

10.CONTINUATION桢

CONTINUATION一种持续桢用于继续传输Header头块片段。通常在Header块比较大,在HEADERS、PUSH_PROMISE、CONTINUATION桢之后继续传输。

d2f6cc53fa9ce9851c786eb7d36b93de.png

CONTINUATION桢格式

三、小结

通过对二进制桢内容的整理和走查,对HTTP/2通信的各种桢不再陌生,根据桢的类型可以知道通信双方在做什么操作。欢迎跟作者互动、共同探讨。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值