当前位置: 首页 > 知识库问答 >
问题:

如果HTTP/1.1客户端与仅HTTP/2的服务器对话,如果HTTP/2客户端与仅HTTP/1.1的服务器对话,该怎么办?

钱和安
2023-03-14

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

共有3个答案

佴德曜
2023-03-14

我试着用curl--http1访问一个只有http2的服务器。1-我,这是我得到的

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.
鲜于光赫
2023-03-14

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

“只支持HTTP/2的浏览器”不存在;如果他们支持HTTP/2,他们也支持HTTP/1.1。但是让我们假设这样的浏览器存在。

在后一种情况下,服务器将看到连接前言,并且不会识别PRI方法。在这种情况下,服务器的具体功能取决于服务器。它可能会返回400错误请求,或者只是关闭连接,或者可能会触发内部服务器错误。

韦叶秋
2023-03-14

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

就像:“嗨,汤姆!我是鲍勃。我会说德语、俄语和英语。让我们聊一会儿”。服务器发送“服务器你好”:

“嗨,鲍勃!我建议你说德语或英语。”。然后客户端再发送一条短消息“好的,那我们说德语吧”,然后他就开始说德语,而不用等待服务器的任何响应:

整个沟通过程如下图所示

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

 类似资料:
  • 创建 HTTP 客户端 使用默认选项创建一个HttpClient实例,如下所示: HttpClient client = vertx.createHttpClient(); 如果您想要在创建时配置客户端的选项,如下所示: HttpClientOptions options = new HttpClientOptions().setKeepAlive(false); HttpClient clien

  • 创建一个 HTTP 服务器 最简单的方法来创建一个 HTTP 服务器,所有选项使用默认的。如下所示: HttpServer server = vertx.createHttpServer(); 配置 HTTP 服务器 如果你不想使用默认值,创建服务器时可以通过传入一个HttpServerOptions实例配置: HttpServerOptions options = new HttpServerO

  • 这是我认为我应该用于这种方法的布局:并且为了适应404路由,还可以使用。现在,如果我的Akka流知识对我有用的话,我需要使用来处理这样的事情,然而,这就是我被困住的地方。 在中,我可以为不同的endpoint进行简单的映射和flatMap,但在流中,这意味着将流划分为多个流,我不太确定该如何进行。我想过使用UnzipWith和Options或通用广播。 如能在这方面提供任何帮助,将不胜感激。 如果

  • Vert.x 允许您轻松地编写非阻塞的 HTTP 客户端和服务器。

  • 我已经使用Jetty9启动了一个spdy代理服务器。 jetty-spdy-proxy.xml:

  • 问题 你需要通过HTTP协议以客户端的方式访问多种服务。例如,下载数据或者与基于REST的API进行交互。 解决方案 对于简单的事情来说,通常使用 urllib.request 模块就够了。例如,发送一个简单的HTTP GET请求到远程的服务上,可以这样做: from urllib import request, parse # Base URL being accessed url = 'ht