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:如何实现流量控制功能?的主要内容,如果未能解决你的问题,请参考以下文章