在 http2-spec 中,服务器半关闭流的场景(服务器发送 http2.END_STREAM),仍然允许客户端发送数据(因为它是半关闭的)。
考虑以下 gRPC 场景:
- 客户端打开双向流到服务器并开始发送数据
- 服务器关闭响应流并发送状态预告片(转换为发送 http2.END_STREAM)
- 客户端继续发送数据
gRPC 中的语义定义是否明确?
可能的方式:
- 遵循http2-spec:允许客户端继续发送由服务器处理的数据。
- 不遵循 http2-spec:如果服务器关闭流,客户端连接将被隐式终止。
注意:我刚刚测试过,它看起来像 Java 的 gRPC 遵循变体“不遵循 http2-spec”,即如果服务器关闭向下的流,则向上的流也被关闭。