HTTP/2
HTTPのバージョン2。1つのTCPコネクションの中に、ストリームという仮想的な通信の単位を複数作り、複数のリクエストとレスポンスを並列にやり取りできるようにした(多重化)。
イマシルちゃんの解説
HTTP/1.1では、1本の電話回線で、「1つ質問して、答えを聞いてから、次の質問をする」っていう話し方しかできなかったんだ。
たくさん聞きたいことがあると、電話を何本もかけるしかなかったんだよ。
HTTP/2では、1本の電話の中で、いくつもの話を同時に進められるようになったんだ。
話ごとに番号を付けて区別するから、答えが混ざっちゃう心配もないんだよ!
より深い解説
定義
HTTP/2は、RFC 9113(元はRFC 7540、2015年)で定められたHTTPのバージョンである。HTTP/1.1の意味(メソッド、ステータスコード、ヘッダーなど)はそのままに、通信の方式を大きく変えて、Webページの表示を高速化した。通常はTLSの上で使う。
主な特徴
| 特徴 | 内容 |
|---|---|
| バイナリ形式 | テキストではなく、フレームと呼ぶバイナリの単位でやり取りする |
| ストリームによる多重化 | 1つのTCPコネクションの中に複数のストリームを作り、それぞれにストリームIDを付けて区別する。リクエストとレスポンスを並列に、順番を問わずにやり取りできる |
| ヘッダーの圧縮(HPACK) | 何度も送られる同じヘッダーを、表を使って短く表す |
| 優先度 | ストリームに優先度を付けられる |
| サーバプッシュ | クライアントが要求する前に、サーバが必要になりそうなデータを送る(現在はほとんど使われていない) |
HTTP/1.1との比較
| HTTP/1.1 | HTTP/2 | |
|---|---|---|
| 1つのTCPコネクションでの処理 | リクエストとレスポンスを1組ずつ順番に | 複数のストリームで並列に |
| 並列にダウンロードする方法 | 複数のTCPコネクションを張る | 1つのTCPコネクションで足りる |
| HTTPレイヤーのHoLブロッキング | 起きる | 起きない |
| TCPレイヤーのHoLブロッキング | 起きる | 起きる |
TCPのHoLブロッキングが残る理由
HTTP/2のストリームは、すべて1つのTCPコネクションの上を流れる。TCPは、パケットが1つ失われると、それより後ろのデータを、再送が届くまでアプリケーションに渡さない。そのため、あるストリームのパケットが失われると、関係のないほかのストリームまで止まってしまう。パケット損失の多い回線では、HTTP/1.1で複数のコネクションを使うより遅くなることもある。この問題を解決するため、HTTP/3では、TCPの代わりにUDPの上で動くQUICを使う。
NAPTへの影響
HTTP/1.1では、並列にダウンロードするために、1台のPCが同じサーバに複数のTCPコネクションを張るため、NAPTの変換エントリーを多く使う。HTTP/2では、1つのTCPコネクションで済むため、変換エントリーの数を減らせる。