TL

ECN(明示的輻輳通知)の仕組みと L4S

輻輳をパケット破棄ではなく合図で伝えられれば、再送遅延ゼロでキューを浅く保てる。ECN が IP と TCP のビットをどう連携させるか、低遅延の L4S がそれをどう作り替えたかを原理から解説。

応用ECNL4S輻輳制御AQMTCP最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.ECN は IP ヘッダの ECN 2 ビット(CE マーク)と TCP の ECE/CWR フラグを連携させ、パケットを落とさずに輻輳を伝える仕組み。
  • 2.従来の RFC 3168 ECN はマークを「損失と等価」に扱うため減速が荒く、キューを浅く保てなかった。
  • 3.L4S は ECT(1) で対応フローを識別し、CE をマーク率(確率的シグナル)として使い、DualQ で既存トラフィックと分離して 1ms 級の低遅延を実現する。

ECN は何を解決するのか

輻輳制御の古典的な前提は「パケット損失こそが輻輳のシグナル」です(AIMD と輻輳制御の数理 参照)。しかしこの設計には根本的な無駄があります。輻輳を送信側に伝えるために、わざわざパケットを捨てる必要があるのです。捨てられたパケットは再送され、再送には最低 1 RTT、場合によっては再送タイムアウト(RTO)相当の遅延が乗ります。

ECN(Explicit Congestion Notification, RFC 3168)はこの無駄を断ちます。ボトルネックのルータが、パケットを落とす代わりにパケット自身に輻輳マークを付け、受信側経由で送信側へ「混んでいる、減速せよ」と明示的に通知します。パケットは破棄されないので再送が要らず、損失による遅延を避けつつ送信側を減速させられます。AQM(バッファブロートと AQM 参照)が「いつ合図を出すか」を決め、ECN が「どう合図を運ぶか」を担う、という役割分担です。

ECN はレイヤをまたぐ協調動作

ECN は IP 層(マークを付ける)と トランスポート層(マークを読み、フィードバックを返す)の協調で成り立ちます。経路上のルータは IP の 2 ビットだけを操作し、端点の TCP がそれを輻輳イベントへ変換します。どちらか一方だけでは機能しません。

IP と TCP のビット連携

ECN は IP ヘッダの ToS/Traffic Class フィールド下位 2 ビット(ECN フィールド)を使います。取りうる 4 つの符号点(codepoint)の意味はこう定義されています。

符号点ビット値意味
Not-ECT00ECN 非対応。ルータは輻輳時に破棄するしかない
ECT(0)10ECN 対応(RFC 3168 の既定)
ECT(1)01ECN 対応(L4S が識別子として転用)
CE11Congestion Experienced(輻輳マーク済み)

動作の流れはこうです。ECN 対応の送信側は IP パケットを ECT(ECT(0) または ECT(1))で送り出します。経路上のルータが輻輳を検知し、かつそのパケットが ECT であれば、破棄する代わりに ECN フィールドを CE(11) に書き換えます。Not-ECT のパケットしか扱えないルータ、あるいは ECT でないパケットは、従来どおり破棄するしかありません。

受信側はこの CE を見ても、その場で何かできるわけではありません。減速すべきは送信側だからです。そこで TCP は CE を送信側へ折り返すために、ヘッダに 2 つのフラグを持ちます。

  • ECE(ECN-Echo): 受信側が「CE 付きパケットを受け取った」ことを送信側へ伝えるフラグ。一度受け取ると、送信側が応答するまで以後の ACK で ECE を立て続けます(確実に届けるため)。
  • CWR(Congestion Window Reduced): 送信側が「ECE を受け取り、輻輳ウィンドウを減らした」ことを受信側へ伝えるフラグ。これを見た受信側は ECE を下ろします。
ECN ネゴシエーションはハンドシェイクで行う

ECN を使うには両端の合意が要ります。TCP の 3 ウェイハンドシェイクで、SYN に ECE と CWR の両方(ECN-setup SYN)、SYN-ACK に ECE のみを立てて相互に ECN 対応を確認します。合意できなければ Not-ECT で通信し、純粋に損失ベースで動きます。

古典 ECN(RFC 3168)の限界

ここまでは一見うまくできた仕組みに見えますが、RFC 3168 の ECN には決定的な制約があります。CE マークを 1 個受け取ったときの送信側の反応が、パケット損失 1 個と完全に等価である、と定義されている点です。つまり ECE を受け取った Reno/CUBIC は、損失時とまったく同じ乗法減少(cwnd を半分、CUBIC なら約 0.7 倍)を行います。

これが低遅延の妨げになります。マークが損失と等価なら、ルータはマークを滅多に付けてはいけません。頻繁にマークすれば送信側が過剰に減速し、スループットが崩れるからです。結果として AQM はキューがかなり深くなってからようやくマークを出すことになり、せっかく損失を避けてもキューイング遅延そのものは大きいままです。ECN は「損失による再送遅延」は消せても、「キューに溜まることによる遅延」は消せなかったのです。

ECN だけではバッファブロートは解けない

古典 ECN の効果は再送回避に留まります。1 マーク=大きな減速という前提のせいでマークを疎にせざるを得ず、キュー長を浅く保つほど頻繁にはマークできません。低遅延を本気で狙うには、マークの「意味」そのものを作り替える必要がありました。

L4S — マークの意味を作り替える

L4S(Low Latency, Low Loss, Scalable throughput, RFC 9330)は、CE マークの解釈を根本から変えます。マークを「損失と等価な 1 回の大減速イベント」ではなく、輻輳の度合いを表す確率的シグナルとして扱うのです。キューが少しでも深くなり始めたら高い頻度で(場合によっては毎 RTT 多数の)マークを付け、送信側はマークに比例して細かく cwnd を調整します。荒い半減ではなく、連続的な微調整に変わります。

この「頻繁にマークして比例的に反応する」輻輳制御を Scalable(スケーラブル)と呼びます。代表が DCTCP(Data Center TCP)と、インターネット向けの TCP Prague や QUIC 版の実装です。スケーラブルな制御では、1 RTT あたりのマーク数が cwnd の大きさによらずおおむね一定に保たれ、帯域が増えてもキューを浅いまま運用できます。

観点古典 ECN(RFC 3168)L4S(RFC 9330)
CE マークの意味損失 1 個と等価(大減速)確率的シグナル(マーク率に比例)
マーク頻度疎(滅多に付けない)密(毎 RTT 多数も可)
送信側の反応乗法減少(半減〜0.7倍)マーク率に比例した微調整
識別子ECT(0)ECT(1)
典型キュー遅延数十 ms1ms 級

ECT(1) と DualQ による分離

L4S 最大の設計課題は共存です。同じボトルネックに、毎 RTT 多数マークを期待する L4S フローと、1 マーク=大減速の古典フローが混在したらどうなるか。古典フローを L4S 流の頻度でマークすれば過剰減速で潰れ、L4S フローを古典流の頻度でマークすれば低遅延になりません。同一キューでは両者を満足させられないのです。

解決策が ECT(1) を識別子に転用することです。L4S 対応の送信側は ECT(0) ではなく ECT(1) でパケットを送ります。ボトルネックの DualQ Coupled AQM(RFC 9332)はこのビットを見て、トラフィックを 2 本のキューへ振り分けます。

  • L キュー(Low Latency): ECT(1) のスケーラブルなフロー用。ごく浅い遅延しきい値(例: 1ms 程度)で頻繁に CE マークする。
  • C キュー(Classic): それ以外(Not-ECT / ECT(0) / 古典 ECN)用。従来型の AQM(PI2 など)で制御する。

両キューは独立ではなく結合(coupled)されています。C キューの輻輳水準を L キューのマーク率へ換算して反映させることで、L4S フローと古典フローがおおむね公平に帯域を分け合えるよう調整します。これにより L キューを浅く保ったまま、古典フローを過剰に締め付けずに共存できます。

# DualQ Coupled AQM の分類と処理(要点)
on enqueue(pkt):
    if pkt.ecn == ECT(1) or pkt is scalable:
        put pkt -> L_queue        # 低遅延キュー
    else:
        put pkt -> C_queue        # 古典キュー

# L キューは浅いしきい値で高頻度に CE マーク
# C キューのドロップ/マーク確率 p_C から
# 結合して L キューのマーク確率を導く:
#   p_L = k * sqrt(p_C) など(実装依存の結合式)
#   = 古典側 p_C は L 側 p_L の二乗に対応(p_C = (p_L / k)^2)
# 2 本から取り出す際は L キューを優先しつつ
# C キューが飢餓に陥らないようスケジュールする
ECT(1) の意味変更は後方互換の地雷だった

ECT(1) はもともと RFC 3168 で予約され、一部で実験的に使われていました。L4S がこれを識別子に転用したため、経路上の機器が ECT(1) をどう扱うか(特に古典 AQM が ECT(1) を古典 ECN とみなしてしまう問題)が長く議論されました。L4S の正しさは「ボトルネックが DualQ で正しく分類する」ことに依存しており、途中経路の非対応 AQM が ECT(1) を C キュー側で疎にマークすると、L4S フローは期待した低遅延を得られません。

実務上の含意

L4S が狙うのは、回線を使い切りながらキュー遅延をほぼゼロに保つことです。動画会議・クラウドゲーミング・XR のように、スループットと低遅延を同時に求める用途で効きます。バッファブロート対策が「定常キューを早く崩す」アプローチだったのに対し、L4S は「そもそもキューを深くさせない」ことを輻輳制御側と AQM 側の両方から実現します。

エンド側では QUIC が ECN を扱いやすい点も追い風です。QUIC は ACK フレームで CE/ECT(0)/ECT(1) の受信カウントをそのまま運べるため(QUIC の内部構造 参照)、TCP の ECE/CWR より精密なマークフィードバックを送れます。輻輳制御方式全体の中での位置づけは TCP輻輳制御の系譜 を参照してください。

試験・面接で問われる急所

「古典 ECN と L4S の決定的な違いは何か」に即答できること。答えは「古典 ECN は CE マークを損失 1 個と等価に扱い疎にしかマークできないが、L4S はマークを確率的シグナルとして高頻度に付け、送信側がマーク率に比例して微調整するため 1ms 級の低遅延を達成する」。あわせて「L4S は ECT(1) を識別子に使い、DualQ Coupled AQM で古典トラフィックと分離・公平化する」点、TCP の ECN フィードバックが ECE/CWR の 2 フラグで成り立つ点も頻出です。

ネットワーク Article

ECN(明示的輻輳通知)の仕組みと L4Sを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ECN

比較で見る軸

難易度: advanced / カテゴリ: ネットワーク / タグ数: 5

導入後に効く点

従来の RFC 3168 ECN はマークを「損失と等価」に扱うため減速が荒く、キューを浅く保てなかった。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ネットワーク
タグ数
5

判断チェックリスト

  • 自社の用途が「ECN / L4S」に近いか確認する。
  • 強みである「ECN は IP ヘッダの ECN 2 ビット(CE マーク)と TCP の ECE/CWR フラグを連携させ、パケットを落とさずに輻輳を伝える仕組み。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ECNL4S輻輳制御AQMTCPECNL4S輻輳制御
参考: 公式情報