TCP の輻輳制御
TCP が回線の混み具合に合わせて送る量を増やしたり減らしたりする様子を、Tahoe・Reno・CUBIC・BBR で見せます。キューの深さや損失の多さを変えて、のこぎり波・バッファブロート・2 本の通信の帯域の分け合いを確かめられます。
例
スロースタートのあと、1 ずつ増やして損失したら半分にする(AIMD)ことを繰り返し、のこぎりの形になります。
- Reno: Tahoe に高速回復を加えたもの。重複 ACK で損失に気づいたら、ウィンドウを半分にしてそこから 1 ずつ増やします(AIMD)。ACK が返らずタイムアウトしたときだけ 1 に戻ります。
1 ラウンドに送ったパケットの数
グラフの下の帯は、通信 1・2 がどの段階にいたかを表します。
ルーターのキューと往復時間
キューに 20 パケットまでためられます。キューが 1 パケット増えるごとに、往復時間が 5 ms 延びます(最小 100 ms)。
ラウンド 199 の様子
往復時間 130 ms・キュー 6 / 20・あふれて捨てられたパケット 0
通信 1(Reno): 輻輳回避
- 送った
- 26
- 失われた
- 0
- 届いた速さ
- 100%(帯域に対して)
- 次のウィンドウ
- 27
- ssthresh
- 20
輻輳回避: ウィンドウを 1 増やす
結果
| 通信 | 帯域の利用率 | 重複 ACK | タイムアウト | 失われたパケット |
|---|---|---|---|---|
| 1: Reno | 98% | 10 | 0 | 33 |
全体の利用率 98%・平均の往復時間 151 ms
方式の比較(1 本だけで送ったとき)
今の回線の条件で、4 つの方式をそれぞれ 1 本だけ動かした結果です。利用率が高く、往復時間が短いほど良い方式です。
| 方式 | 帯域の利用率 | 平均の往復時間 | 失われたパケット | |
|---|---|---|---|---|
| Tahoe | 84% | 141 ms | 31 | |
| Reno | 98% | 151 ms | 33 | |
| CUBIC | 98% | 171 ms | 40 | |
| BBR | 94% | 105 ms | 72 |
使い方
- 例を選ぶか、通信 1・通信 2 の方式と回線の条件(帯域・キューの深さ・ランダムな損失・ラウンド数)を選びます。
- グラフは 1 ラウンド(1 往復)ごとに送ったパケットの数と、ルーターのキューの長さです。グラフを押したりなぞったりすると、そのラウンドの様子が下に出ます。再生や ◀ ▶、キーボードの ← → でも動かせます。
- グラフの下の色の帯は、それぞれの通信がどの段階(スロースタート・輻輳回避など)にいたかを表します。
- 一番下の表で、今の回線で 4 つの方式を 1 本ずつ動かしたときの利用率と往復時間を比べられます。
輻輳制御とは
インターネットでは、多くの通信が同じ回線とルーターを分け合っています。みんなが一度に送りすぎるとルーターのキューがあふれてパケットが捨てられ、送り直しでさらに混む「輻輳崩壊」が起きます(1986 年に実際に起きました)。そこで TCP は、返事(ACK)を待たずに送ってよい量(輻輳ウィンドウ)を、回線の様子を見ながら自分で調整します。
Tahoe・Reno・CUBIC は、パケットが失われたことを「混んでいる」合図とみなす損失ベースの方式です。少しずつ増やし、損失したら大きく減らす(AIMD)ことで、複数の通信がだんだん公平に分け合うようになります。ただし、キューがあふれるまで送るので、キューが深いと遅延が大きくなり(バッファブロート)、混雑と関係ない損失でも減らしてしまいます。BBR は損失ではなく、届いた速さと往復時間を測って回線の容量を見積もる方式で、キューをためずに帯域を使い切ることを目指します。
このシミュレーションのきまり
- 時間を 1 往復(ラウンド)ごとに進める簡単なモデルです。最小の往復時間は 100 ms、帯域は 100 ms に送れるパケットの数(BDP)で表します。
- 1 ラウンドに送ったパケットの合計が BDP を超えるとキューにたまり、その分だけ往復時間が延びます。BDP + キューを超えた分は捨てられ、送った量に比例して各通信に割り振ります。
- 損失のあと 3 個以上届けば重複 ACK で気づき、それより少なければタイムアウトとします。Reno の高速回復は 1 ラウンドで終わるものとし、CUBIC は RFC 9438 の C = 0.4・β = 0.7、BBR は最初の版(v1)の考え方を単純にしたものです。