【问题标题】:How to force HTTP2 client to reconnect to server?如何强制 HTTP2 客户端重新连接到服务器?
【发布时间】:2017-03-10 20:40:31
【问题描述】:

需要进行 HTTP2 响应,这将强制客户端重新连接到同一地址的同一服务器。

在 HTTP/1.1 的情况下,可以发送带有 Connection: close 标头的 307 Temporary Redirect 响应。

在 HTTP/2 中,Connection: close 标头被忽略,并且在不重新连接的情况下执行重定向,这会导致重定向循环错误。

另外,我尝试使用相同的 url 向客户端发送 421 Misdirected Request 响应,但 Chrome 浏览器在收到此响应后什么也不做。

强制 HTTP/2 客户端重新连接的最正确方法是什么?可以发送哪个服务器响应?也许是某种GOAWAY 框架?

【问题讨论】:

  • 强制断开/重新连接的目的是什么?您确定没有针对您的问题不需要需要断开现有连接的 HTTP 2 解决方案吗?

标签: server-side http2 reconnect


【解决方案1】:

遵循 RFC 7540 建议的正常关闭程序应该会导致重新连接:

试图正常关闭连接的服务器 应该发送带有最后一个流标识符的初始 GOAWAY 帧 设置为 2^31-1 和 NO_ERROR 代码。这向客户发出信号 关闭迫在眉睫,发起进一步的请求是 禁止。在为任何进行中的流创建留出时间之后 (至少一个往返时间),服务器可以发送另一个GOAWAY 具有更新的最后一个流标识符的帧。这确保了一个 可以干净地关闭连接而不会丢失请求。

关于 Chrome 中的 421 处理,此错误 https://bugs.chromium.org/p/chromium/issues/detail?id=546991 已打开以使 Chrome 重新打开与服务器的新连接,最近出现了一些活动。

【讨论】:

    【解决方案2】:

    是的,HTTP/2 要求客户端重新连接以获取更多请求的方式是向其发送 GOAWAY 帧。它的工作原理取决于您的服务器端实现或 HTTP/2 支持框架。例如。框架可以拦截您的 Connection: close 标头并将其视为在请求后关闭连接的请求。但我猜大多数 HTTP/2 实现都不喜欢这样做,因为他们猜测标头仅针对当前请求范围,而不是整个连接。或者,框架可以在请求处理程序中提供一种方式,不仅可以访问请求和响应数据,还可以获取对 HTTP/2 连接的引用,该连接可用于发送 GOAWAY。

    【讨论】:

      【解决方案3】:

      这可能会帮助你Google HTTP2

      【讨论】:

      • 在链接中找不到任何关于服务器如何强制客户端重新连接的信息。
      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多