HTTP/3
HTTPのバージョン3。トランスポートにTCPではなく、UDPの上で動くQUICを使う。ストリームごとに独立して通信を管理するため、TCPのHoLブロッキングが起きない。
イマシルちゃんの解説
HTTP/2で、1本の電話の中でいくつもの話を同時にできるようになったけど、
電話の回線(TCP)そのものが一瞬途切れると、全部の話が止まっちゃう問題が残っていたんだ。
HTTP/3は、その回線の仕組みごと新しくしたんだよ。
新しい通信の仕組みを使って、1つの話が止まっても、ほかの話は進み続けられるようにしたんだ!
しかも、つながるまでの準備も速いんだよ。
より深い解説
定義
HTTP/3は、RFC 9114(2022年)で定められたHTTPのバージョンである。トランスポートプロトコルとして、RFC 9000で定められたQUICを使う。QUICはUDP(通常はポート443)の上で動作し、TCPが担っていた信頼性の確保(再送、順序制御、輻輳制御)と、TLS 1.3による暗号化を、まとめて実現する。
QUICの主な特徴
| 特徴 | 内容 |
|---|---|
| ストリームの独立 | ストリームごとに順序を管理するため、1つのストリームでパケットが失われても、ほかのストリームは止まらない(TCPのHoLブロッキングを回避) |
| 接続の速さ | 接続の確立と暗号化の鍵交換を同時に行い、最短1往復(再接続では0往復)で通信を始められる |
| 暗号化が必須 | TLS 1.3を組み込み、ヘッダーの多くも暗号化される |
| コネクションの移行 | IPアドレスやポート番号ではなく、コネクションIDで接続を識別するため、Wi-Fiから携帯電話の網に切り替わっても、接続を続けられる |
| ユーザ空間での実装 | OSのカーネルではなく、アプリケーション側で実装できるため、改良を素早く取り入れられる |
HTTPのバージョンの比較
| HTTP/1.1 | HTTP/2 | HTTP/3 | |
|---|---|---|---|
| トランスポート | TCP | TCP | QUIC(UDP) |
| 多重化 | なし(複数の接続で並列化) | ストリーム | ストリーム |
| TCPのHoLブロッキング | 起きる | 起きる | 起きない |
| 暗号化 | 任意(TLS) | 実質的に必須(TLS) | 必須(QUICに組み込み) |
どのバージョンが使われるか
ブラウザは、サーバがHTTP/3に対応していることを、HTTP/2などの応答のヘッダー(Alt-Svc)やDNSのHTTPSレコードで知り、対応していればHTTP/3で接続する。最近の主要なブラウザは HTTP/3 に対応しているため、どのバージョンが使われるかは、主にサーバ側の対応で決まる。
ネットワーク機器への影響
| 影響 | 内容 |
|---|---|
| NAPT | QUICはUDPなので、ルータは接続の終わり(TCPのFINやRSTに当たるもの)を見分けられない。変換エントリーは、UDPの保持時間が過ぎるまで残る。UDPの保持時間を短くすると、使われなくなったエントリーを早く削除できる |
| ファイアウォール | UDP/443を許可する必要がある。中身が暗号化されているため、検査しにくい |
| 経路の途中での最適化 | TCPのヘッダーを見て行っていた制御(MSSの調整など)が効かない |
UDP/443が遮断されている環境では、ブラウザは自動的にHTTP/2(TCP)に切り替えて通信する。