輻輳の例(続き)
以下ではCwnd はバイト単位表現、cwndはセグメント単位表現とする。
Fig.21.9
MSSが256byteのとき
初期状態
ssthresh ← 65535 byte
Cwnd ← 256 byte (= 1セグメント)
最初のSYNのタイムアウト発生 →スロースタート開始
ssthresh ← 512 = max(2セグメント,Cwnd/2)
Cwnd ← 256 byte (= 1セグメント)
ACK257, ACK513到着時
Cwnd ≦ ssthresh なのでスロースタートを続ける
Cwnd ← Cwnd + 256 byte (= 1セグメント)
ACK769到着時
Cwnd > ssthresh なので輻輳回避スタート
Cwnd ← Cwnd + segsize*segsize/Cwnd + segsize/8
(cwnd ← cwnd + 1/cwnd の計算をバイト単位で行っていることになる)
Cwnd ← 768 + 256*256/768 + 256/8 = 885
ACK1025到着時
Cwnd ← 885 + 256*256/885 + 256/8 = 991
Fig.21.11
最初のACK6657到着時まで輻輳回避によって Cwndの増加が続く。
重複したACK6657の到着
Cwndの値は増加されない(Fig.21.10の10秒ごろの平坦な部分)。
3個めの重複ACK6657の到着
ssthresh ← Cwnd / 2
(ただしセグメントサイズの倍数に丸める)
Cwnd ← ssthresh + 3 * セグメントサイズ
(3は重複ACKの数)
= 1024 + 3 * 256
データの再転送
さらに53個の重複ACK6657の到着
Cwnd ← Cwnd + 256 byte (=1 セグメント)
確認応答されていないデータ数< Cwnd ならば 新しいデータを送る
ACK8961の到着
Cwnd ← ssthresh
(すぐに + 256 される)