HTTP/2

HTTP/2 ,超文本传输协议的第二版。相对于HTTP/1.x 协议的文本传输格式,HTTP/2以二进制的格式进行数据传输。因此,具有更小的传输体积以及负载,相比于文本解析,二进制解析更加方便、高校。

HTTP/1.x与HTTP/2

报文(帧)格式

HTTP/1 的请求和响应报文,是由起始行、首部和正文组成,换行符分隔。
HTTP/2 将请求和响应数据分割为更小的帧,并对它们采用二进制编码。易于解析。

【 http2.0并没有改变http1.x的语义,只是把原来http1.x的header和body部分用frame重新封装了一层而已】

Headers Frame: 帧头
固定的9个字节((24+8+8+1+31)/8=9)呈现,变化的为帧的负载(Frame Payload),负载内容是由帧类型(Type)定义。

Length: 帧长度
无符号的自然数,24个比特表示,仅表示帧负载(Frame Payload)所占用字节数,不包括帧头所占用的9个字节。 默认大小区间为为0~16,384(2^14),一旦超过默认最大值2^14(16384),发送方将不再允许发送,除非接收到接收方定义的SETTINGS_MAX_FRAME_SIZE(一般此值区间为2^14 ~ 2^24)值的通知。
Type帧类型
8个比特表示,定义了帧负载的具体格式和帧的语义,HTTP/2规范定义了10个帧类型,这里不包括实验类型帧和扩展类型帧
Flags:帧的标志位
8个比特表示,服务于具体帧类型,默认值为0x0。 8个比特可以容纳8个不同的标志,比如,PADDED值为0x8,二进制表示为00001000;END_HEADERS值为0x4,二进制表示为00000100;END_STREAM值为0X1,二进制为00000001。可以同时在一个字节中传达三种标志位,二进制表示为00001101,即0x13。因此,后面的帧结构中,标志位一般会使用8个比特表示,若某位不确定,使用问号?替代,表示此处可能会被设置标志位
R:帧保留比特位
HTTP/2语境下为保留的比特位,固定值为0X0。
Stream Identifier:流标识符
无符号的31比特表示无符号自然数。0x0值表示为帧仅作用于连接,不隶属于单独的流。

关于帧长度,需要稍加关注: - 0 ~ 2^14(16384)为默认约定长度,所有端点都需要遵守 - 2^14 (16,384) ~ 2^24-1(16,777,215)此区间数值,需要接收方设置SETTINGS_MAX_FRAME_SIZE参数单独赋值 - 一端接收到的帧长度超过设定上限或帧太小,需要发送FRAME_SIZE_ERR错误 - 当帧长错误会影响到整个连接状态时,须以连接错误对待之;比如HEADERS,PUSH_PROMISE,CONTINUATION,SETTINGS,以及帧标识符不该为0的帧等,都需要如此处理 - 任一端都没有义务必须使用完一个帧的所有可用空间 - 大帧可能会导致延迟,针对时间敏感的帧,比如RST_STREAM, WINDOW_UPDATE, PRIORITY,需要快速发送出去,以免延迟导致性能等问题

HTTP2 的帧类型

包含下面几种类型,对应上图的Type区域定义。

Frame Type Code
DATA 0x0
HEADERS 0x1
PRIORITY 0x2
RST_STREAM 0x3
SETTINGS 0x4
PUSH_PROMISE 0x5
PING 0x6
GOAWAY 0x7
WINDOW_UPDATE 0x8
CONTINUATION 0x9

帧的标志位(Flags)

含义如下图:

案例:
假设我们要发送 0x12345678,流编号为 10 ,类型为DATA,那么这个Frame的16进制表达就是:
‘000004’ + ‘00’ + ‘00’ + ‘0000000A’ + ‘12345678’

Header帧

HTTP2的 HEADER帧的格式如下:

