TCP輻輳制御:窓が伸びては折れる
輻輳ウィンドウ cwnd が、スロースタートで指数的に伸び、ロスで半減する「鋸歯(のこぎり)波形」を時間軸で体感します。
40 pkt
1.5 %
14 RTT/s
cwnd(現在の窓)
—
ssthresh(しきい値)
—
フェーズ
—
経過 RTT
—
cwnd の時間変化(横=RTT、縦=ウィンドウサイズ) / 緑線=AIMDの平均的な安定点
TCP は一度にどれだけ送れるか(輻輳ウィンドウ cwnd)を自分で探ります。最初は容量が分からないので、
毎 RTT ごとに cwnd を倍々(指数増加)に増やす ── これがスロースタートです。
cwnd が
「ロスが無ければ毎回 +1 で増やし、ロスが起きたら ×0.5 で減らす」── この AIMD(加算増加・乗算減少)が、のこぎり状の波形と安定点を生みます。スライダーで容量とロス率を変えてみましょう。
cwnd が
ssthresh を超えると、慎重に1 RTT で +1(線形増加)へ切り替わります(輻輳回避)。
パケットを送りすぎてロスが起きると、cwnd を半分に折って ssthresh を下げ、また登り直します。「ロスが無ければ毎回 +1 で増やし、ロスが起きたら ×0.5 で減らす」── この AIMD(加算増加・乗算減少)が、のこぎり状の波形と安定点を生みます。スライダーで容量とロス率を変えてみましょう。
いま何が起きている?
ここがポイント
- スロースタート ── cwnd を毎 RTT で倍に。ssthresh まで一気に指数的に立ち上がる。
- 輻輳回避(AIMD) ── ssthresh 超えは「ロス無し +1/ロス時 ×0.5」。これが鋸歯波形の正体。
- 乗算減少が安定の鍵 ── 減らすときは半分。混雑時に強くブレーキを踏むから過負荷が収束する。
- 容量とロス率で形が変わる ── 容量が高いほど歯が大きく、ロス率が高いほど歯が細かく低くなる。