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 のスロースタートを回避できる。
より深く学ぶには関連書籍が役立つ。