对应的字段列表说明如下:
* Pad Length*:受制于PADDED标志控制是否显示,8个比特表示填充的字节数。 可选。Flags:PADDED 设置后要求有此字段
E:一个比特表示流依赖是否专用,可选项,只在流优先级PRIORITY被设置时有效 可选。Flags:PRIORITY 设置后要有此字段
Stream Dependency:31个比特表示流依赖,只在流优先级PRIORITY被设置时有效 可选。Flags:PRIORITY 设置后要有此字段
Weight:8个比特(一个字节)表示无符号的自然数流优先级,值范围自然是(1~256),或称之为权重。只在流优先级PRIORITY被设置时有效 这个字段是可选的,并且只在优先级标记设置的情况下才呈现。
Header Block Fragment:报头块分片
Padding:填充的字节,受制于PADDED标志控制是否显示,长度由Pad Length字段决定
* 注意 * , 只有 Header Block Fragment 是必须的, 其他都看 帧的标志位Flags 是否设置要有。

所需标志位:
END_STREAM (0x1): 报头块为最后一个,意味着流的结束。
END_HEADERS (0x4): 此报头帧不需分片,完整的一个帧。后续不再需要CONTINUATION帧帮忙凑齐。若没有此标志的HEADER帧,后续帧必须是以CONTINUATION帧传递在当前的流中,否则接收者需要响应PROTOCOL_ERROR类型的连接错误。
PADDED (0x8): 需要填充的标志
PRIORITY (0x20): 优先级标志位,控制独立标志位E,流依赖,和流权重。

  • 其负载为报头块分片,若内容过大,需要借助于CONTINUATION帧继续传输。若流标识符为0x0,结束段需要返回PROTOCOL_ERROR连接异常。HEADERS帧包含优先级信息是为了避免潜在的不同流之间优先级顺序的干扰。
  • 其实一般来讲,报文头部不大的情况下,一个HEADERS就可以完成了,特殊情况就是Cookie字段超过16KiB大小,不常见。

CONTINUATION 帧

HTTP/2的 CONTINUATION 帧的格式如下:

字段列表:
Header Block Fragment,用于协助HEADERS/PUSH_PROMISE等单帧无法包含完整的报头剩余部分数据。

注意事项:

1 一个HEADERS/PUSH_PROMISE帧后面会跟随零个或多个CONTINUATION,只要上一个帧没有设置END_HEADERS标志位,就不算一个帧完整数据的结束。
2 接收端处理此种情况,从开始的HEADERS/PUSH_PROMISE帧到最后一个包含有END_HEADERS标志位帧结束,合并的数据才算是一份完整数据拷贝
3 在HEADERS/PUSH_PROMISE(没有END_HEADERS标志位)和CONTINUATION帧中间,是不能够掺杂其它帧的,否则需要报PROTOCOL_ERROR错误
标志位: * END_HEADERS(0X4):表示报头块的最后一个帧,否则后面还会跟随CONTINUATION帧。

HTTP/2的 Data帧

一个或多个DATA帧作为请求、响应内容载体,较为完整的结构如下:

字段:
*Pad Length: 一个字节表示填充的字节长度。取决于PADDED标志是否被设置.
Data: 这里是应用数据,真正大小需要减去其他字段(比如填充长度和填充内容)长度。
* Padding*: 填充内容为若干个0x0字节,受PADDED标志控制是否显示。接收端处理时可忽略验证填充内容。若验证,可以对非0x0内容填充回应PROTOCOL_ERROR类型连接异常。
标志位:
END_STREAM (0x1): 标志此帧为对应标志流最后一个帧,流进入了半关闭/关闭状态。
PADDED (0x8): 负载需要填充,Padding Length + Data + Padding组成。
注意事项:

若流标识符为0x0,接收者需要响应PROTOCOL_ERROR连接错误
DATA帧只能在流处于”open” or “half closed (remote)”状态时被发送出去,否则接收端必须响应一个STREAM_CLOSED的连接错误。若填充长度不小于负载长度,接收端必须响应一个PROTOCOL_ERROR连接错误。

参考链接:
HTTP2协议中报文头可以采用Haffman编码,我们看到的报文头信息都是二进制信息。
HTTP2的报文格式请参考
HTTP2报文头及数据帧格式解析实例分析
Haffman 压缩算法请参考
HTTP2 帧基础知识以及Header、CONTINUATION、DATA帧相关资料

