HTTP/2 on IIS (IIS 上の HTTP/2)
作成者 David So
互換性
バージョン | メモ |
---|---|
IIS 10.0 | HTTP/2 のサポートは IIS 10.0 で導入されました |
IIS 8.5 以前 | HTTP/2 は、IIS 10.0 より前はサポートされていませんでした |
HTTP/2 とは
HTTP/2 は、TCP 接続経由での HTTP セマンティクスのフロー方法を改訂したもので、HTTP/2 は、Windows 10 および Windows Server 2016 でサポートされています。 HTTP/2 は、HTTP/1.1 が約 20 年にわたって使用されてきた後のメジャー アップグレードであり、Web サーバーでの遅延と接続負荷の影響を軽減します。
HTTP/1.1 の大きな進歩は、複数の要求を連続して処理するために永続的な接続を使用することでした。 HTTP/2 では、永続的な接続を使用して、複数の同時要求にサービスを提供できます。 HTTP/2 では、このプロセスに、ネットワーク上の HTTP の効率を向上するいくつかの追加機能が導入されています。
複数の要求に対して 1 つの接続
すべての TCP 接続には、ラウンドトリップの設定が必要です。 暗号化を使用している場合、TLS ハンドシェイクにはさらに 1 から 2 回のラウンド トリップが行われます。 これらすべては、最初の応答の最初のバイトが送信される前に発生します。 新しい接続を設定する代わりに既存の接続を再利用すると、このオーバーヘッドを多くの要求で共有できます。 HTTP/2 では、新しい接続が確立されている間、または既存の接続がアイドル状態になるまで要求が待機する必要性が大幅に低減されます。 単一の接続が多くの要求間で多重化されるため、通常、要求は他の要求が完了するのを待たずにすぐに送信できます。
HPACK によるヘッダーの圧縮
HTTP では長年にわたってデータの圧縮がサポートされてきました。 ただし、ヘッダーは非圧縮テキストとして送信されるため、要求間には多くの冗長性が存在します (最も長いヘッダーの多くは、すべての要求で、まったく同じ値で送信されます)。HTTP/2 には、HTTP ヘッダー用の圧縮スキームである HPACK が導入されており、要求間の冗長性が低減されます。
圧縮により、要求が小さくなるため、多重化にも役立ちます。 これにより、クライアントは、接続上の最初のパケットで多数の要求を行うことができますが、TCP フロー制御ウィンドウは依然として小さいままです。
サーバー プッシュ
要求はパターンで到着します。 クライアントが 1 つのリソースを要求した場合、サーバーは多くの場合、ページ上で参照される他のリソースが必要になると予測できます。 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 を実行している Web サーバーに HTTPS 接続を行う場合、クライアントとサーバーの両方で HTTP/2 がサポートされている場合は HTTP/2 が使用されます。 IIS には、HTTP/2 が可能な限り透過的に実装されており、HTTP/2 が機能するためにアプリケーション内で何も変更する必要はありません。 ただし、特定の HTTP/1.1 最適化 (ドメイン シャーディング、インライン化など) は HTTP/2 では推奨されなくなったため、将来的にこれらを削除する計画を立てる必要があります。
プッシュについて
サーバー プッシュは HTTP/2 の新機能であるため、これを利用するために呼び出す必要がある新しい API があります。 ASP.NET で PushPromise API を呼び出すか、または IIS ネイティブ モジュールから HttpDeclarePush API を呼び出す際に、クライアントが行うことが予想される要求の URL とオプションの要求ヘッダーを指定します。 基になる接続でプッシュがサポートされている場合、次の 2 つのことが発生します。
- 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 ログには、'Protocol version' フィールドがあり、既定ではオフになっています。 このフィールドを有効にすると、HTTP/2、HTTP/1.1 などを介して送信される要求を追跡する場合に便利です。
インターネット サービス マネージャー UI では、これは、[ログ] 機能で [フィールドの選択] を選択すると見つけることができます。
変更を加えた後、右端の [アクション] ペインで [適用] をクリックします。
次に、Protocol Version フィールドを有効にした場合のログ ファイル出力のサンプルを示します。
#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 のデモ チュートリアル
Windows 10 を実行している場合、これは [プログラムと機能]、[Windows の機能の有効化または無効化] の順に選択し、[インターネット インフォメーション サービス] チェックボックスをオンにすると、見つけることができます。 Windows Server 2016 を実行している場合は、サーバー マネージャーを起動し、ダッシュボードで [役割と機能の追加] を選択し、一覧から [Web サーバー (IIS)] を選択します。
インストールが完了したら、インターネット サービス マネージャーを起動し、サーバーの [機能] ビューで [サーバー証明書] オプションを選択して自己署名証明書を作成します。 この例の自己署名証明書の使用は、デモおよびテストのみを目的としていることに注意してください (運用サイトの保護には推奨されません)。
既定の Web サイトに移動し、[バインド] で、作成した自己署名証明書を使用して新しい TLS バインドを作成します。
Windows 10 または Windows Server 2016 マシンからブラウザーを起動し、F12 キーを押して (または [設定] に移動して [F12 開発者ツール] を有効にし)、[ネットワーク] タブに切り替えます。
https://localhost
を参照すると、HTTP/2 を使用していることがわかります。
HTTP/2 がサポートされない場合
場合によっては、HTTP/2 を他の機能と組み合わせて使用できないことがあります。 このような場合、Windows は HTTP/1.1 にフォールバックしてトランザクションを続行します。 このためには、ハンドシェイク中に HTTP/1.1 をネゴシエートすることや、エラー コードをクライアントに送信して HTTP/1.1 接続を介して再試行するように指示することが必要な場合があります。
- Windows 認証 (NTLM/Kerberos/Negotiate) は、HTTP/2 ではサポートされていません。 この場合、IIS は HTTP/1.1 にフォールバックします。
- クリア テキスト - 前述のとおり、IIS では現在、TLS 経由の HTTP/2 のみをサポートしています。 この場合も、IIS は HTTP/1.1 にフォールバックします。
- 帯域幅調整 - IIS には帯域幅を制限する機能があります (Inetmgr で、[アクション] ペインの [構成] でサイトの [制限] を選択します)。 これは HTTP/1.1 に適用されますが、HTTP/2 には適用されません (エラーや帯域幅制限を発生せずに続行されます)。
詳細情報
HTTP/2 と Windows でのクライアントとサーバーの実装について詳しくは、Build 2015 の講演「Windows 10 の HTTP/2: ブラウザー、アプリ、Web サーバー」を参照してください。
作成者: Mike Bishop、David So (Rob Trace、Baris Caglar、Nazim Lala からの寄稿とそれに対する謝辞を含む)