輻輳制御 — 窓が鋸歯状に伸び縮みする
ネットワークには「1秒に運べる量」の上限があります。送り手が上限を超えて送り込むとルータのバッファがあふれ、パケットが捨てられる。TCP は自分の送信量 cwnd(輻輳ウィンドウ)を刻々と調整し、詰まりを避けながら帯域をめいっぱい使い、しかも複数の通信で公平に分け合う。その独特の 鋸歯(のこぎり)の動きを、動かして体感します。
1. なぜ制御がいるのか — あふれるバッファ
リンクの容量(1秒に送り出せるパケット数)は決まっています。送信レートがそれを超えると、超過分はルータのバッファ(キュー)に溜まっていきます。バッファも有限なので、いっぱいになると新しいパケットはそのまま捨てられます(パケットロス)。下で送信レートを容量より上げてみてください。キューが満杯になった瞬間、赤いロスが噴き出します。
2. 窓の鋸歯 — スロースタートとAIMD
TCP は送信量の上限を cwnd(何パケット分を返事待ちにできるか)で管理し、次の2つのモードで動かします。まずスロースタート:1 RTT ごとに cwnd を2倍にして一気に立ち上げる(指数的)。しきい値 ssthresh を超えたら輻輳回避に切り替え、1 RTT ごとに+1 だけ慎重に増やす(線形)。そしてロスを検知したら cwnd を半分に折る。増やすときは足し算・減らすときは掛け算——これが AIMD です。
3. AIMD はなぜ「公平」なのか
不思議なのは、AIMD だと複数の通信が自然に帯域を等分していくこと。2つの通信の送信量を x・y 軸にとって動きを追うと理由が見えます。増加は両者に同じ +1 なので差を保ったまま斜め45°に進み、減少は両者を½倍するので差そのものを半分に縮める。増やすたびに容量の線へ近づき、減らすたびに公平の線(y=x)へ寄る——結果、誰が先に始めてもまん中の公平点へ収束します。
4. 制御があると何が守られるか — 崩壊の回避
送信量を上げれば上げるほど届く量(グッドプット)も増える——のは容量までの話。制御なしで押し込み続けると、ロスと再送で届く量はむしろ坂を転げ落ちます(輻輳崩壊)。輻輳制御は、みなが容量の手前で歩調を合わせることで、この崩壊を防ぎ、スループットを頂点付近に保ちます。下のスライダーで提供負荷を上げ、制御あり(緑)と制御なし(赤)の運命の違いを見てください。
5. まとめ — 譲り合いのアルゴリズム
- スロースタート:最初は cwnd を1 RTTごとに倍々で立ち上げ、素早く帯域を掴む(指数増加)。
- 輻輳回避(AIMD):ssthresh 以降は +1/RTT で慎重に増やし、ロスで半分に折る。この足し算増加・掛け算減少が鋸歯を生む。
- 公平性:AIMD は複数フローを自然に等分へ収束させる。誰かが独占しない。
- 崩壊の回避:全員が容量の手前で歩調を合わせるので、届く量が頂点付近に保たれる。