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

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の挙動を理解することは、 ネットワーク性能の分析や最適化において非常に重要です。