TCP/UDPの仕組み

再送制御 さいそうせいぎょ

再送制御再送タイムアウト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.1 Seg.2 ロス Seg.3 Seg.4 Seg.5 受信側ACK: 「1は届いた。3・4・5も届いた(SACKで通知)。2だけ欠けてる」 Seg.2 再送のみ SACKにより、ロスした Seg.2 だけを再送。他は送り直し不要。

SACKなしだと Seg.2 以降をすべて再送する必要がありますが、SACKにより Seg.2 だけを再送できます。


指数バックオフ

再送を繰り返しても応答がない場合、RTO(再送タイムアウト)は指数的に増加します。例えば最初は1秒 → 2秒 → 4秒 → 8秒 → …と増えていきます。これはネットワークが混雑しているときに送信量を急減させる安全弁です。


関連する規格・RFC

規格・RFC番号内容
RFC 793TCP基本仕様(再送制御を含む)
RFC 2018SACK(選択的確認応答)
RFC 2988RTOの計算アルゴリズム
RFC 6675SACK利用時の輻輳制御

関連用語