HTTP/2
2019-04-10
HTTP/2 について勉強したメモ
情報源
公式
二次情報
- HTTP/2 - Wikipedia
- 関連 : Hypertext Transfer Protocol - Wikipedia
- HTTP/2 の元になったやつ : SPDY - Wikipedia
- [2016-02] ウェブを速くするためにDeNAがやっていること - HTTP/2と、さらにその先
- kazuho さんのスライド / H2O サーバ
- [2017-03] 普及が進む「HTTP/2」の仕組みとメリットとは | さくらのナレッジ
- [2018-01] HTTP/2における双方向通信とgRPCとこれから - Qiita
- [2019-02] HTTP/2 の概要 | Web Fundamentals | Google Developers
- [2018-10] そろそろ知っておきたいHTTP/2の話 - Qiita
歴史
- HTTP/1.0 : 1996 年に発表
- HTTP/1.1 : 1997 年に発表 / その後 2 回改訂
- HTTP/2 : 2015 年に RFC として規定 / Google 発
概要
HTTP/1.1
- 長く使われてきたプロトコル
- 1.0 と比べ、1 つの TCP コネクションで複数のやり取りができるようになった(Keep-Alive)
- Request が終わらないと次の Request を送ることはできない
- HTTP/1.1 での双方向通信には ポーリング や ロングポーリング が使われた
【課題感】
- テキストベースでステートレスなプロトコル
- ※ TCP(トランスポート層)はステートフルだが HTTP/1(アプリケーション層)がステートレス
- シンプルだがオーバーヘッドが大きい
- TCP コネクションの使い回しが非効率 (HTTP HOL Blocking)
- [2015-10] Head of Line Blocking - High Performance Web 2015 - Qiita
- Request - Response の組が同期的 / 順番を保つ必要がある
- ※ こうした問題があるので Chrome などはホストに対して最大 6 個の TCP コネクションを張って頑張っている
HTTP/2
- 接続を非同期多重化 / ステートフルな通信
- ストリーム : 1 つの TCP コネクション上に n 個の仮想的な双方向シーケンスを持てる。これをストリームと呼ぶ
- フロー制御によって、同時に複数存在するストリームが互いに干渉し合わないことを保証
- テキストベースから バイナリフレームベース になって高効率
- HTTP/1 で無かったヘッダ圧縮も行われる
- 圧縮は HPACK という規格で行われる / 事前に辞書を共有するタイプのやつ
- HTTP/2 上で RPC を行う規格として gRPC がある
対応 / 利用状況
- Client
- 2019 年現在、主要なブラウザはほとんど HTTP/2 (over TLS) に対応している
- Server
- Apache はバージョン 2.4.17(2015-10 リリース)以降で mod_http2 モジュールを入れると対応可能
- Nginx はバージョン 1.9.5(2015-09 リリース)以降で対応
- [2017-03] HTTP/2を実際に使用するためのサーバー設定 | さくらのナレッジ
- HTTP/2 を利用するには事実上 TLS が必須(HTTPS が必須)と考えてよい