TCPタイムアウトと再転送
Download
Report
Transcript 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
終