IIS 上的 HTTP/2

作者 :David So

相容性

版本 備註
IIS 10.0 IIS 10.0 引進 HTTP/2 支援
IIS 8.5 和更早版本 IIS 10.0 之前不支援 HTTP/2

什麼是 HTTP/2?

HTTP/2 是透過 TCP 連線流動 HTTP 語意的方式,而 HTTP/2 支援則存在於Windows 10和Windows Server 2016中。 HTTP/2 是近 200 年 HTTP/1.1 使用之後的主要升級,並減少網頁伺服器上的延遲和連線負載的影響。

HTTP/1.1 的主要進展是使用持續性連線來服務資料列中的多個要求。 在 HTTP/2 中,持續性連線可用來服務多個同時要求。 在程式中,HTTP/2 引進數個額外的功能,可改善網路上 HTTP 的效率。

多個要求的一個連線

每個 TCP 連線都需要進行來回設定。 如果您使用加密,TLS 交握會進行另一次 1-2 次往返。 這一切會在可以傳送第一個回應的第一個位元組之前發生。 藉由重複使用現有的連線,而不是設定新的連線,許多要求都可以共用此額外負荷。 HTTP/2 會大幅減少要求在建立新連線時等候的需求,或等待現有的連線變成閒置。 由於單一連線會在許多要求之間多工處理,因此通常可以立即傳送要求,而不需要等待其他要求完成。

使用 HPACK 進行標頭壓縮

HTTP 已針對年齡支援壓縮資料。 不過,標頭會以未壓縮的文字的形式傳送,要求之間有許多備援。 (許多最長的標頭都會在每個要求上以完全相同的值傳送!) HTTP/2 引進 HPACK,這是 HTTP 標頭的壓縮配置,可減少要求之間的備援。

壓縮有助於多工處理,因為要求較小。 這可讓用戶端在連線的第一個封包中提出許多要求,而 TCP 流量控制視窗仍然很小。

伺服器推送

要求會以模式出現。 如果用戶端要求一個資源,伺服器通常會預測它需要頁面上參考的其他資源。 在 HTTP/1.1 中,內嵌是用來將這些資源傳遞至用戶端,作為第一個回應的一部分。 內嵌有其缺點,最值得注意的是,內嵌資源無法快取供其他可能參考的頁面使用。

HTTP/2 引進了「推送」的概念 - 回應用戶端尚未提出要求的伺服器,但會預測用戶端的將會。 這可讓伺服器繼續提供內嵌的延遲優點,但以用戶端可以在其他頁面上快取和重複使用的格式。

如何?使用 HTTP/2?

您可能已經! 由於幾乎所有瀏覽器在最新的版本中都已經支援 HTTP/2,而且目前的資料顯示超過 50% 的使用者 已在支援 HTTP/2 的瀏覽器上。

在伺服器上,在 Windows 10 或 Windows Server 2016 上執行的 IIS 支援 HTTP/2。

IIS 目前僅支援透過 TLS 的 HTTP/2。 當對在 Windows 10 上執行 IIS 的網頁伺服器進行 HTTPS 連線時,如果用戶端和伺服器都支援 HTTP/2,則會使用 HTTP/2。 在 IIS 中,我們已盡可能透明地實作 HTTP/2 - 您不應該變更應用程式中的任何專案,HTTP/2 才能運作。 不過,HTTP/2 不再建議使用特定 HTTP/1.1 優化 (網域分區化、內嵌等) ,因此您應該在未來規劃移除這些優化。

推送呢?

由於伺服器推送是 HTTP/2 中的新功能,因此您需要呼叫新的 API 來利用它。 當您從 IIS 原生模組呼叫 ASP.NET 或HttpDeclarePushAPI 中的 PushPromise API時,您會提供您預期用戶端發出之要求的 URL 和選擇性要求標頭。 如果基礎連線支援推送,會發生兩件事:

  • PUSH_PROMISE會傳送至用戶端,因此用戶端可以檢查資源是否已存在於快取中
  • 新要求會新增至推送資源的要求佇列

如果基礎連線不支援推送 (用戶端停用推送,或 HTTP/1.1 用戶端) ,則呼叫不會執行任何動作並傳回成功,因此您可以安全地呼叫 API,而不需要擔心是否允許推送。

IIS 設定

HTTP/2 沒有特定的新 IIS 組態設定。

