如果浏览器 HTTP1.x 兼容,它是否也兼容 HTTP2?

If a browser is HTTP1.x Compatible is it also HTTP2 compatable?

在阅读了许多关于 HTTP2 主题的不同文章、论文和博客文章之后,包括维基百科的 HTTP2 页面,甚至一些关于 HTTP2 的 HTTP2 devs/engineers 推文,我仍然有点不清楚HTTP2 兼容性和支持的确切状态。

我今天读了很多关于 HTTP2 的文章,有好几次都提到“HTTP2 是向后兼容的”。我还读到,在 HTTP2 最初发布时,任何当代的知名浏览器都不支持新的通信技术。诚然,我可能对“向后兼容”和“支持”这两个词的真正含义缺乏理解;假设如果 HTTP2 向后兼容,那么它应该可以在 HTTP1.x 可以工作的任何地方工作,这不是公平的吗? HTTP2 向后兼容的全部原因是,从本质上讲,HTTP2 不会破坏万维网?这样想,对我来说,唯一的选择就是向后兼容,但是如果浏览器必须推出支持更新才能兼容,那么 HTTP2 向后兼容的意义何在?

我真正感到困惑的是这留下了几乎所有的东西。我知道大浏览器现在大部分都支持 HTTP2,但是旧浏览器呢? Netscap-8 和 IE-9 不会在短期内获得任何新的更新,现实地,永远......传统浏览器的命运,如 Netscape 和 IE,注定会被新的 HTTP 技术的到来所注定(考虑到 HTTP3也已经存在...)?

所以我问这一切的全部原因是因为我已经开始我的下一个项目并且我希望服务器使用 HTTP2 进行通信。它是一个 Node.js 应用程序,我正在构建一个小型框架,而不是使用 express,这样我就可以通过并自己编写 HTTP2 服务器,因此我深入了解了 HTTP2 和 Node.js HTTP2 API。我想知道 HTTP2 在哪里兼容?或者我不应该担心它? Native NodeJS 在其后来的版本中某个时候发布了一个模块,它配备了一个 API。 API 称为“Comparability API”。我对此知之甚少,但我知道它能够构建支持 HTTP/1 和 HTTP/2 的应用程序,但是,我不知道这是否是我需要的东西。我如何确保我的 HTTP2 应用程序至少可以在 IE9 和更新版本的浏览器上加载?

您误解了术语向后兼容。这并不意味着 向后支持 - 它只是意味着它不是一个破坏性的变化并且 HTTP/1.1 浏览器仍然可以连接并继续使用 HTTP/1.1没有任何变化。

HTTP/2 有很多方法来检测它是否被浏览器和服务器支持,只有在两者都支持时才使用它,如果不支持则继续使用 HTTP/1.1。它甚至指定了如果这些检测失败并且 HTTP/1.1 客户端连接并在服务器认为这是 HTTP/2 连接时尝试与 HTTP/1.1 通话时如何回退。这意味着旧浏览器(例如 IE9)预计不会知道 HTTP/2.

一个 non-backwards 兼容的变化是,如果所有浏览器都必须发送他们之前没有发送的新版本设置,以明确要求服务器对话 HTTP/1.1。这意味着 IE9 等无法连接到支持 HTTP/2 的服务器,没有更新。

一般来说,网络非常努力地确保更改向后兼容,并且旧软件仍然可以工作——即使这对那些老客户来说是一种退化的体验。实际上,向后兼容是将某些内容推广到 Internet 的唯一方法,否则采用会受到严格限制,因为很少有人愿意像那样切断旧浏览器。

因此,对您来说,这意味着您的服务器需要同时支持 HTTP/1.1 和 HTTP/2。我想大多数服务器会在很长一段时间内支持这个(甚至 HTTP/1.0),并且 HTTP/2-only 服务器将非常罕见并且不太可能安装为 public 网络服务器。

节点兼容性 API 基本上会为您解决这个问题。您创建一个 HTTP/2 服务器,它会自动为您支持 HTTP/1.1 并在需要时使用它(例如,旧客户端或不支持 HTTP/2 的代理背后的客户端) ).

这确实意味着您不能假设您的网络访问者会在 HTTP/2 上,有些事情在 HTTP/2 下效果更好(例如发送更多较小的资源,而不是更少的较大资源) 对于 HTTP/1.1 位访问者来说可能更糟。但它仍然有效。