HTTP/2数据压缩

13

我正在尝试理解HTTP/2协议压缩数据字段的方式。在rfc中没有找到算法。我知道它是一种二进制协议。 我正在寻找一种方法将二进制协议转换为可读内容。我认为它类似于gzip,但实际上不是。有人可以提供一个参考二进制协议的来源吗?

Frame 55: 151 bytes on wire (1208 bits), 151 bytes captured (1208 bits) on interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst:00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
Transmission Control Protocol, Src Port: 443 (443), Dst Port: 55300 (55300), Seq: 1087, Ack: 1078, Len: 85
Secure Sockets Layer
HyperText Transfer Protocol 2
Stream: HEADERS, Stream ID: 13, Length 47
    Length: 47
    Type: HEADERS (1)
    Flags: 0x04
    0... .... .... .... .... .... .... .... = Reserved: 0x00000000
    .000 0000 0000 0000 0000 0000 0000 1101 = Stream Identifier: 13
    [Pad Length: 0]
    Header Block Fragment: 8854012a5a839bd9ab5f87497ca589d34d1f5c0333333861...
    [Header Length: 177]
    [Header Count: 6]
    Header: :status: 200
    Header: access-control-allow-origin: *
    Header: content-encoding: gzip
    Header: content-type: text/html
    Header: content-length: 338
    Header: date: Wed, 17 Aug 2016 15:14:25 GMT
    Padding: <MISSING>

    Frame 56: 442 bytes on wire (3536 bits), 442 bytes captured (3536 bits) on interface 0
  Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst: 00:00:00_00:00:00 (00:00:00:00:00:00)
  Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
  Transmission Control Protocol, Src Port: 443 (443), Dst Port: 55300 (55300), Seq: 1172, Ack: 1078, Len: 376
  Secure Sockets Layer
  HyperText Transfer Protocol 2
      Stream: DATA, Stream ID: 13, Length 338
          Length: 338
          Type: DATA (0)
          Flags: 0x01
          0... .... .... .... .... .... .... .... = Reserved: 0x00000000
          .000 0000 0000 0000 0000 0000 0000 1101 = Stream Identifier: 13
          [Pad Length: 0]
          Data: 1f8b080000096e8800ff9cd2416b1b311005e0b3ffc5eb9e...
          Padding: <MISSING>

HTTP/2并没有对数据有效负载进行新的压缩,而是对头部进行了压缩。显然你没有仔细查看(..或者只是搜索了“压缩”)RFC:https://tools.ietf.org/html/rfc7540#ref-COMPRESSION链接到HPACK文档。 - Marcus Müller
我知道头部压缩的工作原理,我对这一行很感兴趣:Data: 1f8b080000096e8800ff9cd2416b1b311005e0b3ffc5eb9e... 这不在头部中,所以并没有使用hpack,也不是gzip格式,而是某种二进制格式,我想了解它的工作原理。 - dneyer
1
1f8b08 是gzip压缩的初始字节,因此它是gzip格式。此外,响应头中指定了 content-encoding: gzip ,因此DATA帧包含经gzip压缩过的响应正文。 - sbordet
1个回答

24
一个HTTP/2响应的响应体压缩(或不压缩)的方式与HTTP/1完全相同:Accept-Encoding:在请求中,Content-Encoding:在响应中。HTTP/2在主体压缩方面没有做任何新工作,只是处理头部,而HTTP/1中头部根本没有被压缩。

1
确实。曾经有一个数据压缩提案,但是它已被移除。 - GreenReaper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接