TCPの通信速度制御アルゴリズム

目次
TCPの通信速度制御アルゴリズム|スロースタートと輻輳制御
TCP(Transmission Control Protocol)は、インターネット上で最も広く利用されている 信頼性の高い通信プロトコルです。 Web通信、メール、ファイル転送など、多くのアプリケーションがTCPの上で動作しています。
TCPの大きな特徴のひとつが「通信速度を自動的に制御する仕組み」です。 ネットワークの混雑状況に応じて送信速度を調整し、 パケットロスを抑えながら効率的にデータ転送を行います。
本記事では、TCPの通信速度制御アルゴリズムについて、 スロースタート、輻輳回避、再送制御などの仕組みを中心に、 エンジニア向けに詳しく解説します。
TCPの基本的な制御概念
TCPでは、送信側が一度に送信できるデータ量を制御するために、 主に以下の2つのウィンドウを使用します。
- 受信ウィンドウ(rwnd)
- 輻輳ウィンドウ(cwnd)
実際の送信可能量は、以下の小さい方で決まります。
送信可能量 = min(rwnd, cwnd)
このうち、ネットワークの混雑状況に応じて変化するのが輻輳ウィンドウ(cwnd)です。
スロースタート(Slow Start)
TCP通信は、最初から高速で送信するのではなく、 「スロースタート」と呼ばれる段階から始まります。
スロースタートでは、cwndを小さい値(通常は1〜10セグメント程度)から開始し、 ACKを受信するたびに指数関数的に増加させます。
スロースタートの動作
cwnd = 1
→ 2 → 4 → 8 → 16 → 32 ...
このように、RTTごとに約2倍ずつ増加するため、 短時間で通信速度を引き上げることができます。
なぜスロースタートが必要か
初期状態でネットワークの帯域や混雑状況は分かりません。 いきなり大量のデータを送ると輻輳(混雑)を引き起こす可能性があります。
そのため、徐々に送信量を増やし、 ネットワークの許容量を探る仕組みが採用されています。
スロースタートしきい値(ssthresh)
スロースタートは無制限に続くわけではありません。 ある閾値(ssthresh)に達すると、 増加方法が指数関数から線形増加に変わります。
cwnd < ssthresh → スロースタート
cwnd ≥ ssthresh → 輻輳回避
輻輳回避(Congestion Avoidance)
スロースタートの後は、輻輳回避フェーズに移行します。
このフェーズでは、cwndはゆっくりと線形に増加します。
cwnd = cwnd + 1(RTTごと)
これにより、ネットワークの限界に近い状態で安定した通信が可能になります。
パケットロスと輻輳検知
TCPでは、パケットロスを「ネットワークが混雑しているサイン」として扱います。
ロス検知には主に以下の方法があります。
- タイムアウト(RTO)
- 重複ACK(Duplicate ACK)
タイムアウト
ACKが一定時間返ってこない場合、パケットロスと判断されます。
この場合、TCPは大きく速度を落とします。
cwnd = 1(リセット)
ssthresh = cwnd / 2
重複ACK(Fast Retransmit)
同じACKが3回以上届いた場合、パケットロスと判断します。
タイムアウトよりも軽い処理で済みます。
ssthresh = cwnd / 2
cwnd = ssthresh
Fast Recovery(高速回復)
Fast Retransmit後に実行されるのがFast Recoveryです。
これは通信を完全にリセットせず、 ある程度の速度を維持したまま回復する仕組みです。
従来のTCPでは、ロスが発生するとスロースタートに戻るため、 スループットが大きく低下していました。
Fast Recoveryにより、この影響を軽減できます。
RTTとスループットの関係
TCPのスループットは、RTT(往復遅延時間)にも大きく依存します。
スループット ≒ cwnd / RTT
RTTが大きいと、ACKの返りが遅くなり、 cwndの成長も遅くなるため、通信速度が低下します。
帯域遅延積(BDP)
高速・長距離通信では、帯域遅延積(BDP)が重要です。
BDP = 帯域 × RTT
この値以上のウィンドウサイズがないと、 回線をフルに使い切ることができません。
近年のTCPアルゴリズム
従来のTCP(Renoなど)に加え、 現在ではさまざまな改良アルゴリズムが存在します。
- CUBIC(Linuxのデフォルト)
- BBR(Google開発)
CUBIC
高速回線向けに設計され、cwndを非線形に増加させます。
BBR
パケットロスではなく帯域とRTTをもとに制御します。 高遅延環境でも高いスループットを実現できます。
よくある誤解
帯域が広ければ速い
TCPは輻輳制御により速度を制限するため、 常に最大帯域を使うとは限りません。
パケットロスは少しなら問題ない
TCPではロスが発生すると大きく速度が低下します。
遅延は関係ない
RTTはスループットに直接影響します。
実務での最適化ポイント
- パケットロスを減らす
- RTTを短縮する(CDN活用)
- 適切なTCPアルゴリズムを選択
- ウィンドウサイズ調整
- QoS設定
まとめ
TCPは、スロースタートと輻輳制御を組み合わせることで、 ネットワークの状態に応じた通信速度制御を実現しています。
スロースタートでは指数的に速度を上げ、 輻輳回避では安定した通信を維持します。
パケットロスが発生すると速度は低下し、 RTTや帯域遅延積もスループットに影響します。
現代ではCUBICやBBRといった新しいアルゴリズムも登場し、 より効率的な通信が可能になっています。
TCPの挙動を理解することは、 ネットワーク性能の分析や最適化において非常に重要です。