在 Windows Server 2016 Tech Preview 中,有一個提及設定 'DuoEnabled' 登錄機碼。 這已不再需要。 如上所述,如果用戶端和伺服器組態支援 HTTP/2,則 IIS 會使用 HTTP/2 (,如果不可能) 的話,則會使用 HTTP/1.1 或後援。

記錄通訊協定版本

IIS 記錄有欄位 「通訊協定版本」,預設為關閉。 如果您想要追蹤哪些要求是透過 HTTP/2、HTTP/1.1 等,啟用此欄位會很有用。

在 Internet Services Manager UI 中,您可以透過選取欄位,在[記錄] 功能下找到此功能。

[I S 記錄] 頁面的影像,其中顯示 [選取欄位] 下拉式清單,其中已從 [W 3 C 記錄欄位] 功能表選取 [通訊協定版本 C S 虛線版本]。

進行變更之後,按一下最右邊 [動作] 窗格底下的 [套用]。

以下是已啟用 [通訊協定版本] 欄位的記錄檔輸出範例:

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2015-08-13 18:46:11
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2015-08-13 18:46:11 ::1 GET / - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko - 200 0 0 391
2015-08-13 18:46:11 ::1 GET /iisstart.png - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko https://localhost/ 200 0 0 100

含 HTTP/2 的 IIS 示範逐步解說

  1. 如果您執行Windows 10,可以透過[程式和功能] 找到此功能,然後開啟或關閉 Windows 功能,然後啟用[Internet Information Services] 核取方塊。 如果您執行Windows Server 2016,請啟動伺服器管理員,然後在儀表板上新增角色和功能,然後從清單中選取[Web 服務器 (IIS) ]。

    已選取並醒目提示 [Internet Information Services] 的 [開啟或關閉 Windows 功能] 頁面影像。

  2. 安裝完成之後,請啟動 Internet Services Manager,然後在伺服器的 [功能] 檢視下選取 [伺服器憑證] 選項,以建立自我簽署憑證。 請注意,在此範例中使用自我簽署憑證僅供示範/測試之用, (不建議保護生產網站) 。

    [伺服器功能] 檢視在 [網際網路Service Manager] 頁面中的影像,其中已醒目提示 [伺服器憑證]。

    [自我簽署憑證] 對話方塊的影像,其中已醒目提示 [建立自我簽署憑證] 選項的 [名稱] 方塊。

  3. 移至您的預設網站,然後在 [系結 ] 下,使用您剛才建立的自我簽署憑證建立新的 TLS 系結。

    [新增網站系結] 對話方塊的螢幕擷取畫面,其中已醒目提示 I P 網址類別型,並從下拉式清單中選取 [本機 I I S 伺服器]。

  4. 從您的Windows 10或Windows Server 2016電腦啟動瀏覽器,並按 F12、 (或移至 [設定] 並啟用F12 開發人員工具) ,然後切換至 [網路] 索引標籤。流覽 https://localhost 至 並流覽至 [網路] 索引標籤,您位於 HTTP/2 上!

    本機主機虛線 F 12 開發人員工具的螢幕擷取畫面,其中顯示 [網路] 索引標籤,並已選取 [H T T P 2]。

何時不支援 HTTP/2?

在某些情況下,HTTP/2 無法與其他功能搭配使用。 在這些情況下,Windows 會回復為 HTTP/1.1,並繼續交易。 這可能牽涉到交握期間交涉 HTTP/1.1,或傳送錯誤碼給用戶端,指示用戶端透過 HTTP/1.1 連線重試。

  • HTTP/2 不支援Windows 驗證 (NTLM/Kerberos/Negotiate) 。 在此情況下,IIS 會回復為 HTTP/1.1。
  • 純文字 - 如上所述,IIS 目前僅支援透過 TLS 的 HTTP/2。 同樣地,IIS 會回復為 HTTP/1.1。
  • 頻寬節流 - IIS 具有在 Inetmgr 中限制頻寬 (的功能,請在 [設定動作] 窗格) 下選取 [限制] 網站。 這適用于 HTTP/1.1,但不會針對 HTTP/2 強制執行, (不會繼續執行任何錯誤或頻寬限制) 。

詳細資訊

如需 HTTP/2 和 Windows 中用戶端和伺服器實作的更深入討論,請參閱 Windows 10:Browser、Apps 和 Web Server 中的組建 HTTP/2。

作者:Mike Mike、David So (,其貢獻來自 Rob Trace、Baris Caglar、Passwordm Lala)