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

HTTP2: How to implement flow control feature?

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

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

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

Jetty 实现基于 class FlowControlStrategy

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

在这两种情况下,FlowControlStrategy 从 HTTP/2 实现接收事件,特别是:

  1. 当一个 DATA 帧被发送到另一个点时
  2. 当从另一个对等点接收到 WINDOW_UPDATE 帧时
  3. 当从另一个对等点接收到数据帧时
  4. 当应用程序使用接收到的数据时

在数据发送到其他对等点的情况下,"send" 流量控制 window 减少;当从另一个对等方接收到 WINDOW_UPDATE 帧时,"send" 流量控制 window 增加。

同样,当接收到数据时,"receive" 流量控制 window 减少;当应用程序使用接收到的数据时,"receive" 流量控制 window 会增加 - 并且可能会向另一个对等方发送 WINDOW_UPDATE 帧以表示它可以发送更多数据。

HTTP/2实现需要检查这两个流量控制windows,当"send"流量控制window达到零(或负数)时停止发送数据;如果在 "receive" 流量控制 window 为零(或负数)时接收数据,则连接失败。 收到 WINDOW_UPDATE 帧后,HTTP/2 实现需要恢复发送数据。

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

玩得开心!