2015-09-22 80 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