HTTP / 2绝对是未来趋势,因为它现在是HTTP协议的标准。正如我们在Can I use中看到的,70.15%的浏览器支持HTTP / 2。但HTTP / 2是如此新颖,以至于只有支持HTTP / 1.x的浏览器,并且有许多服务器只支持HTTP / 1.x.我知道客户端可以使用HTTP升级机制来协商正确的协议以与服务器通信。例如,如果服务器支持HTTP / 2,则它们的通信协议将切换到HTTP / 2,否则使用HTTP / 1.x.但这仅适用于客户端使用的浏览器支持HTTP / 2和HTTP / 1.x的情况,对吗?
但是,如果浏览器上仅支持HTTP / 1.x的用户想要与仅HTTP / 2服务器通信呢?服务器是否会忽略该请求或将错误发送回用户?
如果只支持HTTP / 2的浏览器上的用户想要与仅HTTP / 1.1服务器通信,该怎么办?我认为这个过程可能是这样的:用户向服务器发送连接前言,服务器无法识别请求,因此用户可能会收到连接错误消息。这是对的吗?
或者是否有任何浏览器仅支持HTTP / 2?
答案 0 :(得分:14)
重要的是要考虑到HTTP / 2的大多数实现都使用它来通过带有ALPN协议(应用层协议协商)的TLS 1.2。因此,客户端只需启动标准TLS连接。作为此类通信的一部分,客户端向服务器发送“Client Hello”并提供一些信息:
就像:“嗨,汤姆!这是鲍勃。我说德语,俄语和英语。让我们谈谈一下”。服务器发送“服务器Hello”:
“嗨,鲍勃!我建议说德语或英语”。然后客户端发送一条短消息“好的,然后让我们说德语”,他开始说德语而不等待服务器的任何回复:
整个沟通如下图所示
因为客户端和服务器都只使用TLS 1.2启动通信,这两者都知道。他们在协议协商后启动主要通信 。因此,您描述的问题在实践中可能不存在。
答案 1 :(得分:5)
如果浏览器仅支持HTTP / 1.1且服务器仅支持HTTP / 2,则它们无法通信。服务器无法识别客户端发送的内容(特别是没有连接前言,服务器会按照规范处理 - 作为连接错误),并将关闭连接。
"仅支持HTTP / 2"的浏览器不存在;如果它们支持HTTP / 2,它们也支持HTTP / 1.1。但是,我们假设这样的浏览器存在。
在后一种情况下,服务器将看到连接前言,并且无法识别PRI
方法。在这种情况下,服务器究竟做了什么取决于服务器。它可能会返回400 Bad Request
,或者可能只是关闭连接,或者它可能会触发内部服务器错误。
答案 2 :(得分:0)
我尝试使用curl --http1.1 -i
访问仅使用http2的服务器,这是我得到的
HTTP/1.0 403 Forbidden
Content-Type: text/plain
Unknown ALPN Protocol, expected `h2` to be available.
If this is a HTTP request: The server was not configured with the `allowHTTP1` option or a listener for the `unknownProtocol` event.