在http2中,半收盘做了什么?http2中本地和远程流内状态的区别是什么?

在http2中,半收盘做了什么?http2中本地和远程流内状态的区别是什么?,http,https,netty,http2,Http,Https,Netty,Http2,在http2中,半收盘做了什么?http2中本地和远程流内状态的区别是什么 我已经看到:在流的生命周期中保留(本地)->半关闭(远程) 为什么从本地到远程?为什么不保留(本地)->半封闭(本地)?每个流将有两个不同的视点-客户端和服务器、请求者和提供者。随你怎么说 因此,在发送推送承诺时使用“保留”状态。此时,服务器已声明它打算在另一个流上推送资源,因此流标识符是保留的,并且不能用于除此推送资源之外的任何内容 此时,服务器会看到如下情况: 它将是服务器启动的流,因此将是偶数流 服务器已保留流i

在http2中,半收盘做了什么?http2中本地和远程流内状态的区别是什么

我已经看到:
在流的生命周期中保留(本地)->半关闭(远程)


为什么从本地到远程?为什么不
保留(本地)->半封闭(本地)

每个流将有两个不同的视点-客户端和服务器、请求者和提供者。随你怎么说

因此,在发送推送承诺时使用“保留”状态。此时,服务器已声明它打算在另一个流上推送资源,因此流标识符是保留的,并且不能用于除此推送资源之外的任何内容

此时,服务器会看到如下情况:

  • 它将是服务器启动的流,因此将是偶数流
  • 服务器已保留流id本身-远程客户端未保留该id。因此
    保留(本地)
  • 然后它将发送标头帧响应。此时,服务器已开始发送资源,因此,当发生这种情况时,HTTP/2基本上表示从客户端的角度来看,流已关闭-它是侦听传入数据,但不发送任何数据(除了WINDOWS_UPDATE、PRIORITY或RST_stream frames等控制信号)。流现在实际上是单向或半封闭的,它对发送任何数据的远程客户端是封闭的,但本地服务器仍然可以发送数据-因此
    半封闭(远程)
客户将从相反的角度看到完全相同的流程:

  • 从PUSH_承诺中,它知道一条流已经被保留,并且它应该期望它很快进入
  • 由于流是服务器启动的流,它不是客户端创建的流,因此它被视为远程保留流-因此
    reserved(remote)
  • 在服务器开始发送数据后,客户机知道不允许在该流上发送任何数据(不是说它真的是用于推送承诺流,而是仍然)。它可以重新确定推送资源的优先级(使用优先级帧),甚至取消推送资源(使用RST_流帧),但这就是它所能做的(使用WINDOWS_更新帧确认数据接收除外)。因此,流被限制为客户端可以在其上发送什么-或者规范更喜欢说它对于任何客户端(也称为本地)请求都是半关闭的-因此
    半关闭(本地)

理解这一点的关键是要认识到,请求并不是从一边流到另一边,而是同时从两边流到另一边!这取决于你是从发送者还是接收者的角度来看它。

你的解释太好了!!非常感谢你!!我还有一个问题,为什么PUSH_PROMISE只是一个标题?在rfc中,
推送承诺框架(带有隐含的延续)
,这意味着通过发送推送承诺,数据/内容也应该被发送?但是似乎数据/内容是通过发送标题而不是PP发送的?为什么要感谢您的称赞呢!如果你喜欢我的答案的风格,并且想了解更多关于HTTP/2的信息,而不是一个SO问题,那么请看看我的书:我一定会看看你的书!推送承诺不是推送资源。这是一个虚拟请求,其作用类似于该资源的传入标头请求,如果该请求以正常方式传入,而不是由服务器推送,则该请求看起来会是这样。所以正常的请求是:头(已发送)、头(已接收)、数据(已接收)。推送资源是:推送承诺(已接收)、头(已接收)、数据(已接收)。由于只有GET请求可以被推送,所以并没有一个机构可以承诺推送。需要PUSH_PROMISE框架来警告客户端即将有一个传入的请求以及将打开的流id。明白!非常感谢您提供的详细信息!