TCP 輻輳制御

ネットワークの混雑を検知し、送信速度を動的に調整して公平で効率的なデータ転送を実現する TCP の仕組み

ネットワーク

TCP 輻輳制御とは

TCP 輻輳制御 (Congestion Control) は、ネットワークの混雑度を推定し、送信速度を動的に調整する仕組みである。全ての送信者が最大速度でデータを送ると、ルーターのバッファが溢れてパケットロスが発生する。輻輳制御はこの問題を防ぎ、ネットワーク帯域を公平に共有する。

輻輳ウィンドウ (cwnd)

TCP は「輻輳ウィンドウ (cwnd)」で一度に送信できるデータ量を制御する。

送信可能量 = min(cwnd, 受信ウィンドウ)

4 つのフェーズ

1. スロースタート

接続開始時、cwnd を 1 MSS (Maximum Segment Size) から始め、ACK を受け取るたびに倍増させる。

RTT 1: cwnd = 1 MSS  → 1 パケット送信
RTT 2: cwnd = 2 MSS  → 2 パケット送信
RTT 3: cwnd = 4 MSS  → 4 パケット送信
RTT 4: cwnd = 8 MSS  → 8 パケット送信

「スロースタート」という名前だが、指数的に増加するため実際には急速に加速する。

2. 輻輳回避

cwnd がしきい値 (ssthresh) に達すると、RTT ごとに 1 MSS ずつ線形に増加する。慎重に帯域を探る。

3. パケットロス検知

パケットロスが発生すると、ネットワークが混雑していると判断する。

4. 高速回復

パケットロス後、cwnd を半分に減らし、輻輳回避フェーズに戻る。

アルゴリズムの進化

アルゴリズム 年代 特徴
Tahoe 1988 パケットロスで cwnd を 1 に戻す
Reno 1990 高速回復を導入 (cwnd を半分に)
CUBIC 2008 Linux デフォルト、高帯域に最適化
BBR 2016 Google 開発、帯域と RTT を推定

BBR (Bottleneck Bandwidth and Round-trip propagation time) は、パケットロスではなく帯域と RTT を直接推定する。従来のアルゴリズムより高帯域・高遅延のネットワーク (大陸間通信) で効率的だ。

Web パフォーマンスへの影響

コールドスタートの遅延

新しい TCP 接続はスロースタートから始まるため、最初のデータ転送が遅い。HTTP/2 の多重化や HTTP/3 (QUIC) の 0-RTT ハンドシェイクは、この問題を軽減する。

CDN の効果

CloudFront のエッジロケーションはユーザーに近いため、RTT が短い。RTT が短いとスロースタートの加速が速く、cwnd が早く大きくなる。CDN がパフォーマンスを改善する理由の 1 つだ。

Lambda + API Gateway での考慮

Lambda は短命なプロセスのため、TCP 接続が毎回新規に確立される。DB への接続プーリング (RDS Proxy) を使えば、TCP のスロースタートを回避できる。

より深く学ぶには関連書籍が役立つ。

関連用語