InfraLab

HTTP/3 / QUIC 仕様

37 / 37 items

InfraLab Reference Series

Category: HTTP/3 (QUIC)

Updated: 2026-05-14

infralab.jp

http-3-quic

37 items

HTTP/3 / QUIC 仕様

Abstract

HTTP/3 と QUIC のトランスポート、TLS 1.3 統合、QPACK、HTTP/3 フレーム、0-RTT、Connection Migration、Alt-Svc 運用を網羅。

Table of Contents

  1. 1. 概要 (RFC)4
  2. 2. QUIC トランスポート9
  3. 3. QPACK4
  4. 4. HTTP/3 フレーム12
  5. 5. 0-RTT2
  6. 6. Connection Migration3
  7. 7. 運用・互換性3
  8. 8. References18

1. 概要 (RFC)

1.1. HTTP/3 / QUIC とは

HTTP/3 は QUIC 上で HTTP セマンティクスを運ぶプロトコル。QUIC は UDP 上に信頼転送、TLS 1.3、輻輳制御を統合する。

HTTP/3: RFC 9114。QUIC Transport: RFC 9000。通常 UDP/443

1.2. 主要 RFC

QUIC の転送、TLS 利用、損失検出、HTTP/3、QPACK が別 RFC として定義されている。

RFC 9000 (QUIC), RFC 9001 (QUIC TLS), RFC 9002 (Loss Detection), RFC 9114 (HTTP/3), RFC 9204 (QPACK)

1.3. HTTP/2 との差分

TCP 単一接続の Head-of-Line Blocking を避けるため、QUIC がストリーム単位で独立した損失回復を行う。

HTTP/2: TCP HOL あり。HTTP/3: QUIC stream 独立。Server Push は HTTP/3 でも実運用上廃止方向

1.4. 発見方法

クライアントは HTTPS で到達後、Alt-Svc または HTTPS DNS レコードにより HTTP/3 エンドポイントを発見する。

Alt-Svc: h3=":443"; ma=86400。HTTPS RR: SvcParams に alpn=h3

2. QUIC トランスポート

2.1. UDP 443

QUIC は UDP の上で動作するため、ファイアウォールやロードバランサで TCP 443 だけ許可していると利用できない。

UDP dst port 443 が一般的。HTTP/3 ALPN token: h3

2.2. 長いヘッダパケット

接続確立やバージョン交渉で使うパケット形式。Destination/Source Connection ID と packet number を含む。

Long Header: Header Form=1, Fixed Bit=1, Long Packet Type, Version 32bit, DCID/SCID length+value

RFC 9000 Long Header Packet ASCII 図:

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |H|F|Typ| Bits  |                    Version                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Version    |   DCID Len    |           DCID ...            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                 Destination Connection ID ...                 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   SCID Len    |                   SCID ...                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                   Source Connection ID ...                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                   Type-Specific Payload ...                   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.3. 短いヘッダパケット

1-RTT 鍵確立後の通常データ転送に使う軽量ヘッダ。Connection ID と packet number を含む。

Short Header: Header Form=0, Fixed Bit=1, DCID, Packet Number。1-RTT Protected Packet

RFC 9000 Short Header Packet ASCII 図:

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |H|F|S| R |K|PN |              Destination CID ...              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                 Destination Connection ID ...                 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                  Packet Number / Payload ...                  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.4. Connection ID

5-tuple が変わっても接続を識別できるようにする ID。NAT rebinding やモバイル回線切替に効く。

DCID/SCID 可変長 0-20B が一般的。NEW_CONNECTION_ID / RETIRE_CONNECTION_ID frame

2.5. Packet Number Space

QUIC は Initial、Handshake、Application Data の packet number 空間を分ける。TCP の byte sequence とは異なる。

Initial / Handshake / 0-RTT+1-RTT packet number spaces。Packet number は暗号化保護対象

2.6. 双方向ストリーム

リクエスト/レスポンスのような双方向データに使う。HTTP/3 リクエストストリームは双方向ストリームを使う。

