HTTP/3について
はじめに
2022年6月に標準化されたHTTP/3の内容把握になります
概要
の内容を自己流で噛み砕いたものです。
(間違い・違和感等あれば、やさしくご指摘頂けると幸いです)
Software DesignにあるHTTP/3の記事は
大変わかりやすくので、こちらを直接読んで頂く方が断然オススメです!!
HTTPの歴史
HTTP/0.9
1991年に仕様が公開される デフォルトのポート80番を使用し、TCP(Transmission Control Protocol)とIP(Internet Protocol)によって コネクションを確立し、HTTPリクエストを送り、レスポンスを受け取るという流れ
HTTP/0.9の問題点
- 画像のやりとりができない
- レスポンスがエラーかどうか判別できない
HTTP/1.0
1992年に仕様が公開される
HTTPヘッダーフィールドにより、HTML以外のコンテンツもHTTPでやりとり可
HTTPステータスコードにより、 レスポンスのエラー判定可
HTTP/1.0の追加要素
- HTTPヘッダーフィールド
- HTTPメソッド(HEAD, POST)
- HTTPステータスコード
HTTP/1.0の問題点
-1つのリクエストとレスポンスのやりとりでTCPコネクションを閉じる - 3ウェイハンドシェイクするオーバーヘッドが大きい
HTTP/1.1
1997年にRFC2068が発行 1999年にRFC2616が発行
Keep-Aliveヘッダによって、TCPコネクションを使いわませるようになる
(再確立のオーバーヘッドが解消)
HTTP/1.1の追加要素
- Connectionヘッダ
- Keep-Aliveヘッダ
HTTP/1.1の問題点
- Head-of-Line Blocking(レスポンスの順番待ち)
- TLS通信の3ウェイハンドシェイクのオーバーヘッド
HTTP/2.0
2015年にRFC7540が発行 SPDYプロトコルを標準化したもの HTTP2よりバイナリ形式のフレームを利用(HTTP/1.1と非互換)
HTTPレイヤのHead-of-Line Blockingを解消するために、ストリーム多重化
ストリームIDをもつことで、レスポンス順不同で送信できるようになる
ヘッダ圧縮にはHPACKを利用する
HTTP/2.0の追加要素
- ストリームのよる多重化
- 優先度制御
- フロー制御
- 類似ヘッダフィールド
- HTTPヘッダフィールド圧縮
- サーバープッシュ
HTTP/2.0の問題点
HTTP/3.0
2022年6月にRFC9114を発行
もともとHTTP over QUICをいう名称
UDPプロトコルを採用することで、TCPレイヤによるHead-of-Line Blockingを解消させる
暗号化必須にすることで、プロトコル硬直化のリスクを軽減させる
HTTP/3.0の新要素
- ストリームのよる多重化
- Head-of-Line Blocking が発生しない
- 優先制御がシンプル
- 暗号化が必須
- 0-RTT(Round Trip Time)、1-RTTでハンドシェイクが完了
- コネクションマイグレーションが可能
- ヘッダ圧縮にはQPACKを利用
暗号化が必須
トランスポート層における諸問題を、従来のようなTCPを改善するアプローチではなく
UDP+QUICで改善するアプローチ
UDP+QUICにすることで、オーバーヘッドの問題を解消できる
TCPの通信の信頼性はUDPにはないが、QUICにより信頼性を担保させる
QUICのパケット構造
https://datatracker.ietf.org/doc/html/draft-ietf-quic-transport-27#section-17.2
ショートヘッダパケット
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+ |0|1|S|R|R|K|P P| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Connection ID (0..160) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Packet Number (8/16/24/32) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Protected Payload (*) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ロングヘッダパケット
+-+-+-+-+-+-+-+-+ |1|1|T T|X X X X| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version (32) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | DCID Len (8) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Connection ID (0..160) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SCID Len (8) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Connection ID (0..160) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Connection IDはコネクションの維持、ロードバランサーのアクセス制御
- QUICバージョンはクライアント - サーバー間で合わせるため