WINDOW_UPDATE
帧应该在什么频率下由接收器发送?我有测试HTTP/2客户端,它建立HTTP/2与HTTP/2服务器和做魔术,SETTNGS框架(64K窗口大小)交换。现在,客户端无法向服务器发送超过64K大小的数据。
发布于 2018-07-26 10:17:27
WINDOW_UPDATE帧应该在什么频率下由接收器发送?
无论接收者决定什么频率。您不需要确认每条消息,但也不应该等到整个窗口都用完了。
Nghttp (一个流行的HTTP/2库、服务器和客户端),例如在50%的窗口已用完时发送
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服务器和做魔术,SETTNGS框架(64K窗口大小)交换。现在,客户端无法向服务器发送超过64K大小的数据。
如果服务器没有发送WINDOWS_UPDATE帧以允许客户端发送更多数据,我并不感到惊讶。这就是WINDOWS_UPDATE框架的要点--避免淹没一个无法跟上的政党。但是,应该由接收方(本例中的服务器)发送WINDOWS_UPDATE帧,以告诉客户端它能够发送更多内容。因此,如果您只使用HTTP/2客户端进行测试,则这不在您的控制范围之内。
发布于 2018-07-26 04:24:46
根据HTTP2规范,需要发送WINDOW_UPDATE帧来调整发送窗口。这里描述了初始状态:
当首次建立HTTP/2连接时,将创建初始流控制窗口大小为65,535辛特的新流。连接流控制窗口也是65,535个八位数。两个端点都可以通过在构成连接序言部分的设置框架中包含SETTINGS_INITIAL_WINDOW_SIZE值来调整新流的初始窗口大小。连接流控制窗口只能使用WINDOW_UPDATE帧进行更改.
根据我对规范的解读,在耗尽窗口缓冲区时,您需要发送一个WINDOOW_UPDATE。在一个示例中对此进行了如下描述:
例如,如果客户端在连接建立时立即发送60 KB,而服务器将初始窗口大小设置为16 KB,客户端将在收到设置帧时重新计算可用的流控制窗口为-44 KB。客户端保留一个负流控制窗口,直到WINDOW_UPDATE框架将窗口恢复为正,然后客户端可以继续发送。
因此,作为发送方,您需要随时调整窗口缓冲区大小,否则就会耗尽窗口缓冲区。您需要跟踪发送的数据以及当前窗口缓冲区大小,并相应地跟踪发送window _UPDATE。
https://stackoverflow.com/questions/51538391
复制相似问题