代码之家  ›  专栏  ›  技术社区  ›  gansteed

在HTTP/2中,头文件如何在客户端和服务器端保持同步?

  •  0
  • gansteed  · 技术社区  · 6 年前

    作为 HTTP/2 hpack 为了压缩头,每个连接有一个静态表和一个动态表。但我有一个问题,客户&服务器端同步头?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Barry Pollard    6 年前

    有两个表:一个用于客户端启动的消息,另一个用于服务器启动的消息。

    根据 spec :

    当用于双向通信时,如在HTTP中,则 对端点维护的动态表进行编码和解码 它们是分开的。

    由于TCP保证了消息的传递顺序,因此可以在客户端和服务器端(与服务器端类似)保持客户端表的同步。在不能保证按顺序传递消息的连接上,这将更加复杂,因此QUIC在HPACK上使用了一种称为 QPACK 它有额外的功能来处理这个问题。

        2
  •  0
  •   takpan    4 年前

    要启动HTTP2连接,应该已经建立了TCP连接。然后,客户机准备并发送第一个HTTP2数据包,其中包含以魔术字符串为前缀的设置帧,并为这个特定的TCP连接创建两个单独的动态表,一个用于客户机源消息,另一个用于服务器源消息。当服务器端收到一个以魔术字符串为前缀的HTTP2数据包时,它同样会创建两个独立的动态表。

    当客户机准备第一个HTTP2请求时,它首先构造HEADERS框架并在其中附加所有需要的头。第一个头帧的每个头是静态表的1字节长度索引(例如0x02->方法:GET)或由几个字节组成的头的文本表示。在后一种情况下,字节序列的第一个字节向服务器提供有关如何处理和存储这个新头的信息。同时,客户机已经在其动态表中存储了头文件。

    当服务器端接收到第一个HTTP2头帧时,它将使用其静态表对头块进行解码,以解码单字节头。对于每个文本头,它将根据从头字节序列的第一个字节检索到的信息在动态表中创建一个新条目。

    第二次从客户端准备包含头(HEDERS、CONTINUATION或PUSH PROMISE)的帧时,已经存储在动态表中的每个使用的头表示为1字节*(动态表索引)。对于第一次使用并且不在静态表中的每个头,将再次使用文本表示,并在客户机动态表中添加一个新条目。当服务器端接收到第二帧时,它会查看其静态或动态表来解码单字节头。对于每个文本头(第一次出现),它还将在其动态表中创建一个新条目。

    显然,按顺序交付帧是至关重要的。这是由底层TCP协议保护的。此外,头文件应该始终以串行方式在两侧进行处理。

    HTTP2用途 HPACK 标题压缩格式。

    * 为了简单起见,在上面的示例中假定了“具有增量索引和新名称的文本头字段”