メインコンテンツまでスキップ

1. はじめに (Introduction)

ハイパーテキスト転送プロトコル (Hypertext Transfer Protocol, HTTP) は非常に成功したプロトコルです。しかし、HTTP/1.1が基盤となるトランスポート ([RFC7230], Section 6) を使用する方法には、今日のアプリケーションパフォーマンスに全体的に悪影響を与えるいくつかの特性があります。

特に、HTTP/1.0では、特定のTCP接続上で一度に1つのリクエストしか未処理にできませんでした。HTTP/1.1はリクエストパイプライン (Request Pipelining) を追加しましたが、これはリクエストの同時実行性を部分的にしか解決せず、依然としてヘッドオブラインブロッキング (Head-of-Line Blocking) の問題があります。そのため、多くのリクエストを行う必要があるHTTP/1.0およびHTTP/1.1クライアントは、同時実行性を実現し、それによってレイテンシを削減するために、サーバーへの複数の接続を使用します。

さらに、HTTPヘッダーフィールド (HTTP Header Fields) はしばしば冗長で冗長であり、不必要なネットワークトラフィックを引き起こすだけでなく、初期TCP [TCP] 輻輳ウィンドウ (Congestion Window) が急速に満たされる原因となります。これにより、新しいTCP接続で複数のリクエストが行われる場合に過度なレイテンシが発生する可能性があります。

HTTP/2は、HTTPのセマンティクスを基盤となる接続への最適化されたマッピング (Optimized Mapping) を定義することで、これらの問題に対処します。具体的には、同じ接続上でリクエストメッセージとレスポンスメッセージのインターリーブ (Interleaving) を可能にし、HTTPヘッダーフィールドの効率的なエンコーディング (Encoding) を使用します。また、リクエストの優先順位付け (Prioritization) も可能にし、より重要なリクエストをより迅速に完了させることで、パフォーマンスをさらに向上させます。

結果として得られるプロトコルは、HTTP/1.xと比較して使用するTCP接続が少なくて済むため、ネットワークにとってより親和性が高くなります。これは、他のフローとの競合が少なくなり、接続の寿命が長くなることを意味し、その結果、利用可能なネットワーク容量のより良い利用につながります。

最後に、HTTP/2は、バイナリメッセージフレーミング (Binary Message Framing) の使用により、メッセージのより効率的な処理も可能にします。