TCPタイムアウトと再転送

詳解TCP/IP
れにうむ
イントロダクション

TCP4種類のタイマー
 再転送タイマ
○ 今回
 持続タイマ
○ 次章で解説
 キープアライブタイマ(相手通信可能?)
○ 次の次の章で解説
 2MSLタイマ
○ すでに解説(18章6節)
再転送タイマー

シンプルなタイムアウト・再転送
 ACKが帰ってこない時、再転送間隔は四捨
五入すると、たとえば
○ 1s 3s 6s 1s 24s 48s 64s 64s …
○ 64sを最大値にして指数関数的に増えていっ
ている
 このように増加することを指数バックオフという
往復時間の測定

往復時間(RTT)測定の必要性
 往復時間を測定することによりTCPはタイ
ムアウトを適正な時間に補正する

RTT評価値
 オリジナルのTCP仕様で使用される、往復
時間を評価する値
○ 以下、往復時間をM,RTT評価値をRとする
往復時間の測定

RTT評価値
 R ← αR + ( 1 – α )M で、更新されていく
○ ←は代入
○ 右辺のRは更新前のR
○ αは「 新しい測定値がどのくらい評価値に影
響をあたえるか 」という係数(0<α<1)
 デフォルトは0.9
往復時間の測定

再転送タイムアウト値(RTO)
 転送したデータが、届かなかったと判定し、
再送するまでの時間
 RTO=Rβ で計算される
○ 往復時間評価値のβ(遅延分散系数)倍
 βのデフォルトは2
往復時間の測定

前ページの再送の欠点
 必要でない再転送により生じるRTTの変動
に対応できない
 Jacobsonが新しい計算式を提案
往復時間の測定

Jacobsonの計算式
 Err = M – A
○ M(RTT測定値) A(RTT評価値)
 A ← A + g Err
○ gは係数デフォルトが0.125
 D ← D + h ( | Err | - D )
○ D(平滑化された平均偏差) h(偏差の変数0.25)
 RTO = A + 4D
○ RTO(再転送タイムアウト値)
コラム Karnのアルゴリズム

再転送をした場合帰ってきたACKがど
れに対するものかわからない
 正確な往復時間を知ることができない
○ 再送された通信ではRTOを更新しない
実際の計算

初期のRTO
 RTO=A + 2D
○ 2Dははここだけで使って以降は4D
 この時の初期値はA=0、D=3
○ 初期RTO = 0 + 2 * 3 = 6
実際の計算

一回ACKが到着後A/D初期化
 A = M + 0.5
 D=A/2
輻輳制御

輻輳状態
 あるポイントでルータの限界に達すじて、
パケットが破棄される状態
輻輳制御

前提
 パケットの消失はほぼ原因は輻輳
○ 実際、破損での消失は1%未満
輻輳制御

パケット消失の検知
 タイムアウトの発生
 重複ACKの受信
輻輳制御

重複ACK
 予想していたパケットを飛ばしてパケット
を受信した場合、そのデータをセーブして、
前回と同じ番号のACKを送る。
○ 飛ばされたものが送られるまで繰り返す。
○ 同じACKの受信でデータの消失を探知する
輻輳制御

輻輳回避とスロースタート
 スロースタート
○ データ送信開始時に徐々に送信セグメントを
増やす
 輻輳回避
○ スロースタートで増やした結果輻輳がおもっ
たら輻輳回避
輻輳回避

輻輳ウィンドウとスロースタート閾値
 輻輳ウィンドウ(以下 cwnd)
○ 確認応答を待たずに送っていいセグメント数
 スロースタート閾値(以下 ssthresh)
○ スロースタートをする基準値
輻輳回避

実際の動作 1
 コネクション初期化時
○ cwnd 1セグメント
○ ssthresh 65535バイト
輻輳回避

実際の動作 2
 TCPでは、受信側が広告したウィンドウサ
イズか、cwndを超えた送信をしない
○ 前者は受信者側のフロー制御
○ 後者は送信者側のフロー制御
輻輳回避

実際の動作 3
 輻輳が発生
○ 現行ウィンドウサイズの半分をssthreshに
○ 輻輳の検知がタイムアウトの場合cwndは1
 要するに、スロースタートしだす
輻輳回避

実際の動作 4
 cwndがssthreshと等しい又は小さい場合
○ スロースタートを行う
 確認応答が帰ってくるたびにssthresh以下の
範囲でcwndを指数関数的に増やす
○ ssthreshは問題があったウィンドウサイズの
半分
輻輳回避

実際の動作 4 続
 cwndのサイズがssthreshを越した時
○ 輻輳回避を行う
輻輳回避

輻輳回避
 輻輳回避では、確認応答が帰ってくるたび、
cwndを1/cwndごと増加させ、セグメントサ
イズの断片を加算
○ スロースタートよりゆっくりな増加
高速再転送

説明する前に…
 TCPでは順番の違うセグメントを受け取っ
た時に遅滞なく重複ACKを送らねばならな
い。
高速再転送

消失の判定
 重複ACKを1-2個受け取っただけでは順序の
入れ替えが起こっただけの可能性も高い
 しかし、3個以上重複ACKが来る場合消失の
可能性が高い
○ 再転送タイマが切れる前に再転送する
 この時、スロースタートはしない
高速再転送

具体的な動作 1
 3番目の重複ACKが送られてくる
○ ssthreshがcwndのサイズの半分に
○ そして、消失セグメントを再転送
○ cwndサイズを一時的にssthreshにセグメント
サイズの3倍を加えたものにする
高速再転送

具体的な動作 2
 別の重複ACKが来る
○ cwndをセグメントサイズ単位で増加させてパ
ケット送信
高速再転送

具体的な動作 3
 新しい確認応答が到着
○ 最初の段階で消失したデータが相手に到着し
たことがわかる
○ cwndのサイズをssthreshに設定する
ICMPエラー

コネクションするときに返されることの
有る一般的なICMPエラー
 発信元抑制
○ ルータなどのメモリが一杯になりそうなとき
 ホスト到達不可、ネットワーク到達不可
○ 相手に到達できない時
ICMPエラー

送信元抑制発生時
 スロースタートに初期化する
○ cwndを1に、ssthreshは変えない
ICMPエラー

ホスト到達不可、ネットワーク到達不可
 一時的なものとみなして無視
○ タイムアウトまで再転送する
 タイムアウトするとエラーコードはタイム
アウトではなくICMPのものになる
再パケット化

再転送するとき無理に同じセグメントで
送らなくてもいい
 複数をまとめて効率化
○ 確認応答が受信バイト数だから出来る技
END

終