WWDC Quick Look 💓 By SwiftGGTeam
Reduce network delays with L4S

Reduce network delays with L4S

元の動画を見る

ハイライト

iOS 17 と macOS Sonoma には L4S(Low Latency, Low Loss, Scalable throughput)サポートが組み込まれています。URLSession または Network framework の HTTP/3 と QUIC トラフィックは自動的にキュー管理最適化を受け、混雑ネットワークで遅延を50%削減、パケット損失を40%からほぼゼロに抑えられます。コード変更は不要です。


主要内容

カフェでビデオ通話中、隣の人が50GBのゲームをダウンロードしています。画面がカクつき、音声が途切れます。原因はネットワークボトルネックのキューが制御不能になっていることです。

複数デバイスが同時にネットワークを使うと、ボトルネックノード(通常は ISP のルーター)でパケットが積み上がります。従来のやり方は、キューを伸ばし続け、バッファが満杯になったらパケットを破棄することです。送信側は損失を見て初めて輻輳に気づき、速度を下げます。問題は2つあります。キューイング自体が遅延を生み、損失は再送を意味し、さらに遅延を悪化させます。

L4S はこの仕組みを変えます。送信側がキュー形成の初期段階で輻輳を感知できます。パケット損失の前にです。

実装は3段階の協調です。まず送信側が IP ヘッダーに ECN(Explicit Congestion Notification)マークを付け、輻輳制御に協力する意思を示します。次にボトルネックデバイスがキュー増加を検知すると、通過パケットに別の ECN ラベルを付け「前方に輻輳あり」を示し、破棄せず転送します。最後に受信側がマークされたパケット数を数え、プロトコル経由で送信側にフィードバックします。送信側は送信レートを微調整し、キューが大きくなる前に速度を落とします。

この閉ループによりパケットはほぼ破棄されず、キュー長は常に短く、遅延は物理的下限に近い水準を保てます。

Apple の実測では、最小 RTT 20ms のテストネットワークで、L4S なしでは最悪パケット遅延が45ms、L4S 有効化後は25ms 未満に低下し、50%以上の削減です。パケット損失は40%超からほぼゼロに。ビデオ通話のカクつきはほぼ消え、受信フレームレートは大部分の時間25fps 以上を維持。L4S なしでは0に落ちることもありました。


詳細

自動 L4S:URLSession と Network framework

App が URLSession または Network framework を使い、HTTP/3 または QUIC で転送しているなら、L4S はすでに組み込まれています。コードは不要です。

HTTP/2 または TCP を使う場合も、iOS 17 と macOS Sonoma ではダウンロード方向のトラフィックに L4S サポートが組み込まれています。

つまり大多数の App は自動的に恩恵を受けます。これらの高レベル API と最新プロトコルを使っていることを確認するだけです。

カスタムプロトコル:手動実装が必要

カスタム転送プロトコル(独自 UDP や WebRTC など)を使う App は、L4S サポートのために3つの動作を実装する必要があります(09:01):

  1. スケーラブルな輻輳制御アルゴリズム — 送信側がネットワークの ECN 輻輳フィードバックに基づき送信レートを調整できること
  2. ECN 検証メカニズム — ネットワークが ECN マークを妨害(ECN ビットの「漂白」など)していないか確認し、ECN パスが正常なときだけ L4S トラフィックを送ること
  3. ECN フィードバック中継 — 受信側として、受け取った ECN 輻輳マークを送信側に返すこと

RFC 9330 が L4S の標準文書で、実装の参考になります。

カスタムプロトコルが Network framework ベースなら、パケットメタデータの ECN 属性で ECN マークの送受信ができます。BSD socket なら setsockoptsendmsg/recvmsg で ECN マークを扱えます。

サーバー側設定

L4S にはサーバー側の協力が必要です。App が QUIC を使うなら、サーバーの QUIC 実装も L4S と ECN マークをサポートする必要があります(11:19)。市販の QUIC サーバー実装は多数あり、サーバーまたは CDN プロバイダーに ECN と L4S の有効化方法を確認してください。L4S 送信未対応でも、ECN 受信だけ有効化できる場合があります。

App が TCP を使うなら、サーバー側 TCP 実装に L4S サポートを追加します。Linux サーバーは GitHub の L4S プロジェクトページを参照できます。

テストネットワークの構築

L4S 効果をテストするには、ネットワークが2条件を満たす必要があります(12:31):

  1. ECN マークが妨害や消去されず通過できること
  2. ボトルネックノードが L4S キュー管理をサポートすること

macOS Sonoma の「インターネット共有」には L4S キュー管理が組み込まれており、テスト用ボトルネックになります。システム設定でインターネット共有を有効にすると、Mac がネットワーク上の追加ホップになります。共有インターフェースの帯域を制限するコマンド:

sudo ifconfig en1 tbr 10Mbps

キーポイント:

  • ifconfig en1 — インターネット共有に使うインターフェース(en1 など実際の名前に置き換え)
  • tbr 10Mbps — トークンバケットレートを設定し、帯域を10Mbps に制限して Mac をボトルネックにする
  • 制限を解除するには 10Mbps0 にして再実行するか、Mac を再起動

テストデバイスが Mac の共有ネットワークに接続すると、すべてのトラフィックが L4S キュー管理を通過します。

デバイスで L4S を有効化

iOS 17 と macOS Sonoma では、L4S は段階的にランダムユーザーへ配信されます。テストデバイスで確実に有効にする方法は2つ:

macOS — ターミナルコマンド15:36):

sudo defaults write -g network_enable_l4s -bool true

iOS — 開発者設定:

「設定」の開発者オプションで L4S スイッチをオンにします。

キーポイント:

  • defaults write -g-g はグローバルドメインで、すべてのアプリに適用
  • network_enable_l4s — L4S 有効/無効を制御するグローバルキー
  • -bool true — L4S を明示的にオン。false でオフ
  • ネットワークやサーバーが L4S 非対応なら、TCP と QUIC は従来モードに自動フォールバックし、接続に影響しません

重要ポイント

1. ビデオ通話 App で L4S 効果をモニタリング

やること:既存のビデオ通話 App にネットワーク診断パネルを追加し、L4S オン/オフ時の RTT 分布とパケット損失を比較します。

価値:L4S が最も直接影響するのはリアルタイム通信 App です。可視化パネルで改善を直感的に示し、サーバーチームに L4S 有効化の価値を証明しやすくなります。

始め方:Network framework の NWConnection で接続状態を監視し RTT サンプルを収集。iOS 17+ デバイスで defaults コマンドで L4S を切り替え、2つのデータセットを比較します。

2. インターネット共有をネットワーク品質テストツールに

やること:Mac のインターネット共有を L4S テストボトルネックとして自動設定し、ネットワークテストを実行して L4S オン/オフ比較レポートを生成する CLI ツールを書きます。

価値ifconfig tbr と L4S 切り替えの手動設定は面倒です。自動化スクリプトで誰でも Mac 上に L4S テスト環境を素早く構築できます。

始め方Process または NSTaskifconfigdefaults を実行し、URLSession でリクエストを走らせ、URLSessionTaskMetricstransactionMetrics から遅延と損失を比較します。

3. カスタム UDP プロトコルに L4S サポートを追加

やること:UDP ベースのカスタム転送プロトコルに RFC 9330 準拠の L4S 輻輳制御を実装します。

価値:多くのゲームやリアルタイム App がカスタム UDP を使い、L4S の恩恵が最大ですが手動実装も必要です。現代の輻輳制御を学ぶ好機です。

始め方:Network framework の NWConnection から始め、送信時に metadata.ecn を設定。RFC 9330 で ECN フィードバックループの詳細を読み、ECN マークに基づく単純なレート調整アルゴリズムを実装します。

4. CI パイプラインに L4S 互換性チェックを追加

やること:App の CI テストに L4S 互換性テストを追加し、L4S オン/オフの両方のネットワークで正常動作することを確認します。

価値:Apple は段階的に L4S をユーザーへ配信します。App やサードパーティーライブラリが ECN マークで異常動作すると、L4S ネットワークで接続問題が起きる可能性があります。CI で事前テストすればユーザー影響を避けられます。

始め方:CI Mac でインターネット共有を設定し帯域を制限、L4S オン/オフでネットワークテストを実行。異常は Feedback Assistant で報告します。


関連セッション

コメント

GitHub Issues · utterances