当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生什么?

What happens when a browser that supports SPDY receives an HTTP2 (H2) response?

我的直觉是支持 SPDY 的浏览器会将其视为 SPDY 响应。然而,我能找到的最多的是保证 H2 响应将优雅地降级到 HTTP1.1。我正在考虑以面向 H2 的方式提供资产(多个请求、无域分片等),但我确实需要支持一些非 H2 浏览器(例如 Android 4.1 的浏览器)。如果所有客户端至少都符合 SPDY 标准,我可以吗?

奖金问题:混合方案是否涉及任何并发症?我们在不支持 H2 的 Web 框架上,但我正在考虑从 CDN 提供我们的大部分资产。假设 TLS。

启用 SPDY 或 HTTP/2 的浏览器使用 TLS 扩展(旧的 NPN 或新的 ALPN)来协商它们通过 TLS 说话的协议。

客户端按优先顺序发送它能够使用的协议列表(例如 h2,spdy/3.1,http/1.1),服务器从该列表中选择一个它也支持的协议(并且匹配安全要求约束)。

例如,如果你有一个不支持h2的旧浏览器,它将发送spdy/3.1,http/1.1,而服务器永远不会选择h2(即使它支持它). 如果服务器不支持SPDY,就只剩下http/1.1选项了,这就是"graceful degradation"到HTTP/1.1.

的构成

如果客户端请求说 SPDY(而不是 HTTP/2),服务器永远不会回复 HTTP/2,除非服务器上出现严重的实施错误。

SPDY 正在逐步淘汰,取而代之的是 HTTP/2。例如,最近 Chrome 个版本 don't support SPDY anymore.

当您向不同的域发出请求并且服务器使用不同的协议时不会出现复杂情况:这由浏览器透明地处理。

如果您的服务器可以使用 SPDY 和 HTTP/1.1,并且 CDN 可以使用 HTTP/2 和 HTTP/1.1,那么您必须使用支持所有 3 个的浏览器利用 SPDY 和 HTTP/2 优势的协议。 浏览器可以和你的服务器协商SPDY,和CDN协商HTTP/2,由两个来源的资源组成的页面。

但是,浏览器很快就会放弃(或已经放弃)SPDY,因此对于最近的浏览器,您可能最终会与您的服务器对话 HTTP/1.1,而与 CDN 对话 HTTP/2,从而失去SPDY|HTTP/2 对服务器资源的好处。