HTTP2 帧基础知识以及Header和CONTINUATION帧相关资料:

HTTP2于2015年2月28日正式通过IETF组织批准发布,正式定稿。有关它的内容可以参考:  HTTP2 概述  http://www.cnblogs.com/ghj1976/p/4552583.html

在HTTP2 的网络通讯中, Frame 是 通讯中的最小传输单位,至少含有一个 Frame header,能够表示它属于哪一个 Stream。一个具体的请求类似如下:

 

 

HTTP/2 帧通用格式:

帧头+负载的比特位通用结构:

帧头为固定的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

参考:
HTTP/2 frame format
http://segmentfault.com/a/1190000002586816 

 

帧的标志位(Flags)含义如下图:

图来自: http://search.cpan.org/~crux/Protocol-HTTP2-0.14/lib/Protocol/HTTP2/Frame.pm

 

 

案例:

假设我们要发送 0x12345678,流编号为 10 ,类型为DATA,那么这个Frame的16进制表达就是:

‘000004‘ + ‘00‘ + ‘00‘ + ‘0000000A‘ +   ‘12345678‘

 

HTTP2 的 Header 帧

HTTP2的 HEADER帧的格式如下:

 

对应的字段列表说明如下:

- Pad Length:受制于PADDED标志控制是否显示,8个比特表示填充的字节数。

- E:一个比特表示流依赖是否专用,可选项,只在流优先级PRIORITY被设置时有效

- Stream Dependency:31个比特表示流依赖,只在流优先级PRIORITY被设置时有效

- Weight:8个比特(一个字节)表示无符号的自然数流优先级,值范围自然是(1~256),或称之为权重。只在流优先级PRIORITY被设置时有效

- Header Block Fragment:报头块分片

- Padding:填充的字节,受制于PADDED标志控制是否显示,长度由Pad Length字段决定

 

所需标志位:

END_STREAM (0x1): 报头块为最后一个,意味着流的结束。后续可紧接着CONTINUATION帧在当前的流中,需要把CONTINUATION帧作为HEADERS帧的一部分对待

END_HEADERS (0x4): 此报头帧不需分片,完整的一个帧。后续不再需要CONTINUATION帧帮忙凑齐。若没有此标志的HEADER帧,后续帧必须是以CONTINUATION帧传递在当前的流中,否则接收者需要响应PROTOCOL_ERROR类型的连接错误。

PADDED (0x8): 需要填充的标志 PRIORITY (0x20): 优先级标志位,控制独立标志位E,流依赖,和流权重。

 

注意事项:

- 其负载为报头块分片,若内容过大,需要借助于CONTINUATION帧继续传输。若流标识符为0x0,结束段需要返回PROTOCOL_ERROR连接异常。HEADERS帧包含优先级信息是为了避免潜在的不同流之间优先级顺序的干扰。

- 其实一般来讲,报文头部不大的情况下,一个HEADERS就可以完成了,特殊情况就是Cookie字段超过16KiB大小,不常见。

 

HTTP2的 CONTINUATION 帧

HTTP2的 CONTINUATION 帧的格式如下:

字段列表:

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

 

注意事项:

- 一个HEADERS/PUSH_PROMISE帧后面会跟随零个或多个CONTINUATION,只要上一个帧没有设置END_HEADERS标志位,就不算一个帧完整数据的结束。

- 接收端处理此种情况,从开始的HEADERS/PUSH_PROMISE帧到最后一个包含有END_HEADERS标志位帧结束,合并的数据才算是一份完整数据拷贝

- 在HEADERS/PUSH_PROMISE(没有END_HEADERS标志位)和CONTINUATION帧中间,是不能够掺杂其它帧的,否则需要报PROTOCOL_ERROR错误

标志位: * END_HEADERS(0X4):表示报头块的最后一个帧,否则后面还会跟随CONTINUATION帧。

 

 

参考资料:

HTTP2协议中报文头可以采用Haffman编码,我们看到的报文头信息都是二进制信息。

HTTP2的报文格式请参考: http://www.blogjava.net/yongboy/archive/2015/03/20/423655.html

HTTP2报文头及数据帧格式解析实例分析

http://blog.csdn.net/jiayanhui2877/article/details/45074315 

Haffman 压缩算法请参考: http://coolshell.cn/articles/7459.html

时间: 2024-08-11 19:14:42

HTTP2 帧基础知识以及Header和CONTINUATION帧相关资料:的相关文章

PHP面试 PHP基础知识 十一(开发环境及相关配置)

