为什么 http/2 流 ID 必须升序?

why http/2 stream id must be ascending?

在 RFC 7540 第 5.1.1 节中。 (https://www.rfc-editor.org/rfc/rfc7540#section-5.1.1),指定如下:

The identifier of a newly established stream MUST be numerically greater than all streams that the initiating endpoint has opened or reserved.

我在Google上找了很多,还是没有人解释为什么流ID一定要升序。我看不出将此规则加入协议有任何好处。从我的角度来看,如果服务器只是将“流 ID”视为一个 ID 并使用它来区分 HTTP2 请求,那么乱序流 ID 应该也能正常工作。

所以谁能帮忙解释一下这个规范的确切原因?

非常感谢!

严格升序流 ID 是使它们唯一(每个连接)的简单方法,而且非常容易实现。

选择 - 就像你说的 - "out of order" 流 ID 可能更复杂,因为它需要避免冲突,并且可能会消耗更多资源,因为你必须记住所有正在使用的流 ID。

我认为没有任何特别的理由指定流 ID 必须简单地升序。

6.8。走开

GOAWAY 帧(类型=0x7)用于启动关闭 连接或信号严重的错误情况。 GOAWAY 允许 端点优雅地停止接受新的流,同时仍然 完成对先前建立的流的处理。这使 管理操作,例如服务器维护。

开始新的端点之间存在固有的竞争条件 流和远程发送 GOAWAY 帧。处理这个 在这种情况下,GOAWAY 包含最后一个对等点的流标识符 在发送时已经或可能被处理的发起流 此连接中的端点。例如,如果服务器发送一个 GOAWAY 帧,标识的流是编号最高的流 由客户发起。

发送后,发送方将忽略在由发起的流上发送的帧 如果流的标识符高于包含的标识符,则为接收器 最后一个流标识符。 GOAWAY 框架的接收器不得打开 连接上的附加流,尽管新连接可以 为新流建立。

如果 GOAWAY 的接收者在更高的流上发送了数据 流标识符比 GOAWAY 帧中指示的标识符,那些 流不会或不会被处理。 GOAWAY 的接收器 frame 可以将流视为从未在 全部,从而允许这些流稍后在新的 连接。