【问题标题】:Notify a web browser, which protocol server is using通知网络浏览器,哪个协议服务器正在使用
【发布时间】:2018-07-03 17:51:58
【问题描述】:

作为一个介于服务器和浏览器之间的代理程序,我们如何通知浏览器使用 http1.1 或 http2.0 协议

【问题讨论】:

  • 请提供更多规格(你已经尝试了什么,你有什么,等等)
  • 为什么不用javascript写这个逻辑呢?
  • 更具体地说,我有一个像代理一样的java程序,会从浏览器读取请求并发送到服务器,所以它是一个中间组件。对于 https 网站的 http2.0,我们需要进行 ALPN 协商。这完全可以工作,因为我的代理组件从浏览器读取请求(默认为 http1.1)并使用 ALPN 协议发送到服务器。但问题是如果服务器也支持 ALPN 协议 h2 ,我如何通知浏览器,从下一个开始你必须将你的通信从 http1.1 升级到 http2 协议

标签: java browser http2


【解决方案1】:

答案取决于你的“代理”是浏览器上配置的正向代理,还是服务器上配置的反向代理。

在第一种情况下(正向代理),因为目标方案是https,浏览器将向正向代理发出一个HTTP CONNECT,正向代理将创建一个到服务器的隧道。 创建隧道后,浏览器和服务器将直接与转发代理通信,仅双向转发字节。

在这种情况下,客户端和服务器将通过 ALPN 直接协商协议,因为它们直接通信,转发代理仅转发字节(但不检查或以其他方式更改它们)。

因此在这种情况下,您无需通知客户端任何事情,因为客户端和服务器直接通信。

在第二种情况下(反向代理),浏览器将连接到反向代理,认为它是它的最终目的地。 对于https://example.com 的请求,DNS 将解析反向代理地址,并且反向代理必须提供 example.com 的有效证书。

如果反向代理需要将请求转发到服务器,那么它使用什么协议并不重要,因为客户端永远不会知道反向代理和服务器之间的这种通信。

如果反向代理仅支持 HTTP/1.1 而服务器支持 HTTP/2,则反向代理无法告诉客户端服务器支持 HTTP/2,因为客户端从不直接与服务器对话:客户端只看到反向代理,因为反向代理只支持 HTTP/1.1,所以即使服务器支持,它们也永远无法使用 HTTP/2。

如果反向代理同时支持 HTTP/1.1 和 HTTP/2,那么客户端和反向代理将使用 HTTP/2。反向代理与服务器使用什么协议无关紧要:它可以是 HTTP/1.1、HTTP/2、FastCGI 等。但是反向代理与服务器使用的协议对客户端不感兴趣,因为客户端将永远无法直接与服务器对话。

客户端只与反向代理通信,因此它们协商的协议是唯一对客户端重要的协议。

在这种情况下,您也不需要通知客户端任何事情,因为客户端只能与代理通信,并且只能使用它与代理协商的协议。

【讨论】:

  • 好的,但是在连接之后,代理程序正在回复客户端 200 ok 然后执行所有步骤,如 DNS 解析,网络连接,然后与 ALPN 握手。在这一步之后,如果您尝试读取客户端输入流,您仍然会收到 HTTP1.1 请求,而不是 HTTP2.0 帧。
  • 代理正在使用 HTTP/1.1 向客户端回复 200,因此与客户端的通信是 HTTP/1.1。如果代理执行所有步骤,如 DNS、TCP 连接和与 ALPN 的 TLS 握手与 服务器,这与与客户端的通信无关。
  • 那么如何回复客户端说服务器支持http2.0呢?
  • 你不能。您必须放弃“告诉客户端服务器使用什么协议”的想法。客户端只与代理对话,从不与服务器对话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多