受け手側での動作。通常のデータ(セグメント43)が手順どおりに 受けとられると受信TCPは256バイトのデータをユーザ・プロセスに渡す。 しかし、次に受けとられたセグメント (セグメント 46) は順番が違う。 そのデータの開始シーケンス番号 (6913) は、予想されたシーケンス 番号 (6657) と異なっている。TCPは 256バイトのデータを保存し、 それまでに無事に受け取った最も大きなシーケンス番号+1 (6657) の ACKで応答する。 vangoghによって受け取られた次の7つのセグメント (48,50,52,54,55,57,59) は全て順番が異なるので、(データはセーブされて)重複ACKが生成される。 消失したデータが到着すると (セグメント 63)、受信TCPは バッファに 6657〜8960のデータを持っているので、その 2304バイトの データをユーザ・プロセスに渡す。このデータに関しては、セグメント72 でまとめて確認応答する。このACKは、まだユーザ・プロセスが2304バイトの データを読んでいないので5888 (8192-2304) のウィンドウを広告する。
スロースタートにより、コネクションを流れるデータの量は増加していくが、 中継ルータの限界に到達するとパケットが破棄されはじめる。 前提:「パケットが破損によって失われることは稀で(1%以下)、パケットの 消失がおきるのは途中で輻輳が発生しているためである」 パケットの消失を認識する: タイムアウトの発生 重複ACKの受信 輻輳回避とスロースタートは目的が異なる全く独立したアルゴリズム。 しかし、輻輳が発生するとパケットの転送率を減らすためにスロースタート を用いるので、一緒に実装されている。 (注)輻輳回避:送り手によるフロー制御。ウィンドウ:受け手によるフロー制御。 輻輳ウィンドウ (cwnd) しきい値 (ssthresh)
cwnd≦ssthresh の場合、スロースタート ACKの受信毎に cwnd ← cwnd + 1 それ以外の場合、輻輳回避 ACKの受信毎に cwnd ← cwnd + 1/cwnd
ssthresh ← (現行の輻輳ウィンドウ cwnd) / 2 消失セグメントを再送する。 cwnd ← ssthresh + 3 * (セグメントサイズ)
cwnd ← cwnd + 1 * (セグメントサイズ) 新しい cwnd 値に許可されたらパケットを送出する。
cwnd ← ssthresh