詳解TCP/IP TCPタイムアウトと再転送 れにうむ
イントロダクション TCP4種類のタイマー 再転送タイマ 持続タイマ キープアライブタイマ(相手通信可能?) 2MSLタイマ 今回 次章で解説 キープアライブタイマ(相手通信可能?) 次の次の章で解説 2MSLタイマ すでに解説(18章6節)
再転送タイマー シンプルなタイムアウト・再転送 ACKが帰ってこない時、再転送間隔は四捨五入すると、たとえば 1s 3s 6s 1s 24s 48s 64s 64s … 64sを最大値にして指数関数的に増えていっている このように増加することを指数バックオフという
往復時間の測定 往復時間(RTT)測定の必要性 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 A ← A + g Err 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 この時の初期値はA=0、D=3 2Dははここだけで使って以降は4D
実際の計算 一回ACKが到着後A/D初期化 A = M + 0.5 D=A/2
輻輳制御 輻輳状態 あるポイントでルータの限界に達すじて、パケットが破棄される状態
輻輳制御 前提 パケットの消失はほぼ原因は輻輳 実際、破損での消失は1%未満
輻輳制御 パケット消失の検知 タイムアウトの発生 重複ACKの受信
輻輳制御 重複ACK 予想していたパケットを飛ばしてパケットを受信した場合、そのデータをセーブして、前回と同じ番号のACKを送る。 飛ばされたものが送られるまで繰り返す。 同じACKの受信でデータの消失を探知する
輻輳制御 輻輳回避とスロースタート スロースタート 輻輳回避 データ送信開始時に徐々に送信セグメントを増やす スロースタートで増やした結果輻輳がおもったら輻輳回避
輻輳回避 輻輳ウィンドウとスロースタート閾値 輻輳ウィンドウ(以下 cwnd) スロースタート閾値(以下 ssthresh) 確認応答を待たずに送っていいセグメント数 スロースタート閾値(以下 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個受け取っただけでは順序の入れ替えが起こっただけの可能性も高い 再転送タイマが切れる前に再転送する この時、スロースタートはしない
高速再転送 具体的な動作 1 3番目の重複ACKが送られてくる ssthreshがcwndのサイズの半分に そして、消失セグメントを再転送 cwndサイズを一時的にssthreshにセグメントサイズの3倍を加えたものにする
高速再転送 具体的な動作 2 別の重複ACKが来る cwndをセグメントサイズ単位で増加させてパケット送信
高速再転送 具体的な動作 3 新しい確認応答が到着 最初の段階で消失したデータが相手に到着し たことがわかる cwndのサイズをssthreshに設定する
ICMPエラー コネクションするときに返されることの有る一般的なICMPエラー 発信元抑制 ホスト到達不可、ネットワーク到達不可 ルータなどのメモリが一杯になりそうなとき ホスト到達不可、ネットワーク到達不可 相手に到達できない時
ICMPエラー 送信元抑制発生時 スロースタートに初期化する cwndを1に、ssthreshは変えない
ICMPエラー ホスト到達不可、ネットワーク到達不可 一時的なものとみなして無視 タイムアウトまで再転送する タイムアウトするとエラーコードはタイムアウトではなくICMPのものになる
再パケット化 再転送するとき無理に同じセグメントで送らなくてもいい 複数をまとめて効率化 確認応答が受信バイト数だから出来る技
END 終