【发布时间】:2018-07-27 02:17:27
【问题描述】:
接收方应该以什么频率发送WINDOW_UPDATE 帧?
我已经测试了 HTTP/2 客户端,它与 HTTP/2 服务器建立了 HTTP/2,并进行了 Magic、SETTNGS 帧(64K 窗口大小)交换。现在客户端无法向服务器发送超过 64K 大小的数据。
【问题讨论】:
标签: http2
接收方应该以什么频率发送WINDOW_UPDATE 帧?
我已经测试了 HTTP/2 客户端,它与 HTTP/2 服务器建立了 HTTP/2,并进行了 Magic、SETTNGS 帧(64K 窗口大小)交换。现在客户端无法向服务器发送超过 64K 大小的数据。
【问题讨论】:
标签: http2
接收方应该以什么频率发送 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 客户端进行测试,这将不在您的控制范围内。
【讨论】:
根据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。
【讨论】: