ハイライト
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):
- スケーラブルな輻輳制御アルゴリズム — 送信側がネットワークの ECN 輻輳フィードバックに基づき送信レートを調整できること
- ECN 検証メカニズム — ネットワークが ECN マークを妨害(ECN ビットの「漂白」など)していないか確認し、ECN パスが正常なときだけ L4S トラフィックを送ること
- ECN フィードバック中継 — 受信側として、受け取った ECN 輻輳マークを送信側に返すこと
RFC 9330 が L4S の標準文書で、実装の参考になります。
カスタムプロトコルが Network framework ベースなら、パケットメタデータの ECN 属性で ECN マークの送受信ができます。BSD socket なら setsockopt や sendmsg/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):
- ECN マークが妨害や消去されず通過できること
- ボトルネックノードが L4S キュー管理をサポートすること
macOS Sonoma の「インターネット共有」には L4S キュー管理が組み込まれており、テスト用ボトルネックになります。システム設定でインターネット共有を有効にすると、Mac がネットワーク上の追加ホップになります。共有インターフェースの帯域を制限するコマンド:
sudo ifconfig en1 tbr 10Mbps
キーポイント:
ifconfig en1— インターネット共有に使うインターフェース(en1など実際の名前に置き換え)tbr 10Mbps— トークンバケットレートを設定し、帯域を10Mbps に制限して Mac をボトルネックにする- 制限を解除するには
10Mbpsを0にして再実行するか、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 または NSTask で ifconfig と defaults を実行し、URLSession でリクエストを走らせ、URLSessionTaskMetrics の transactionMetrics から遅延と損失を比較します。
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 で報告します。
関連セッション
- Build robust and resumable file transfers — URLSession の大容量転送と断点再開。L4S と組み合わせてダウンロード体験をさらに改善
- Create seamless experiences with Virtualization — Virtualization framework のネットワークスタックも L4S 遅延最適化の恩恵を受ける可能性
- Meet Push Notifications Console — プッシュ通知コンソール。ネットワーク遅延改善はプッシュ到達速度に直結
- What’s new in Core Data — Core Data の CloudKit 同期はネットワーク依存。L4S で遅延が下がると同期が滑らかに
コメント
GitHub Issues · utterances