开发环境及相关配置 版本控制软件 集中式和分布式 集中式:集中式版本控制工具,版本库集中存放在中央服务器,团队成员里的每个人工作时从中央服务器下载代码,个人修改后再提交到中央服务器 分布式:分布式版本控制工具,没有中央服务器,每个开发人员都通过clone,在本地拷贝一个完整的仓库. Git 与 Svn Svn的特点(集中式) 1.每个版本库有唯一的URL,每个用户都从这个地址获取代码和数据 2.获取代码的更新,也只能连接到这个唯一的版本库,同步以取得最新数据 3.提交必须有网络连接(非本地版本库

SAR成像基础知识急救箱(一)卷积 相关 滤波器那些事儿

1 相关与卷积 1.1 相关 自相关定义: A(τ)=∫μ(t)μ(t+τ)dt 自相关的涵义是一个函数和平移后的自己的乘积的积分,注意自相关是平移量的函数.直观上理解:如果平移量为0,则对应上式的结果最大.对于如下式所示的信号: μ 1 (t)={10  for ∣ t∣≤T/2otherwise 对于T=1  ,对应的图形和自相关函数分别为: 可以这样理解:积分代表面积,所以函数平移之后与原来的自己再相乘再积分,即是看乘积函数与水平轴围成的面积.对于上式,可以想象的是,若平移量较大,大于1,

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组

数据通信的基础知识

数据通信的基础知识 典型的数据通信模型: 相关术语 通信的目的是传送消息. 数据(data)--运送消息的实体: 信号(signal)--数据的电气或电磁的表现: "数字信号"--代表消息的参数的取值是离散的: "模拟信号"--代表消息的参数的取值是连续的: 码元(code)--在使用时间域的波形标识数字信号时,则代表不同离散数值的基本波形就形成了码元: 在数字通信中常常使用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为二进制码元.而这个间隔被称

Ajax基础知识 浅析(含php基础语法知识)

1.php基础语法    后缀名为.php的文件 (1) echo   向页面中输入字符串  <?php    所有php相关代码都要写在<?php ?>这个标签之中 echo "<div>Hello World!</div>"; ?> (2) $  变量声明  如果只声明不赋值,会报错 <?php $num=123; echo $num; echo "<div>编号为:".$num."&l

【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识

前面几篇文章采用的案例的方法进行介绍的,这篇文章主要介绍Python常用的扩展包,同时结合数据挖掘相关知识介绍该包具体的用法,主要介绍Numpy.Pandas和Matplotlib三个包.目录:        一.Python常用扩展包        二.Numpy科学计算包        三.Pandas数据分析包        四.Matplotlib绘图包 前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.K

【深度分解】听趣拍云产品经理剖析视频基础知识(2)

"随着技术的不断进步,视频技术的制作加工门槛逐渐降低,信息资源的不断增长,同时由于视频信息内容更加丰富完整的先天优势,在近年来已经逐渐成为主流.在基础知识(1)里面已经讲了模拟时代和数字化时代的视频技术.接下来将对视频编码与压缩.画面压缩.运动压缩.互联网视频应用的到来做一个详细的介绍." 视频编码与压缩 视频编码与压缩,是数字化视频非常重要的技术,以至于它直接影响到视频在各个领域的应用.如果没有视频编码技术的不断提高,我们今天也不可能在方方面面享受到视频的便利性. 首先,视频编码是一

第二章 TCP/IP 基础知识

? TCP/IP ?transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的. ? 2.2 TCP/IP 的标准化 2.2.2 TCP/IP 标准化精髓 TCP/IP 协议始终具有很强的实用性. 相比于TCP/IP ,OSI 之所以未能达到普及,主要原因在于未能尽早的制定可行性较强的协议.未能提出应对技术快速更新的协议以及没有能及时进行后期的改良的方案. 2.2.3 TCP/IP 规范 --RFC 那些需要标准

TCP/IP基础知识

最近工作中需要自己在板卡植入TCP/IP协议栈,因为毕竟单片机性能有限,完整的TCP/IP协议栈很庞大,所以只能移植经过简化的,本来已成功将LWIP协议栈移植到项目板卡中,但老大说这个协议栈写得过于繁琐,特别是在内存管理这块,不容易理解,而且我们板卡对数据的准确性要求没那么高,重点要保证能通就行,偶尔丢失一两个包都没关系,所以按此需求自写协议栈,实现UDP以及Telnet通信,目前UDP已经实现,其余功能还在慢慢增加中,通过这段时间的研究发现实现UDP并不难,最主要是要把网络通信的一些基本概念知