如果一个HTTP/1.1客户端与仅支持HTTP/2的服务器通信会发生什么?如果一个HTTP/2客户端与仅支持HTTP/1.1的服务器通信会发生什么?

11
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个回答

29
值得注意的是,大多数HTTP/2的实现都使用TLS 1.2和ALPN协议(应用层协议协商)。因此,客户端只需启动标准的TLS连接即可。在此通信过程中,客户端向服务器发送“Client Hello”带有一些信息: enter image description here 就像这样:"嗨,汤姆!我是鲍勃。我会说德语、俄语和英语。我们来聊聊吧"。然后服务器发送"Server Hello": enter image description here "嗨,鲍勃!我建议说德语或英语。" 然后客户端再发送一条短消息 "好的,那我们说德语" ,他开始讲德语而不等待服务器的任何响应: enter image description here 整个通信过程看起来就像下面的图片: enter image description here 因为客户端和服务器都只使用已知的TLS 1.2协议来开始通信,他们在协议协商之后才开始主要通信。因此,您所描述的问题在实践中不可能存在。

为了按照您所描述的方式工作,服务器需要支持https吗?如果服务器不支持https会怎样? - lifang
@user3744927:添加对HTTPS的支持并进行调优是实现HTTP/2的第一步。现在可以免费获取SSL/TLS证书,例如从https://letsencrypt.org/、https://startssl.com/或其他网站获取。其中https://letsencrypt.org/的解决方案最简单且功能强大。您使用的操作系统和Web服务器是什么?我建议您安装OpenSSL并获取Let's Encrypt证书。然后根据建议配置您的服务器。 - Oleg
我并没有实现HTTP/2服务器,我只是对HTTP/2的向后兼容性感到好奇。大多数浏览器仅支持通过TLS的HTTP/2,但仍有很多服务器不支持加密。如果一些服务器仍然更喜欢在HTTP/2中使用非加密呢? - lifang
@user3744927:没有更新到HTTP/2的服务器将会变得缓慢。目前可以看到HTTP/2和TLS的推广非常迅速。可以在这里看到,每周增长约为0.1%。如果考虑到所有服务器,我认为这个速度非常快。 - Oleg
任何事情都可以在实践中存在,但明天不一定。 - puchu

10
如果浏览器仅支持HTTP/1.1,而服务器仅支持HTTP/2,则它们无法通信。服务器将无法识别客户端发送的内容(特别是没有连接前缀),这被服务器视为连接错误,并且将关闭连接。
“仅支持HTTP/2的浏览器”不存在;如果它们支持HTTP/2,则也支持HTTP/1.1。但让我们假设存在这样的浏览器。
在这种情况下,服务器将看到连接前缀并不会识别PRI方法。服务器在这种情况下的确切操作取决于服务器。它可能返回一个400 Bad Request,或者只是关闭连接,或者可能触发内部服务器错误。

是的,这是服务器的错误行为,这是HTTP 1.1解析器服务器实现的漏洞。当HTTP 1.1解析器看到HTTP/2连接前缀时,不应该出现恐慌。 - puchu

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接