HTTP2:如何实现流量控制功能?

Posted

技术标签:

【中文标题】HTTP2:如何实现流量控制功能?【英文标题】:HTTP2: How to implement flow control feature? 【发布时间】:2019-05-21 17:36:41 【问题描述】:

我正在研究http2的一些特性,其中之一是Flow Control,想了解我该如何实现它

如果可以的话,给我一个例子或演示。 谢谢。

【问题讨论】:

【参考方案1】:

我在Jetty(Java HTTP 和 WebSocket 服务器)中实现了 HTTP/2,所以我可以指出它是如何在 Jetty 中实现的 - 但您可以查看其他实现 HTTP/2 的开源项目和看看他们是怎么做到的。

Jetty 实现基于类FlowControlStrategy。

有两种实现方式,一种是幼稚的(SimpleFlowControlStrategy),一种是更高效的(BufferingFlowControlStrategy)。

在这两种情况下,FlowControlStrategy 都会接收来自 HTTP/2 实现的事件,特别是:

    当 DATA 帧发送到其他对等方时 当收到来自其他对等方的 WINDOW_UPDATE 帧时 从其他对等方接收到 DATA 帧时 当接收到的数据被应用程序消费时

如果有数据发送到其他对等点,“发送”流控制窗口会减小;当从其他对等方接收到 WINDOW_UPDATE 帧时,“发送”流控制窗口会增加。

类似地,当接收到数据时,“接收”流控制窗口会减小;当应用程序使用接收到的数据时,“接收”流控制窗口会增加 - 并且可能会向其他对等方发送 WINDOW_UPDATE 帧以表示它可以发送更多数据。

HTTP/2 实现需要检查这两个流控窗口,并在“发送”流控窗口达到零(或负数)时停止发送数据;如果在“接收”流控制窗口为零(或负数)时接收到数据,则连接失败。 在收到 WINDOW_UPDATE 帧后,HTTP/2 实现需要恢复发送数据。

这是在 HTTP/2 中应该如何实现流控制的基础。根据所使用的技术和实现细节,还有很多事情需要处理,例如数据队列、数据复制、线程安全等,但您可以在编写实现时解决这些问题。

玩得开心!

【讨论】:

感谢您的回答。我目前正在研究.net framework/.net core。您能给我一些建议或想法吗?我可以实现吗? 更多详情请见specification。更多细节需要多个问题和多个答案,而 *** 不是长时间讨论的正确平台。随时加入Jetty mailing list 并在那里发布问题。 非常感谢。顺便说一句,你知道如何在 HTTP1/HTTP1.1 上实现这个。如果大约请给我关键词来研究或演示。谢了。 ibb.co/H7y13pM HTTP/1.1 不需要实现流控,因为它依赖于 TCP 流控。

以上是关于HTTP2:如何实现流量控制功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制网速?怎么控制流量?

tcp流量控制与拥塞控制

tcp流量控制与拥塞控制

dataX的流量控制

计算机网络 | 谈谈TCP的流量控制与拥塞控制

FISCO BCOS流量控制实现