再送制御 さいそうせいぎょ
再送制御再送タイムアウトRTOSACKパケットロス
再送制御について教えて
簡単に言うとこんな感じ!
「届いたよ」という返事(ACK)が来なければ自動で送り直すのが再送制御だよ。宅配便で「不在のため持ち帰りました」と再配達するみたいに、TCPは確認が取れるまで諦めないんだ!
再送制御とは
再送制御(Retransmission Control)は、TCP通信でパケットが途中で失われた場合に自動的に送り直す仕組みです。TCPはすべてのデータに対してACK(確認応答)を期待し、一定時間内にACKが来なければ同じデータを再送します。
再送を判断する方法は主に2種類あります。1つ目はタイムアウト(RTO: Retransmission Timeout)によるもので、ACKが来ない状態が一定時間続いたら再送します。RTOはネットワークのRTT(往復時間)を参考に動的に調整されます。
2つ目は重複ACK(3つの同じACK)による高速再転送です。同じシーケンス番号のACKが3回来たとき、パケットロスが発生したと判断して即座に再送します。タイムアウトを待つよりも素早く対応できます。
再送制御の仕組み
| トリガー | 動作 | 特徴 |
|---|---|---|
| RTO(再送タイムアウト) | 一定時間ACKが来ない → 再送 | 確実だが遅延が大きい |
| 高速再転送(3つの重複ACK) | 3つの重複ACKを検出 → 即再送 | タイムアウトより素早く対応 |
| SACK(選択的確認応答) | 受信済みの範囲を細かく通知 | 必要な部分だけ再送できる |
| D-SACK | 重複受信をSACKで通知 | 無駄な再送を避けられる |
歴史と背景
- 1981年:RFC 793でTCPの基本的な再送制御が定義
- 1988年:Jacobsonが指数バックオフを取り入れたRTO計算を改良(タイムアウト時はRTOを2倍にする)
- 1996年:SACK(選択的確認応答)がRFC 2018として標準化
- 2000年:RFC 2988でRTO計算アルゴリズムが改訂
- 現在:ほぼすべてのOSがSACKと動的RTOを実装している
SACKの仕組み
SACKなしだと Seg.2 以降をすべて再送する必要がありますが、SACKにより Seg.2 だけを再送できます。
指数バックオフ
再送を繰り返しても応答がない場合、RTO(再送タイムアウト)は指数的に増加します。例えば最初は1秒 → 2秒 → 4秒 → 8秒 → …と増えていきます。これはネットワークが混雑しているときに送信量を急減させる安全弁です。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 793 | TCP基本仕様(再送制御を含む) |
| RFC 2018 | SACK(選択的確認応答) |
| RFC 2988 | RTOの計算アルゴリズム |
| RFC 6675 | SACK利用時の輻輳制御 |
関連用語
- TCP — 再送制御を実装するプロトコル
- 輻輳制御 — 再送と組み合わさる輻輳検知・制御
- TCPウィンドウ制御 — 送信量を制限するフロー制御
- TCP KeepAlive — 長時間接続を維持する関連機能