WWDC21のAccelerate networking with HTTP/3 and QUICを見ました。

WWDC21で、「Accelerate networking with HTTP/3 and QUIC」という発表がありました。

developer.apple.com

iOS15、MacOS Monterey からHTTP/3とQUICが利用可能になるらしく、HTTPの進化、HTTP/3の使い方、QUICの使い方の紹介が取り上げられていました。

気になったスライドをピックアップしてまとめてみました。

Evolution of HTTP

f:id:neko--suki:20210614220053p:plain
HTTPの進化

ここでは、HTTP/1.1、HTTP/2、HTTP/3の進化を典型的なWebページの表示(index.html, logo.png, style.css)のダウンロードにかかる時間の改善によって表しています。HTTP/1.1→HTTP/2ではストリームの多重化によって、logo.png, style.cssをリクエストするタイミングが早くなっていることが分かります。 またHTTP/2→HTTP/3では接続までの時間が改善されていることが分かります。

f:id:neko--suki:20210614220737p:plain
HoL Blocking

この図では、HTTP/2とHTTP/3の違いをパケットロスなどによるHoL Blockingによって表しています。HTTP/2は単一のTCPコネクション上で接続を多重化しているので、ストリーム毎ではなくコネクション上にあるすべてのストリームがブロックされることが分かります。一方で、HTTP/3はUDP上のQUICの接続を使うので、あるストリームがブロックされても他のストリームはブロックされません。

HTTP/3 Support

f:id:neko--suki:20210614221043p:plain
HTTP/3 Support

HTTP/3はURLSessionというAPIではデフォルトで使用可能になるらしいです。Swiftは詳しくないですが、特殊なコンフィギュレーションを設定しなくても使えるという意味ではないかと思います。

developer.apple.com

Swiftは詳しくないですが、ドキュメントにはすでに記載があるようでした。

URLSession supports the HTTP/1.1, HTTP/2, and HTTP/3 protocols. HTTP/2 support, as described by RFC 7540, requires a server that supports Application-Layer Protocol Negotiation (ALPN).

HTTP/3 service discovery

f:id:neko--suki:20210614221332p:plain
Service Discovery

URLSessionでは、サーバーがHTTP/3に対応していることが分かると、HTTP/3での通信が可能になるらしいです。 HTTP/3で通信が可能かどうかについて確認する方法が紹介されています。 推奨される方法はDNSサーバーへの登録らしいです。

おそらく↓の記事で取り上げられている技術ではないかと思います。

asnokaze.hatenablog.com

また、assumesHTTP3Capableという、サーバーがHTTP/3をサポートしていると仮定することでスピードアップを図るAPIもあるようです。

New HTTP prioritization scheme

f:id:neko--suki:20210614221821p:plain
prioritization

また、優先度制御についても紹介がありました。おそらくすでに実装済みのものだと思われます。 優先度の数字による設定や、画像などincrementalなダウンロードをするかどうかの設定が可能です。

HTTP/2の優先度制御には、正しく実装されていないなどの課題があり、HTTPのヘッダーを使った方式が提案されており、それを使っているようです。

datatracker.ietf.org

具体的には3.1、3.2あたりに記述があります。

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority-03#section-3.1

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority-03#section-3.2

Using QUIC in your app

f:id:neko--suki:20210614222607p:plain
Using QUIC

QUICのAPIが用意されて使用可能になります!

developer.apple.com

Multiplexing protocols

f:id:neko--suki:20210614222907p:plain
Stream

このあたりの話は、原稿を読んでもよくわかりませんでした。 おそらく、ストリームの扱い方についてなのではないかと思います。

QUIC Options

f:id:neko--suki:20210614223041p:plain
Transport parameter

トランスポートパラーメータの設定もできるようです。ストリームをUnidirectionalにするなどのプロパティの設定も可能らしいです。

developer.apple.com

また、ストリームのメタデータの設定もできるようです。

f:id:neko--suki:20210614223248p:plain
metadata

developer.apple.com

Debugging QUIC

f:id:neko--suki:20210614223421p:plain
qlog

qlogという、QUICのログを保存するための仕組みにも対応しています。 qlogを使用することで、wiresharkなどでパケットキャプチャするよりもさらに細かいレベルでのデバッグなどが可能になります。 最適化がかなりはかどると思います。

現状標準化中で、WGのドラフトになったというのを最近見かけた気がします。

datatracker.ietf.org

datatracker.ietf.org

qlogについては自分が書いた紹介の記事がいくつかあるので興味があればそちらも見ていただけるとよいかもしれません。

qiita.com

like-cat.hatenablog.com

Next steps

f:id:neko--suki:20210614223724p:plain
qlog

プレゼンは、「HTTP/3サーバーを使えるようにしよう!」、「カスタムプロトコルをQUIC上で実装しよう!」という二つのメッセージで締めています。

所感

Appleのような開発者の多いプレイヤーがHTTP/3やQUICのサポートを開始するというのは大きいニュースではないかと思います。

QUICはまだ標準化が終わったばかりで最適に使うにはどのようにすればよいのかという話はこれからの話題だと思います。Appleのサポートによって開発者が増えると、どうやって最適化を行うのかという話題が増えると思います。今から楽しみです。