【协议分析】HTTP2报文头及数据帧格式解析实例分析

一、HEAD HPACK压缩协议格式说明,HPACK压缩的二进制格式采用以下2种格式:

1、用索引标识头域,如下所示,0位固定为1,其它7bit标识索引值,索引参考下面的静态表格,如82代表 -> :method: GET。

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 1 |        Index (7+)         |

+---+---------------------------+

Figure 5: Indexed Header Field

+-------+-----------------------------+---------------+

| Index | Header Name                 | Header Value  |

+-------+-----------------------------+---------------+

| 1     | :authority                  |               |

| 2     | :method                     | GET           |

| 3     | :method                     | POST          |

| 4     | :path                       | /             |

| 5     | :path                       | /index.html   |

| 6     | :scheme                     | http          |

| 7     | :scheme                     | https         |

| 8     | :status                     | 200           |

| 9     | :status                     | 204           |

| 10    | :status                     | 206           |

| 11    | :status                     | 304           |

| 12    | :status                     | 400           |

| 13    | :status                     | 404           |

| 14    | :status                     | 500           |

| 15    | accept-charset              |               |

| 16    | accept-encoding             | gzip, deflate |

| 17    | accept-language             |               |

| 18    | accept-ranges               |               |

| 19    | accept                      |               |

| 20    | access-control-allow-origin |               |

| 21    | age                         |               |

| 22    | allow                       |               |

| 23    | authorization               |               |

| 24    | cache-control               |               |

| 25    | content-disposition         |               |

| 26    | content-encoding            |               |

| 27    | content-language            |               |

| 28    | content-length              |               |

| 29    | content-location            |               |

| 30    | content-range               |               |

| 31    | content-type                |               |

| 32    | cookie                      |               |

| 33    | date                        |               |

| 34    | etag                        |               |

| 35    | expect                      |               |

| 36    | expires                     |               |

| 37    | from                        |               |

| 38    | host                        |               |

| 39    | if-match                    |               |

| 40    | if-modified-since           |               |

| 41    | if-none-match               |               |

| 42    | if-range                    |               |

| 43    | if-unmodified-since         |               |

| 44    | last-modified               |               |

| 45    | link                        |               |

| 46    | location                    |               |

| 47    | max-forwards                |               |

| 48    | proxy-authenticate          |               |

| 49    | proxy-authorization         |               |

| 50    | range                       |               |

| 51    | referer                     |               |

| 52    | refresh                     |               |

| 53    | retry-after                 |               |

| 54    | server                      |               |

| 55    | set-cookie                  |               |

| 56    | strict-transport-security   |               |

| 57    | transfer-encoding           |               |

| 58    | user-agent                  |               |

| 59    | vary                        |               |

| 60    | via                         |               |

| 61    | www-authenticate            |               |

+-------+-----------------------------+---------------+

2、字符头域表示法

2.1字符头域索引法,包括直接查找索引法和新命名法

直接索引法:

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 1 |      Index (6+)       |

+---+---+-----------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

新命名法:

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 1 |           0           |

+---+---+-----------------------+

| H |     Name Length (7+)      |

+---+---------------------------+

|  Name String (Length octets)  |

+---+---------------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

40                                      | == Literal indexed ==

0a                                      |   Literal name (len = 10)

6375 7374 6f6d 2d6b 6579                | custom-key

0d                                      |   Literal value (len = 13)

6375 7374 6f6d 2d68 6561 6465 72        | custom-header

| -> custom-key: custom-head\

|   er

2.1字符头域无索引法,包括直接查找索引法和新命名法

直接索引法:

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 0 |  Index (4+)   |

+---+---+-----------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

04                                      | == Literal not indexed ==

|   Indexed name (idx = 4)

|     :path

0c                                      |   Literal value (len = 12)

2f73 616d 706c 652f 7061 7468           | /sample/path

| -> :path: /sample/path

新命名法:

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 0 |       0       |

+---+---+-----------------------+

| H |     Name Length (7+)      |

+---+---------------------------+

|  Name String (Length octets)  |

+---+---------------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

2.2从不索引,也包括直接查找索引法和新命名法

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 1 |  Index (4+)   |