Stream ID 下位 2bit: bit0 initiator(client=0/server=1), bit1 direction(bidi=0/uni=1)

2.7. 単方向ストリーム

制御、QPACK Encoder/Decoder、Push など片方向用途に使う。ストリーム種別は先頭 varint で示す。

HTTP/3 unidirectional stream types: Control(0x00), Push(0x01), QPACK Encoder(0x02), QPACK Decoder(0x03)

2.8. QUIC フレーム

QUIC は ACK、STREAM、CRYPTO、MAX_DATA、PATH_CHALLENGE などの転送制御フレームを持つ。

例: PADDING(0x00), PING(0x01), ACK(0x02/0x03), CRYPTO(0x06), STREAM(0x08-0x0f), CONNECTION_CLOSE

RFC 9000 Generic Frame Layout ASCII 図:

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Frame Type   |            Type-Specific Data ...             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Type-Specific Data ...                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.9. 損失検出と輻輳制御

QUIC の ACK と loss detection は RFC 9002 で定義され、TCP とは独立してユーザー空間実装されることが多い。

RFC 9002。PTO, packet threshold, time threshold。Congestion: Reno/CUBIC 互換、BBR 実装もあり

3. QPACK

3.1. QPACK 概要

HTTP/3 のヘッダ圧縮方式。HPACK のような TCP 順序依存を避けるため、Encoder/Decoder Stream を使う。

RFC 9204。Static Table + Dynamic Table + Encoder Stream + Decoder Stream

3.2. QPACK Static Table

よく使う疑似ヘッダ、メソッド、ステータス、ヘッダ名・値を固定 index で持つ。

QPACK static table は HPACK と別定義。:authority, :path /, :method GET, :status 200 など

3.3. QPACK Dynamic Table

接続ごとの動的テーブル。参照により圧縮効率を上げるが、blocked stream 数の管理が必要。

SETTINGS_QPACK_MAX_TABLE_CAPACITY と SETTINGS_QPACK_BLOCKED_STREAMS で制御

3.4. Encoder / Decoder Stream

動的テーブル更新と参照確認を単方向ストリームで流し、HTTP リクエストストリームの HOL を抑える。

Unidirectional stream type 0x02 Encoder, 0x03 Decoder。ストリームは接続ごとに 1 本ずつ

4. HTTP/3 フレーム

4.1. HTTP/3 Frame Header

HTTP/3 frame は QUIC stream 上で Type と Length を variable-length integer として持つ。

RFC 9114 HTTP/3 Frame Format ASCII 図:

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                      Frame Type (varint)                      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Length (varint)                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                       Frame Payload ...                       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4.2. DATA

HTTP request/response body を運ぶ HTTP/3 フレーム。QUIC STREAM frame の中に格納される。

HTTP/3 frame type=0x00。Payload は任意長。Request stream 上で使用

4.3. HEADERS

QPACK でエンコードされた field section を運ぶ。HTTP/2 の HEADERS と違い 9B 共通ヘッダはない。

HTTP/3 frame type=0x01。QPACK encoded field section

4.4. CANCEL_PUSH

Push ID に紐づくサーバプッシュをキャンセルする。Push 自体は実運用で無効化されることが多い。

HTTP/3 frame type=0x03。Payload: Push ID (varint)

4.5. SETTINGS

HTTP/3 接続のパラメータを制御ストリームで送る。HTTP/2 SETTINGS とは識別子が異なる。

HTTP/3 frame type=0x04。Control stream の最初に送信。ACK は存在しない

4.6. PUSH_PROMISE

将来のレスポンスを Push ID で予約する。ブラウザでは Server Push 廃止方向のため利用は限定的。

HTTP/3 frame type=0x05。Push ID + Encoded field section

4.7. GOAWAY

新規リクエストの受付停止範囲を通知する。HTTP/2 と異なり QUIC 接続終了とは別に扱う。

HTTP/3 frame type=0x07。Payload: Stream ID または Push ID

