2015-09-22 55 views
3

所以我刚升级到支持HTTP2的nginx 1.9.5。HTTP2:如何表示对它的支持? HTTP2有没有“替代协议”?

我更换了所有listen spdy通过listen http2,除去spdy_headers_comp指令,并取出add_header Alternate-Protocol 443:npn-spdy/3;

然后我打开我在Firefox的网站,开启的网络监控,瞧:Version: HTTP/2.0

但如何火狐知道我的网站支持HTTP2?在尝试使用HTTP1.1之前,它是否总是首先尝试通过HTTP2进行连接?

回答

5

HTTP/2网站都部署在TLS

浏览器使用TLS扩展名为ALPN告诉他们可以说什么协议的服务器。 浏览器始终发送此TLS扩展,并且始终包含HTTP/2和HTTP/1.1(还可能包含旧的SPDY协议)。

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

如果服务器不支持HTTP/2,那么它会通过ALPN扩展发送给它只能说HTTP浏览器/ 1.1。

如果服务器不支持扩展ALPN,那么就不会发送给浏览器,浏览器将默认为说话HTTP/1.1到该服务器。使用SPDY时的NPN SPDY/3`头:

+0

OK,但为什么谷歌建议增加一个'复用协议:443?为什么不像HTTP2那样做(ALPN)? –

+2

服务器使用“Alternate-Protocol”来告诉客户端他们可以使用给定的协议连接_directly_。你的例子只是说谷歌服务器通过NPN(ALPN的前身)支持SPDY/3(HTTP/2的前身)。例如是HTTP/1.1服务器可以与'复用协议回复:8443:h2'告诉客户端不使用ALPN连接到_different_端口(8443),知道该端口后面有一个HTTP/2服务器。如果没有这个头文件,客户端就不会知道在端口8443上说什么协议。对于支持ALPN的服务器,“Alternate-Protocol”只是提供信息。 – sbordet