+---+---+-----------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| 0 | 0 | 0 | 1 |       0       |

+---+---+-----------------------+

| H |     Name Length (7+)      |

+---+---------------------------+

|  Name String (Length octets)  |

+---+---------------------------+

| H |     Value Length (7+)     |

+---+---------------------------+

| Value String (Length octets)  |

+-------------------------------+

10                                      | == Literal never indexed ==

08                                      |   Literal name (len = 8)

7061 7373 776f 7264                     | password

06                                      |   Literal value (len = 6)

7365 6372 6574                          | secret

| -> password: secret

二、实例分析:HTTP2数据带Haffman Code

00000000  50 52 49 20 2a 20 48 54  54 50 2f 32 2e 30 0d 0a PRI * HT TP/2.0..

00000010  0d 0a 53 4d 0d 0a 0d 0a  00 0c 04 00 00 00 00 00 ..SM.... ........

00000020  00 03 00 00 00 64 00 04  00 00 ff ff 00 39 01 05 .....d.. .....9..

00000030  00 00 00 01 41 8a a0 e4  1d 13 9d 09 b8 c8 00 0f ....A... ........

00000040  82 04 94 62 43 91 8a 47  55 a3 a1 89 d3 4d 0c 1a ...bC..G U....M..

00000050  a9 0b e5 79 d3 4d 1f 86  53 03 2a 2f 2a 90 7a 8d ...y.M.. S.*/*.z.

00000060  aa 69 d2 9a c4 c0 17 6d  71 2d 7f 07 1f          .i.....m q-...

1、头部:

00000000  50 52 49 20 2a 20 48 54  54 50 2f 32 2e 30 0d 0a PRI * HT TP/2.0..

00000010  0d 0a 53 4d 0d 0a 0d 0a   ..SM....

2、设置帧:

长度:00 0c

TYPE: 04

FLAG: 00

FlowID: 00 00 00 00

MAXFLOWNUM FLAG:00 03

MAXFLOWNUM : 00 00 00 64

MAX Win FLAG: 00 04

MAX Win Size: 00 00 ff ff

3、报头帧

长度:00 39

TYPE: 01

FLAG: 05

FlowID: 00 00 00 01

报头数据,值部分数据采用了Haffman编码:

41 8a a0 e4  1d 13 9d 09 b8 c8 00 0f ....A... ........

00000040  82 04 94 62 43 91 8a 47  55 a3 a1 89 d3 4d 0c 1a ...bC..G U....M..

00000050  a9 0b e5 79 d3 4d 1f 86  53 03 2a 2f 2a 90 7a 8d ...y.M.. S.*/*.z.

00000060  aa 69 d2 9a c4 c0 17 6d  71 2d 7f 07 1f          .i.....m q-...

41::authority

8a: len = 10 data = a0 e4  1d 13 9d 09 b8 c8 00 0f  data dec = localhost:3000

82: :method = Get

04: :path

94: len = 20 data 62 43 91 8a 47  55 a3 a1 89 d3 4d 0c 1a a9 0b e5 79 d3 4d 1f data dec /doc/manual/html/index.html

86: :scheme = http

53: :accept

03 len = 3 data = 2a 2f 2a */*

90: :accept-encoding = gzip,deflate

7a: :user-agent

8d: len = 13 data = aa 69 d2 9a c4 c0 17 6d  71 2d 7f 07 1f data dec = nghttp

/*

0   1   2   3   4   5   6   7

+---+---+---+---+---+---+---+---+

| ? | ? | ? | 1   1   1   1   1 |

+---+---+---+-------------------+

| 1 |    Value-(2^N-1) LSB      |

+---+---------------------------+

...

+---+---------------------------+

| 0 |    Value-(2^N-1) MSB      |

+---+---------------------------+

*/

参考:hpack草案及HTTP2草案

时间: 2024-10-18 07:24:17

【协议分析】HTTP2报文头及数据帧格式解析实例分析的相关文章

HTTP协议图--HTTP 报文首部之首部字段(重点分析)

