HTTP/2

/ 2019-04-10

HTTP/2 について勉強したメモ

情報源

公式

二次情報

歴史

  • 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)
  • ※ こうした問題があるので Chrome などはホストに対して最大 6 個の TCP コネクションを張って頑張っている

HTTP/2

  • 接続を非同期多重化 / ステートフルな通信
    • ストリーム : 1 つの TCP コネクション上に n 個の仮想的な双方向シーケンスを持てる。これをストリームと呼ぶ
    • フロー制御によって、同時に複数存在するストリームが互いに干渉し合わないことを保証
  • テキストベースから バイナリフレームベース になって高効率
  • HTTP/1 で無かったヘッダ圧縮も行われる
    • 圧縮は HPACK という規格で行われる / 事前に辞書を共有するタイプのやつ
  • HTTP/2 上で RPC を行う規格として gRPC がある

対応 / 利用状況

  • HTTP/2 を利用するには事実上 TLS が必須(HTTPS が必須)と考えてよい