HTTP/3について

はじめに

2022年6月に標準化されたHTTP/3の内容把握になります

概要

gihyo.jp

の内容を自己流で噛み砕いたものです。
(間違い・違和感等あれば、やさしくご指摘頂けると幸いです)

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/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の問題点

  • TCPレイヤによるHead-of-Line Blocking
  • プロトコル硬直化(ミドルボックスが拡張フォーマット未対応によるパケット破棄や通信遮断)

HTTP/3.0

2022年6月にRFC9114を発行
もともとHTTP over QUICをいう名称

UDPプロトコルを採用することで、TCPレイヤによるHead-of-Line Blockingを解消させる
暗号化必須にすることで、プロトコル硬直化のリスクを軽減させる

https://raw.githubusercontent.com/rmarx/h3-protocol-stack/main/png/protocol-stack-h1-h2-h3.png

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バージョンはクライアント - サーバー間で合わせるため