如果 HTTP/1.1 客户端与仅 HTTP/2 服务器通信,如果 HTTP/2 客户端与仅 HTTP/1.1 服务器通信怎么办?

What if an HTTP/1.1 client talk to an HTTP/2 only server and what if an HTTP/2 client talk to an HTTP/1.1 only server?

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的浏览器?

如果浏览器只支持HTTP/1.1,服务器只支持HTTP/2,则无法通信。服务器将无法识别客户端发送的内容(特别是没有连接前言,服务器将按照规范将其视为连接错误),并将关闭连接。

"A browser that only supports HTTP/2"不存在;如果他们支持 HTTP/2,他们也支持 HTTP/1.1。但是让我们假设存在这样的浏览器。

在后一种情况下,服务器将看到连接前言并且不会识别PRI 方法。服务器在这种情况下具体做什么取决于服务器。它可能 return 一个 400 Bad Request,或者可能只是关闭连接,或者它可能触发内部服务器错误。

重要的是要考虑到 HTTP/2 的大多数实现都通过 TLS 1.2 和 ALPN 协议(应用层协议协商)使用它。因此,客户端只是启动标准的 TLS 连接。作为这种通信的一部分,客户端向服务器发送 "Client Hello" 一些信息:

就像:"Hi, Tom! It's Bob. I speak German, Russian and English. Let's talk a little"。服务器发送 "Server Hello":

"Hi, Bob! I suggest to speak German or English"。然后客户端再发送一条短信"OK, then let's speak German",他开始说德语而不等待服务器的任何响应:

整个通信如下图所示

因为客户端和服务器都使用双方都知道的 TLS 1.2 开始通信。他们在协议协商后开始主要通信。因此,您所描述的问题在实践中是不存在的。

我尝试使用 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.