流生命周期的http2规范状态机是否应分为客户端和服务器?

时间:2016-12-27 02:02:55

标签: http2

我在这里看图:

https://http2.github.io/http2-spec/#StreamStatesFigure

但是在整个文档中,服务器向客户端发送PUSH_PROMISE帧,而不是相反(至少现在还没有)。这意味着reserved (remote)状态仅发生在客户端软件上,而reserved (local)状态仅发生在服务器软件上。这是真的吗?

IE中。如果我写一个客户端,我想我应该只有60%的状态机用于客户端,60%用于服务器(由于一些重叠是为什么我说60%而不是50%)。想法?

2 个答案:

答案 0 :(得分:2)

这是正确的,来自RFC 7540, section 8.2.1 Push Requests

  

PUSH_PROMISE帧不得由客户端发送。

并且,如您所述,RFC继续:

  

发送PUSH_PROMISE帧会创建一个新流,并将流置于服务器的“保留(本地)”状态和客户端的“保留(远程)”状态。

我只想补充一点,客户可以通过在SETTINGS_ENABLE_PUSH框架中将SETTINGS设置为false来禁用推送。因此,如果您正在实施自己的客户,也可以完全退出该部分。

答案 1 :(得分:1)

正如弗雷德里克解释的那样,第一个问题的答案是"是"

本声明

  

我想我应该只有60%的状态机用于客户端,60%用于服务器

不是很准确。

确实,客户端永远不会进入reserved(local)状态,对于具有reserved(remote)的服务器也是如此。 但是,为了保持流状态同步,最简单(也许唯一)的方法是保持对等状态。事实上,流状态不是关于一个端点,而是两个端点。对于流的生命周期中的任何时刻,流的状态由客户端的状态和服务器的状态。有时它们是相同的(空闲,开放,封闭),有时它们不相同(保留,半封闭)。

话虽如此,我可以理解你为什么这么说,但你真的不应该这么想。 没有客户端流状态和服务器流状态,只有一个流状态,双方都保存了副本。

它有点像硬币,两面有不同的图像。无论你从哪个方向看,硬币都没有变化,但你的名字就是你所看到的一面"正面/本地状态"以及那个你看不到的那个" ;背面/远程状态"。

"远程/本地"状态机图中的措辞非常微妙,值得思考。以下是对重要内容的简要总结:

一个州,两个观点,由两个终点保存 应同步,可以同步,通常不匹配。