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 のスロースタートを回避できる。
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
TCP/IP
インターネット通信の基盤となるプロトコル群で、データの分割・送信・再組立を信頼性高く行う
HTTP/2
HTTP/1.1 の性能限界を解消するために設計された、多重化・ヘッダー圧縮・サーバープッシュを備えたプロトコル
指数バックオフとは - リトライ間隔の設計とジッター付き実装例
指数バックオフはリトライ間隔を 2 倍ずつ増やして障害時の負荷集中を防ぐ戦略。ジッター追加の理由と Go/Python/TypeScript での実装パターンを解説
合意アルゴリズム
分散システムで複数のノードが同じ値に合意するためのアルゴリズム
アルゴリズム
問題を解くための手順。計算量を意識した効率的な手順がプログラムの性能を決める
Template Method パターン
アルゴリズムの骨格を親クラスで定義し、具体的なステップをサブクラスに委ねるデザインパターン
関連する記事
アルゴリズム本ガイド - 競プロだけじゃない、実務に活きる選び方
アルゴリズム本の 3 タイプと、実務でアルゴリズムの知識が活きる場面、数学が苦手な人向けの学習ルートを紹介します。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。
手が止まったら本を開け - デバッグとしての読書
コードを書いていて手が止まる瞬間は、読書のチャンスです。実装に詰まったときに技術書を開く習慣が、問題解決力とコードの質を同時に高める理由を解説します。