2

http2 规范说:

接收者必须将在既不是“打开”也不是“半关闭(本地)”的流上接收到 PUSH_PROMISE 视为 PROTOCOL_ERROR 类型的连接错误(第 5.4.1 节)。但是,在相关流上发送 RST_STREAM 的端点必须处理可能在接收和处理 RST_STREAM 帧之前创建的 PUSH_PROMISE 帧。

规范也有这个生命周期图

我的理解是,为了让客户端PUSH_PROMISE在流上接收 a,客户端必须在该流上拥有所有这些:

  • HEADERS帧(+ any CONTINUATIONs)发送到服务器
  • 未收到END_STREAM来自服务器的标志
  • 未收到RST_STREAM来自服务器的帧

(这里值得注意的是“未将RST_STREAM帧发送到服务器”,这将导致流被“关闭”;上面的引用说这不是连接错误的理由。)

在不满足这些条件的任何情况下,客户端必须将接收到 PUSH_PROMISE 视为连接错误。

这是一个正确的理解吗?

4

1 回答 1

1

你的理解是正确的。

HTTP/2 协议PUSH_PROMISE将流与现有流相关联,称为关联流

关联的流必须满足问题中引用的规范部分中定义的条件;问题中的项目符号列表是规范部分所说的另一种说法。

于 2018-01-14T20:51:58.993 回答