1.首部字段概述 先来回顾一下首部字段在报文的位置,HTTP 报文包含报文首部和报文主体,报文首部包含请求行(或状态行)和首部字段. 在报文众多的字段当中,HTTP 首部字段包含的信息最为丰富.首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息.使用首部字段是为了给客服端和服务器端提供报文主体大小.所使用的语言.认证信息等内容. 2.首部字段结构 HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号":"分隔. 另外,字段值对应单个 HTTP 首部字段可以有

自己动手学TCP/IP–http协议(http报文头)

在前面的一篇文章中,简单了介绍了HTTP报文格式,详情参考http://www.firefoxbug.net/?cat=47. 这里大概介绍下基本的,常见的HTTP包头格式. POST /report/getComment.jsp HTTP/1.1 Host: yeeg.com Connection: keep-alive Content-Length: 161 Origin: http://www.1g1g.com User-Agent: Mozilla/5.0 (X11; Linux i68

使用wireshark分析tcp/ip报文之报文头

以太网报文的结构如下: 其中,以太网的帧头: 14 Bytes:MAC目的地址48bit(6B),MAC源地址48bit(6B),Type域2B,一共14B. IP头部: TCP头部: http://blog.163.com/[email protected]/blog/static/618945432011101110497885/ http://www.cnblogs.com/zhuzhu2016/p/5797534.html 也就是报文的头部一共有54字节.下面以一个简单的http请求查看

HTTP协议基础及报文抓包分析

从事性能测试必不可绕过的就是协议,对基本知识的了解,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手. 下面我们就HTTP协议及性能测试过程必须掌握的一些分析工具来进行分享. 重点分享性能测试实施过程中必须掌握的关键技术.工具.更细节的请参考HTTP相关书籍或RFC文档. HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请求的工具.Web Se

8583协议实例分析

ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分. 8583包前面一段为位图,用来确定包的字段域组成情况.其中位图是8583包的灵魂,它是打包解包确定字段域的关键,而了解每个字段域的属性则是填写数据的基础. 位图描述如下: 位图位置:1 格式:定长 类型:B16(二进制16位,16*8=128bit) 描述:如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域).如使用某数据域,应

[转] TCP数据包重组实现分析

PS: 这个实现对于某些特定情况未必是最佳实现,可以用数组来代替队列来实现 参照TCP/IP详解第二卷24~29章,详细论述了TCP协议的实现,大概总结一下TCP如何向应用层保证数据包的正确性.可靠性,即TCP如何实现对数据报文的重组. 首先要设计两个报文队列,一个存放正常来到的报文,一个存放失序到来的报文. 比如正常报文队列最后一个报文数据如下: 报文数据段第一字节的序号                      数据报长度 seq1=100 len1=100 下一个来到的报文可能有多种情况,

PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性

关系数组 array("key"=>"value",...) ; get没有数据大小的限制 post上传大小没有限制 不指定上传方式,默认是get 文件上传 需要在html中 form属性中添加 enctype = "multipart/form-data" <!-- 上传文件必须设置 enctype ='multipart/form-data' --> <form action="text01.php"

TCP协议详解即实例分析

 TCP协议详解 3.1 TCP服务的特点 TCP协议相对于UDP协议的特点是面向连接.字节流和可靠传输. 使用TCP协议通信的双方必须先建立链接,然后才能开始数据的读写.双方都必须为该链接分配必要的内核资源,以还礼链接状态和连接上数据的传输.TCP链接是全双工的,即双方的数据读写可以通过一个连接进行.完成数据交换之后,通信双方都必须断开连接以释放系统资源. TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务.而无连接协议UDP则非常适合于广

IP包、TCP报文、UDP数据段格式的汇总

一.IP包格式 IP数据包是一种可变长分组,它由首部和数据负载两部分组成.首部长度一般为20-60字节(Byte),其中后40字节是可选的,长度不固定,前20字节格式为固定.数据负载部分的长度一般可变,整个IP数据包的最大长度为65535B. 1.版本号(Version) 长度为4位(bit),IP v4的值为0100,IP v6的值为0110. 2.首部长度 指的是IP包头长度,用4位(bit)表示,十进制值就是[0,15],一个IP包前20个字节是必有的,后40个字节根据情况可能有可能没有.