我很困惑,因为它看起来对我来说就像不同的来源说不同的事情,我真的不明白它:
“层”是指在套接字接口和暴露给我们的应用程序的更高的 HTTP API 之间引入新的优化编码机制的设计选择:HTTP 语义,例如动词、方法和标头,不受影响,但它们的方式不同之处在于在运输过程中进行编码。与换行符分隔的纯文本 HTTP/1.x 协议不同,所有 HTTP/2 通信都分为更小的消息和帧,每个消息和帧都以二进制格式编码。因此,客户端和服务器都必须使用新的二进制编码机制来相互理解:HTTP/1.x 客户端无法理解仅 HTTP/2 的服务器,反之亦然。
支持 HTTP/2 的客户端可以向服务器发送 HTTP/2 请求。但是,如果服务器仅支持 HTTP/1.1 并且不理解 HTTP/2,它将使用 HTTP/1.1 响应进行响应。当客户端尝试对尚未采用较新的 HTTP/2 协议的服务器使用该协议时,可能会发生这种情况。
我了解到它们有不同的数据格式:HTTP 1.1 包含文本,而 HTTP 2 包含二进制数据。我尝试用谷歌搜索它,甚至尝试翻译它,因为英语不是我的母语。
我还发现如果 HTTP/1.1 客户端与仅 HTTP/2 服务器通信会怎样,如果 HTTP/2 客户端与仅 HTTP/1.1 服务器通信会怎样?
HTTP2 中还有用于标头压缩的帧和表
要事第一;
这是有点错误的,当仅 HTTP/2 的服务器收到 HTTP/1.1 请求时,因为它无法理解它,所以服务器端会出现错误,因此客户端可能无法解析响应或不会有响应基于服务器实现。实际上,几乎所有服务器都支持这两种协议。这就是为什么引用的文本会这样说。这很令人困惑。
那句话应该是这样的;
“如果服务器仅支持 HTTP/1.1 并且不理解 HTTP/2,客户端将发送 HTTP/1.1 请求,服务器将以 HTTP/1.1 进行响应。如果客户端不支持 HTTP/1.1,客户端将抛出错误”
当 TLS 握手发生时,服务器发送 ALPN 协议,这是支持协议的字符串列表,对于大多数服务器来说它是 ["h2","http1.1"],然后客户端查看那里是否有支持的协议,选择按照服务器指定的顺序之一。因此,对于您的前端项目,您不需要指定有关 HTTP/2 或 HTTP/1.1 的任何内容,浏览器会自动处理该协议协商。
您链接的 stackoverflow 答案解释得非常好。