【问题标题】:HTTP2: How to indicate support for it? Is there a "Alternate-Protocol" for HTTP2?HTTP2:如何表示对它的支持? HTTP2 是否有“备用协议”?
【发布时间】:2015-12-19 17:34:10
【问题描述】:

所以我刚刚升级到支持 HTTP2 的 nginx 1.9.5。

我将所有listen spdy 替换为listen http2,删除了spdy_headers_comp 指令并删除了add_header Alternate-Protocol 443:npn-spdy/3;

然后我在 Firefox 中打开我的网站,打开网络监视器,瞧:Version: HTTP/2.0

但是 Firefox 是如何知道我的站点支持 HTTP2 的呢?在尝试 HTTP1.1 之前总是先尝试通过 HTTP2 连接吗?

【问题讨论】:

    标签: http2


    【解决方案1】:

    HTTP/2 站点部署在 TLS 上。

    浏览器使用名为 ALPN 的 TLS 扩展来告诉服务器它们可以使用哪些协议。 浏览器总是发送这个 TLS 扩展,并且总是同时包含 HTTP/2 和 HTTP/1.1(也可能包含旧的 SPDY 协议)。

    服务器接收浏览器可以使用的协议列表,如果服务器支持 HTTP/2(并且如果满足许多其他条件 - 特别是关于 TLS 协议版本和密码套件),则服务器决定与浏览器说 HTTP/2,并将选择的协议发送回浏览器,再次使用 ALPN 扩展。

    如果服务器不支持 HTTP/2,那么它会通过 ALPN 扩展向浏览器发送它只能使用 HTTP/1.1 的信息。

    如果服务器不支持 ALPN 扩展,则不会将其发送到浏览器,浏览器将默认向该服务器发送 HTTP/1.1。

    【讨论】:

    • 好的,但是为什么 Google 建议在使用 SPDY 时添加 Alternate-Protocol: 443:npn-spdy/3 标头?为什么不采用与 HTTP2 相同的方式 (ALPN)?
    • Alternate-Protocol 被服务器用来告诉客户端他们可以在哪里使用给定的协议直接连接。您的示例只是说 Google 服务器通过 NPN(ALPN 的前身)支持 SPDY/3(HTTP/2 的前身)。例如,HTTP/1.1 服务器可以回复 Alternate-Protocol: 8443:h2 告诉客户端连接到 不同 端口(8443)而不使用 ALPN,因为知道该端口后面有一个 HTTP/2 服务器。如果没有此标头,客户端将不知道在端口 8443 上使用什么协议。对于支持 ALPN 的服务器,Alternate-Protocol 只是提供信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-04-15
    • 2017-06-02
    • 2021-11-16
    • 2018-07-13
    • 2017-10-04
    相关资源
    最近更新 更多