http2 – 关于HTTP / 2 RFC实现的流控制问题

我正在构建一个http / 2客户端,我对rfc以及如何处理实现有疑问,特别是在流量控制方面.

我知道流量控制使用基于信用的窗口大小系统,但我对如何处理耗尽窗口的情况有点不确定.

>我是否只是无限期地阻止,直到WINDOW_UPDATE帧释放了什么?或者合理的超时是什么?
>当窗口耗尽时,我暂停发送所有帧吗? RFC规定流中帧的顺序是重要的,特别是对于报头和数据帧,但它没有明确声明在窗口耗尽时应暂停所有帧.这对我来说有点模棱两可,因为数据帧是唯一可以计算窗口大小的数据帧.那么我应该阻止发送所有帧或只是标题/数据?这个答案对于连接流控制上下文与流流控制上下文有什么不同?

最佳答案 连接中的所有数据帧都有一个流控制窗口,然后每个流都有一个流控制窗口.

1.-如果连接窗口耗尽,则暂停发送任何流的DATA帧,直到获得WINDOWS_UPDATE.您可以实现超时.如果超时到期,您唯一的补救措施是关闭连接并重试.

2.-如果流连接窗口耗尽,则仅暂停该流.

在所有情况下,您只暂停DATA帧.其他类型的帧不受流量控制的影响.

如果您正在实现客户端而不是服务器,则您更关心自己发送WINDOW_UPDATE帧.除非您正在进行大量的POST和PUT,即将数据发送到服务器.

根据我作为HTTP/2 server开发人员的经验,我发现在我称之为“train”的组中管理HTTP / 2帧非常方便.对于除HEADERS,PUSH_PROMISE和CONTINUATION之外的所有帧,列车仅由帧组成.对于HEADERS和PUSH_PROMISE,列车由该帧和任何后续的CONTINUATION帧组成.然后将列车置于具有以下级别的优先级队列中(首先具有最高优先级):

> PING帧:您希望对等体准确地确定延迟,因此您可以在收到这些帧时尽快处理这些帧,并尽快发送答案.
> SETTINGS,WINDOW_UPDATE,RST_STREAM,GO_AWAY
> PUSH_PROMISE和HEADERS列车. HTTP / 2规范允许两种(实际上是三种)HEADERS帧类型:作为HTTP头部发送的帧和预告片.我在这里谈论的是第一个.
>数据帧.如果要实现优先级,则可能需要在此处进一步确定框架的优先级.

每当通道可用于发送时,您将在优先级队列中发送优先级最高的列车.

点赞