4.8. MAX_PUSH_ID

受け入れる最大 Push ID を通知する。Push を使わない運用では送らない、または 0 に抑える。

HTTP/3 frame type=0x0d。Payload: Push ID varint

4.9. RESERVED フレーム

拡張性と middlebox ossification 対策のため、予約済みフレーム種別が定義されている。

HTTP/3 reserved frame types include 0x02, 0x06, 0x08, 0x09。受信時は通常無視

4.10. QPACK_MAX_TABLE_CAPACITY

QPACK 動的テーブルの最大容量を通知する。0 なら動的テーブルを使わない。

SETTINGS_QPACK_MAX_TABLE_CAPACITY = 0x01。単位 octets

4.11. QPACK_BLOCKED_STREAMS

動的テーブル参照待ちで blocked になれるストリーム数上限。大きいほど圧縮効率は上がるがメモリ影響がある。

SETTINGS_QPACK_BLOCKED_STREAMS = 0x07。0 なら blocking references を避ける

4.12. MAX_FIELD_SECTION_SIZE

展開後ヘッダ field section の最大サイズ目安を通知する。巨大 Cookie や header bomb 対策に使う。

SETTINGS_MAX_FIELD_SECTION_SIZE = 0x06。単位 octets

5. 0-RTT

5.1. 0-RTT の条件

過去のセッション情報とチケットがあり、サーバが許可している場合にクライアントは早期データを送れる。

TLS 1.3 early_data + QUIC 0-RTT packets。Transport parameters は互換性が必要

5.2. 0-RTT replay リスク

0-RTT は完全な replay 防止をプロトコル単体では保証しない。非冪等リクエストには使わない設計が必要。

対策: GET/HEAD 等に限定、アプリ側 nonce、サーバ replay cache、Early-Data: 1 相当の扱い

6. Connection Migration

6.1. Connection Migration

端末の IP やポートが変わっても Connection ID により同じ接続を継続できる。モバイル Wi-Fi/LTE 切替で有効。

PATH_CHALLENGE / PATH_RESPONSE で新経路検証。NAT rebinding と区別して処理

6.2. Path Validation

新しいパスが本当に到達可能かを検証してから送信量を増やす。増幅攻撃を防ぐための重要要素。

PATH_CHALLENGE frame + PATH_RESPONSE frame。未検証 path は anti-amplification 制限

6.3. Stateless Reset

状態を失ったサーバが接続を終了させる仕組み。Connection ID と reset token の管理が重要。

Stateless Reset Token 16B。短いヘッダ風パケット末尾に token

7. 運用・互換性

7.1. ロードバランサ運用

QUIC は接続状態を持つため、Connection ID ルーティング、UDP timeout、証明書、0-RTT ポリシーを揃える必要がある。

確認: UDP 443 pass-through、CID routing、idle timeout、retry token key、TLS cert/SNI/ALPN h3

7.2. 確認コマンド

HTTP/3 は curl や ngtcp2 系ツールで ALPN、Alt-Svc、UDP 到達性を確認する。

curl -v --http3 https://example.com / curl -I https://example.com | grep -i alt-svc / qlog 対応実装で解析

7.3. 典型トラブルシュート

TCP 443 は成功するが HTTP/3 だけ失敗する場合、UDP 443 ブロック、Alt-Svc 不整合、証明書/SNI、LB の UDP timeout を疑う。

確認: UDP 443、ALPN h3、Alt-Svc ma、HTTPS RR、MTU/PMTUD、NAT rebinding、QUIC version

8. References

  1. HTTP/3
  2. QUIC
  3. h3
  4. RFC 9000
  5. RFC 9001
  6. RFC 9002
  7. RFC 9114
  8. RFC 9204
  9. QPACK
  10. UDP 443
  11. Connection ID
  12. Connection Migration
  13. 0-RTT
  14. Alt-Svc
  15. HTTPS RR
  16. Head-of-Line Blocking
  17. QUIC Transport
  18. HTTP3
Related