HTTP/2动态表大小更新澄清

问题描述:

在HTTP/2协议中,我们看到动态表大小更新以下声明:HTTP/2动态表大小更新澄清

SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the 
     remote endpoint of the maximum size of the header compression 
     table used to decode header blocks, in octets. The encoder can 
     select any size equal to or less than this value by using 
     signaling specific to the header compression format inside a 
     header block (see [COMPRESSION]). The initial value is 4,096 
     octets. 

用于编码器和解码器的初始大小是根据RFC 4096个字节。

在Wireshark的SETTINGS帧,我可以看到传递给ENDPOINT(google.com在这种情况下)的新表大小

0000 00 00 12 04 00 00 00 00 00 **00 01 00 01 00** 00 00 
0010 04 00 02 00 00 00 05 00 00 40 00 

为SETTINGS_HEADER_TABLE_SIZE图案= 65536

我不明白它是否实际上告诉端点,用于解码来自此ENDPOINT的标题的动态表是字节长,还是它告诉ENDPOINTENDPOINT动态表大小应该是?

和扭转,我假设端点必须发送SETTINGS_HEADER_TABLE_SIZE告诉浏览器使用的头从端点解码其动态表,但我没有看到该选项由端点送回。有人可以解释这个吗?

另外还有一个动态表大小更新的信号,在RFC中提到,它在HEADERS帧内发送。

A dynamic table size update starts with the '001' 3-bit pattern, 
    followed by the new maximum size, represented as an integer with a 
    5-bit prefix (see Section 5.1). 

    The new maximum size MUST be lower than or equal to the limit 
    determined by the protocol using HPACK. A value that exceeds this 
    limit MUST be treated as a decoding error. In HTTP/2, this limit is 
    the last value of the SETTINGS_HEADER_TABLE_SIZE parameter (see 
    Section 6.5.2 of [HTTP2]) received from the decoder and acknowledged 
    by the encoder (see Section 6.5.3 of [HTTP2]). 

还有就是这条线received from the decoder and acknowledged by the encoder,所以没有这个信号被发送到限制encoding动态表的大小?我comletely丢失了,从Wireshark的捕获这是如何正确处理

UPDATE

好吧,我看了更多的Wireshark从Firefox walmart.com的网站上的日志(因为它并不明显是很多头文件)。有时候,firefox会在头部框架中发送dynamic table size update信号,其尺寸小于开始连接时由firefox发送的初始SETTINGS_HEADER_TABLE_SIZE。我在paper上写了一个firefox动态表,并缩小它,好像我预计dynamic table size update会这样做。原来,缩小到较小的尺寸会产生不正确的标题。所以显然dynamic table size update只影响远程端点..(嗯,我猜是这样)。我也查找了nigthttp和c#的实现,并且在那里他们实际上缩小了编码器表的大小,同时发送了dynamic table size update信号。我感觉每个人对这个协议都有一个完全不同的实现..这是一个完全可以理解的噩梦。

正如你想出有多个的东西,其指示表的大小:

  • 最大表大小设置(如在一个HTTP/2设置帧指示)
  • 的实际使用的表的大小 - 这在HPACK格式的HEADERS帧编码

如果我们只看这是从客户端(浏览器)流动到服务器,我们将看到下面的东西怎么回事标题:

  • 只要没有人从远程端获得信息,就会使用默认值,这意味着客户端期望服务器支持4kB的最大表大小(SETTINGS_HEADER_TABLE_SIZE),并且它还将此大小用作初始表大小。
  • 服务器可以通过HTTP/2 SETTINGS框架可选地通知客户端它只支持较小的表头。该信息包含在SETTINGS_HEADER_TABLE_SIZE字段中,即从服务器发送到客户端的SETTINGS帧。
  • 客户端可以通过HEADERS帧中的Dynamic Table Size Update调整实际使用的[动态]表头大小。这将始终指示编码器端实际使用的表大小 - 因此也必须在解码器端设置才能检索相同的数据。发送端可以*地将实际使用的表大小设置为介于0和远程端支持的最大大小之间的任何值(在SETTINGS_HEADER_TABLE_SIZE中)。一个典型的实现策略是在目前大于远程支持的情况下总是缩小已用表的大小。并且当远程支持更大的表格时,增加表格大小并且实现也可以更大。可能存在一些竞争状态,其中一端已经设置并且使用比远程端实际支持的表大的大小,例如,因为在客户端编码第一对标头之前没有收到指示下限的SETTINGS帧。在这种情况下,远程端可能会检测到使用太大的表格大小并重置连接。为了避免这种情况,连接的两端实际上应该至少支持4kB的默认表大小,理想情况下只能动态增加限制,而不能缩小。

现在我提到,一对最大。表格大小设置和实际表格大小设置用于从连接(客户端)的一端向另一端(服务器)传输HEADERS。但总的来说,还有第二对,从服务器发送到客户端的头。对于这种情况,客户/浏览器还在设置框中指示最大值有多大。头表是它支持和服务器发送使用的实际头表的大小。