half close 在 http2 中的作用是什么? http2 中流状态中本地和远程之间的区别是什么?

What the half close does in http2? What the diff between local and remote in stream state in http2?

http2 中的 half close 有什么作用? http2 中本地和远程流状态的区别是什么?

我已经看到:reserved(local) --> half closed(remote) 在流的生命周期中。

为什么本地到远程?为什么不 reserved(local) --> half closed(local)

每个流将有两个不同的视点——客户端和服务器、请求者和提供者。随心所欲。

所以 "reserved" 状态在发送 PUSH_PROMISE 时使用。此时服务器已经声明它打算将资源推送到另一个流上,因此流标识符被保留并且不能用于除此推送资源之外的任何内容。

此时服务器看到的是这样的:

  • 这将是一个服务器启动的流,因此将是一个偶数编号的流。
  • 服务器自己保留了流 ID - 它不是由远程客户端保留的。因此 reserved (local)
  • 然后它将发送 HEADERS 帧响应。此时服务器已经开始发送资源,所以当这种情况发生时 HTTP/2 基本上表示从客户端的角度来看流已关闭 - 它是为了监听传入的数据,但不发送任何数据(控制信号除外)例如 WINDOWS_UPDATE、优先级或 RST_STREAM 帧)。该流现在实际上是单向的或 半封闭 并且它对发送任何数据的远程客户端关闭,但仍然允许本地服务器发送数据 - 因此 half closed (remote)

客户端将从相反的角度看到完全相同的流程

  • 它从 PUSH_PROMISE 知道一个流已经被保留,它应该很快就会进来。
  • 由于流是服务器启动的流,它不是客户端创建的流,因此它被视为远程保留的流 - 因此 reserved (remote)
  • 服务器开始发送数据后,客户端知道它不允许在该流上发送任何数据(并不是说它真的是用于 Push Promise 流,但仍然如此)。它可以重新确定推送资源的优先级(使用 PRIORITY 帧)甚至取消它(使用 RST_STREAM 帧),但这就是它所能做的(除了使用 WINDOWS_UPDATE 帧确认收到数据之外)。因此,流在客户端可以发送的内容方面受到限制 - 或者正如规范更喜欢说它是 half-closed 对于任何客户端(又名本地)请求 - 因此 half-closed (local).

理解 HTTP/2 state model 的关键是要认识到请求不会流向一侧或另一侧 - 而是同时流向两侧!这仅取决于您是从发送者还是接收者的角度来看待它。