#このページで確認できること

実装上の制約: h3 対応の curl ビルドが必要です(macOS標準curlは非対応のことが多い)。また本サイト自体は現時点で HTTP/3 配信をしていません。コマンド例は h3 対応の公開ホストを対象にしています。

#HTTP/2 との違い

HTTP/2HTTP/3
トランスポートTCPQUIC (UDP)
TLSTCPの上に別レイヤーQUIC に TLS 1.3 が統合
ヘッダー圧縮HPACKQPACK(ストリーム独立性を考慮した再設計)
HoLブロッキングTCPレイヤーで全ストリームに影響QUICの異なるストリーム間では回避。QPACK等の依存による待ちはあり得る
接続確立TCP + TLS を順に確立。TLS 1.3の初回接続は一般に2 RTT初回1 RTT。再接続時は条件を満たせば0-RTTも可
代表的なHTTPSポートTCP 443UDP 443

多重化・ストリーム・疑似ヘッダーといった概念は HTTP/2 から引き継いでいます。フレームの種類と番号は HTTP/2 と互換性がなく、独立した定義です。

#Alt-Svc によるHTTP/3の発見

Alt-Svcをまだ学習していないクライアントは、まず TCP(HTTP/1.1 か HTTP/2)で接続し、レスポンスの Alt-Svc ヘッダーで「h3 も使える」と知らされてから HTTP/3 へ切り替えることがあります。この場合は「初回はh2、2回目以降h3」が観測されます。ただし、キャッシュ済みのAlt-SvcやDNSのHTTPSレコードを使う場合は初回からh3になることもあり、この順序は保証されません。

response header
HTTP/2 200 alt-svc: h3=":443"; ma=86400
Alt-Svc による HTTP/3 への移行
participants: Client, Server
Client -> Server: TCP + TLS (ALPN: h2)
Client -> Server: GET / (HTTP/2)
Server --> Client: 200 OK + alt-svc: h3=":443"
note: クライアントは h3 対応を学習・記憶する
Client -> Server: QUIC handshake (UDP 443, ALPN: h3)
Client -> Server: GET /next (HTTP/3)
Server --> Client: 200 OK (HTTP/3)
DNSでの発見: HTTPS レコード(SVCB, RFC 9460)の alpn="h3" でも通知でき、この場合は初回からHTTP/3で接続できます。dig example.com HTTPS で確認できます。

#ハンドシェイク

HTTP/3 接続確立 — 1 RTT でリクエスト送信開始
participants: Client, Server
Client -> Server: QUIC Initial (ClientHello, ALPN: h3) [UDP]
Server --> Client: QUIC Initial + Handshake (ServerHello, cert)
Client -> Server: Handshake finished
note: 1 RTT で暗号化確立 — TCPの3-wayハンドシェイクは存在しない
Client -> Server: HEADERS frame (GET /) on stream 0
Server --> Client: HEADERS + DATA (200 OK)

#検証コマンド

curl — HTTP/3 で接続(h3対応ビルドが必要)
# curl が h3 対応か確認(Features に HTTP3 があるか)
$ curl --version | grep -i http3

# HTTP/3 を強制
$ curl -I --http3-only https://cloudflare-quic.com/

# HTTP/3 を先に試し、接続できない場合は以前のHTTP版へのフォールバックも行う
$ curl -v --http3 https://cloudflare-quic.com/ 2>&1 | grep -E 'ALPN|HTTP/3|alt-svc'
出力例 (ヘッダーは時期・接続先で変わる)
HTTP/3 200 alt-svc: h3=":443"; ma=86400 server: cloudflare
環境依存に注意: macOS 標準の curl は HTTP/3 非対応のことが多く、brew install curl 版やdockerイメージが必要です。またUDP 443がネットワークでブロックされている場合、多くのクライアントはTCP上のHTTP/2またはHTTP/1.1へフォールバックします。「HTTP/3が使われない」こと自体に気づきにくいため、Protocol表示とキャプチャを併用します。

#観測ポイント

curl--http3-only が失敗し、同じホストがTCP上のHTTP/2またはHTTP/1.1で応答する場合は、UDP 443の疎通かサーバー側h3対応を候補に切り分ける。--http2 はHTTP/1.1へフォールバックし得るため、-v の交渉結果も確認する。
DevToolsNetwork の Protocol 列に h3。Alt-Svcを初めて学習する環境では、初回の h2 がリロード後に h3 へ変わる場合がある。キャッシュやHTTPSレコードにより初回からh3になる場合もある。
Proxy従来型の明示プロキシのHTTP CONNECTはTCPトンネルなので、そのままではHTTP/3を運べない。この構成ではh2へフォールバックすることが多い。一方、標準化済みのMASQUE CONNECT-UDPに対応するプロキシならUDPをトンネルできる。
tcpdump / Wiresharkフィルタ: quic。UDP 443 へのトラフィックと QUIC Initial パケットを確認。SSLKEYLOGFILE で復号すれば http3 フィルタでフレームも見える。
TLS inspectionQUICを復号しない装置や組織では、UDP 443をブロックしてTCPへフォールバックさせる構成が使われることがある。自組織の方針を確認した上で、フォールバックが意図どおり起きるか、余分な待ち時間がないかを観測する。

#関連

HTTP/3 の土台であるトランスポート層の詳細(connection migration、0-RTT、connection ID)は QUIC のページを参照してください。