【问题标题】:why http/2 stream id must be ascending?为什么 http/2 流 id 必须升序?
【发布时间】:2017-07-31 21:21:37
【问题描述】:
在 RFC 7540 第 5.1.1 节中。 (https://www.rfc-editor.org/rfc/rfc7540#section-5.1.1),具体如下:
新建立的流的标识符在数值上必须大于发起端点已打开或保留的所有流。
我在 Google 上搜索了很多,但仍然没有人解释为什么流 ID 必须按升序排列。我看不出对协议制定这条规则有什么好处。在我看来,如果服务器只是将“流 ID”视为一个 ID 并使用它来区分 HTTP2 请求,那么乱序流 ID 也应该可以很好地工作。
那么任何人都可以帮助解释这个规范的确切原因吗?
非常感谢!
【问题讨论】:
标签:
http2
rfc
multiplexing
【解决方案1】:
6.8。离开
GOAWAY 帧(类型=0x7)用于启动关闭
连接或发出严重错误情况的信号。 GOAWAY 允许一个
端点优雅地停止接受新流,同时仍然
完成对先前建立的流的处理。这使
管理操作,例如服务器维护。
开始新的端点之间存在固有的竞争条件
流和远程发送 GOAWAY 帧。为了处理这个
情况下,GOAWAY 包含最后一个对等点的流标识符
已或可能在发送时处理的已启动流
在这方面的端点。例如,如果服务器发送一个
GOAWAY 帧,识别的流是最高编号的流
由客户端发起。
一旦发送,发送者将忽略在由发起的流上发送的帧
如果流的标识符高于包含的标识符,则接收者
最后一个流标识符。 GOAWAY 帧的接收器不得打开
连接上的附加流,尽管新连接可以
为新的流建立。
如果 GOAWAY 的接收者在流上发送了更高的数据
流标识符比 GOAWAY 帧中指示的,那些
流不会或不会被处理。 GOAWAY 的接收者
frame 可以将流视为从未在
all,从而允许这些流稍后在新的
连接。
【解决方案2】:
严格递增的流 ID 是使它们唯一(每个连接)的一种简单方法,并且非常容易实现。
选择——就像你说的——“乱序”流 ID 可能更复杂,因为它需要避免冲突,并且可能会消耗更多资源,因为你必须记住所有正在使用的流 ID。
我认为没有任何特别的理由来指定流 ID 必须是升序的,而不是简单的。