HTTP/2
HTTP/1.1の後継として2015年にIETFがRFC 7540として標準化したHTTPのメジャーバージョン。HTTP/1.1のテキストベースプロトコルを、バイナリフレーミングによる通信に置き換えた。
主な特徴
- バイナリフレーミング — 通信をバイナリエンコードされた「フレーム」の交換として扱う。各フレームは9バイトのヘッダ(長さ・種別・フラグ・31bitのストリームID)を持ち、テキストベースのHTTP/1.1より効率的にパースできる。
- 多重化(multiplexing) — 1本のTCPコネクション上で複数のリクエスト/レスポンスを独立した「ストリーム」として並行にやり取りできる。異なるストリームのフレームはインターリーブされて送受信され、受信側でストリームIDを元に再構成される。HTTP/1.1で問題になっていたHead-of-lineブロッキング(1つのリクエストの遅延が同一コネクション上の他のリクエストをブロックする問題)をアプリケーション層では解消する。
- ヘッダ圧縮 — HPACKによりリクエスト/レスポンスヘッダを圧縮する。
- オリジンごとに1本のコネクションで済むため持続的接続になり、ネットワークリソースの利用効率が上がる。
残る制約
HTTP/2の多重化はTCPコネクション上のアプリケーション層で行われるため、TCP自体のパケットロスによるHead-of-lineブロッキングは解消されない。この制約はトランスポート層をQUIC(UDPベース)に置き換えたHTTP/3で解消される。
関連
gRPCはHTTP/2上で動作するRPCフレームワークで、HTTP/2のストリーム多重化やトレーラーといった機能を前提に設計されている。ブラウザからHTTP/2の当該機能を直接制御できないという制約がgRPC-Webが必要になる理由の一つになっている。