我在这里看图:
https://http2.github.io/http2-spec/#StreamStatesFigure
但是在整个文档中,服务器向客户端发送PUSH_PROMISE
帧,而不是相反(至少现在还没有)。这意味着reserved (remote)
状态仅发生在客户端软件上,而reserved (local)
状态仅发生在服务器软件上。这是真的吗?
IE中。如果我写一个客户端,我想我应该只有60%的状态机用于客户端,60%用于服务器(由于一些重叠是为什么我说60%而不是50%)。想法?
答案 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)
的服务器也是如此。 但是,为了保持流状态同步,最简单(也许唯一)的方法是保持对等状态。事实上,流状态不是关于一个端点,而是两个端点。对于流的生命周期中的任何时刻,流的状态由客户端的状态和服务器的状态。有时它们是相同的(空闲,开放,封闭),有时它们不相同(保留,半封闭)。
话虽如此,我可以理解你为什么这么说,但你真的不应该这么想。 没有客户端流状态和服务器流状态,只有一个流状态,双方都保存了副本。
它有点像硬币,两面有不同的图像。无论你从哪个方向看,硬币都没有变化,但你的名字就是你所看到的一面"正面/本地状态"以及那个你看不到的那个" ;背面/远程状态"。
"远程/本地"状态机图中的措辞非常微妙,值得思考。以下是对重要内容的简要总结:
一个州,两个观点,由两个终点保存 应同步,可以同步,通常不匹配。