HTTP/2帧格式简介相关推荐

  1. PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

    PPP(Point-to-Point Protocol)是一种用于在两个网络节点之间传输数据的通信协议.它最初是为在拨号网络上进行拨号连接而开发的,现在已经被广泛应用于各种网络环境中,例如在宽带接入. ...

  2. 【STM32】SPI简介

    00. 目录 文章目录 00. 目录 01. SPI简介 02. SPI特性 03. SPI功能说明 04. SPI中断 05. 相关寄存器 5.1 SPI 控制寄存器 1 (SPI_CR1) (不用 ...

  3. HDLC 和 PPP封装简介

    广域网封装技术:HDLC , PPP HDLC简介:高级数据链路控制协议(High-level Data Link Control) HDLC是点到点串行线路上(同步电路)的帧封装格式,其帧格式和以太 ...

  4. 以太网接口MII,RMII,SMII,GMII总线接口简介

    以太网接口MII,RMII,SMII,GMII总线接口简介 所有的这些接口都从MII而来,MII是(MediumIndependent Interface)的意思,是指不用考虑媒体是铜轴.光纤.电缆等 ...

  5. AAA及RADIUS/HWTACACS协议简介

    AAA及RADIUS/HWTACACS协议简介 AAA简介AAA是Authentication,Authorization and Accounting(认证.授权和计费)的简称,它提供了一个对认证. ...

  6. SONET、SDH、POS简介

    引用华为.华三的技术文档,自己整理的 SONET简介 SONET(Synchronous Optical Network,同步光纤网)是ANSI定义的同步传输体制,是一种全球化的标准传输协议,采用光传 ...

  7. 同步光网络(SONET,Synchronous Optical Networking)简介

    1.简介 同步光网络(SONET,代表Synchronous Optical Networking)是使用光纤进行数字化信息通信的一个标准.为了传送大量的电话和数据业务就开发了它用以替换准同步数字体系 ...

  8. Marvell 88E1111PHY芯片简介

    1.PHY芯片简介 PHY芯片在OSI协议栈中属于最底层的物理层,与其它层的关系图如下: 从硬件上来说,一般PHY芯片为模数混合电路,负责接收电.光这类模拟信号,经过解调和A/D转换后通过MII接口将 ...

  9. H264(NAL简介与帧判断)

    转自(http://www.cnblogs.com/yjg2014/p/6144977.html) 参考:图像编码与 H264 基础知识 h264解码之自定义信息(SEI) 1.NAL全称Networ ...

最新文章

  1. Unity C# Job System介绍(四) 并行化Job和故障排除(完结)
  2. Orleans解决并发之痛(三):集群
  3. Android端发送字符到Wed端,android应用端向web端获取字符串。
  4. 趣学 C 语言(三)—— 琐碎
  5. el表达式跟ognl表达式的区别(用法和页面取值)
  6. linux运维必学python吗_Python学习资源整理
  7. matlab 准线,在MATLAB中检测目标中心
  8. 凤凰系统基于android x x86,凤凰系统(Phoenix OS)x86版1.0 beta官方版
  9. vue使用插件jsbarcode 生成条码下载
  10. 用HTML写手机QQ登录界面
  11. BlendMask 论文学习
  12. python安装pytorch
  13. [CVPR 2020] RPM-Net: Robust Point Matching using Learned Features
  14. “直接基于成本法”与“模拟权益法”两种合并报表模式比较与分析:响应新准则
  15. Java 第9天 面向对象(中) 理解有参构造器和无参构造器的作用
  16. 昆山市地方税务局异地复制及备份系统询价采购招标公告
  17. MathNet.Numerics主要类功能简述
  18. 加班合并代码,错失值 77 万元的年会大奖
  19. MP4文件怎么转换GIF动态图?三步搞定
  20. MQTT协议——什么是MQTT(一)

热门文章

  1. Linux任务计划命令和日志讲解视频-羽飞作品
  2. 沐风老师3dMax泰森多边形(voronoi)建模教程
  3. linux ab双分区升级,AB 系统OTA升级
  4. 总裁发话: 创业者应该如何避免陷入”成功陷阱”
  5. 出师表 ---诸葛孔明
  6. 每周一道算法题005:切木棒
  7. 天津发展php怎么样,为什么那么多人选择留在滨海新区?他们现在怎么样了 ?
  8. 委屈自己的常受委屈,会疼自己的才有人疼
  9. ioctl函数详解(Linux内核 )
  10. BurpSuite安装和基础使用教程(已破解)