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

Posted

技术标签:

【中文标题】当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生啥?【英文标题】:What happens when a browser that supports SPDY receives an HTTP2 (H2) response?当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生什么? 【发布时间】:2017-03-07 00:44:00 【问题描述】:

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

额外问题:混合协议是否有任何复杂性?我们在一个不支持 H2 的 Web 框架上,但我正在考虑从 CDN 提供我们的大部分资产。假设 TLS。

【问题讨论】:

【参考方案1】:

启用 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,这就是构成“优雅降级”到 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 与您的服务器和 HTTP/2 与 CDN,从而失去 SPDY|HTTP/2 的好处服务器上的资源。

【讨论】:

以上是关于当支持 SPDY 的浏览器收到 HTTP2 (H2) 响应时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP2即未来

记录nginx启用http2后不生效的问题

.NET 上的 HTTP/2(HTTP2 或 SPDY)

Nginx 1.10 上的 SPDY 代替 HTTP2

netty系列之:让TLS支持http2

HTTP2 / SPDY 推流验证:如何测试?