WINDOW_UPDATE HTTP / 2框架

时间:2018-07-26 12:02:09

标签: http2

接收机应以什么频率发送WINDOW_UPDATE帧? 我已经测试了HTTP / 2客户端,该客户端与HTTP / 2服务器建立了HTTP / 2,并进行了Magic,SETTNGS帧(64K窗口大小)交换。现在,客户端无法向服务器发送超过64K大小的数据。

2 个答案:

答案 0 :(得分:0)

根据the HTTP2 specification,需要发送WINDOW_UPDATE帧来调整发送窗口。初始状态描述如下:

  

首次建立HTTP / 2连接时,将创建初始流控制窗口大小为65,535个八位位组的新流。连接流控制窗口也是65,535个八位位组。两个端点都可以通过在构成连接前言一部分的SETTINGS帧中包含SETTINGS_INITIAL_WINDOW_SIZE的值来调整新流的初始窗口大小。只能使用WINDOW_UPDATE框架更改连接流控制窗口。

根据我对规范的阅读,您在每次用尽窗口缓冲区时都需要发送WINDOOW_UPDATE。在一个示例中对此进行了描述,如下所示:

  

例如,如果客户端在建立连接后立即发送60 KB,并且服务器将初始窗口大小设置为16 KB,则客户端将在收到SETTINGS帧后重新计算可用的流控制窗口为-44 KB 。客户端将保留否定的流控制窗口,直到WINDOW_UPDATE帧将窗口恢复为正,然后客户端才能继续发送。

因此,作为发送方,您需要在不占用窗口缓冲区的任何时候调整窗口缓冲区的大小。您需要跟踪要发送的数据量和当前窗口缓冲区的大小,并相应地发送WINDOW_UPDATE。

答案 1 :(得分:0)

  

接收机应以什么频率发送WINDOW_UPDATE帧?

接收机决定的频率。您不必确认每条消息,也不必等到整个窗口用完。

Nghttp(一种流行的HTTP / 2库,服务器和客户端),例如sends it when 50% of the window has been used up

int nghttp2_should_send_window_update(int32_t local_window_size,
                                      int32_t recv_window_size) {
  return recv_window_size > 0 && recv_window_size >= local_window_size / 2;
}
  

我已经测试了HTTP / 2客户端,该客户端与HTTP / 2服务器建立了HTTP / 2,并进行了Magic,SETTNGS帧(64K窗口大小)交换。现在,客户端无法向服务器发送超过64K大小的数据。

如果服务器没有发送WINDOWS_UPDATE框架以允许客户端发送更多数据,我并不感到惊讶。这就是WINDOWS_UPDATE框架的关键-避免淹没无法跟上的一方。但是,由接收方(在本例中为服务器)发送WINDOWS_UPDATE帧以告知客户端它可以发送更多消息。因此,如果仅使用HTTP / 2客户端进行测试,则这不在您的控制范围内。