非常に単純なアルゴリズムであるはずの TCP のスロー スタートを理解するのに苦労していることを認めると、少し恥ずかしい思いをします。次のシナリオを検討してください。
- 送信者は CWND=4 で、4 つのセグメントすべてを送信します
- 受信者は、受信したセグメントごとに ack を送信します (遅延 ack 戦略を使用していません)。
- 4 つの ACK が送信側にすぐに到着し、送信側のネットワーク バッファでキューに入れられます。
- 送信者は ack 1 を処理し、cwnd を 5 に増やし、5 つのセグメントを送信します。
- 送信者は ack 2 を処理し、cwnd を 6 に増やし、6 つのセグメントを送信します (合計送信数: 11)
- 送信者は ack 3 を処理し、cwnd を 7 に増やし、7 つのセグメントを送信します (合計送信数: 18)
- 送信者は ack 4 を処理し、cwnd を 8 に増やし、8 つのセグメントを送信します (合計送信数: 26)
ACK は送信者のバッファーでキューに入れられたため、送信者は 26 セグメントを送信できましたが、4 セグメントの ACK しか受信できませんでした。これは、送信されるトラフィックに上限を設定するスロー スタートの意図に反するようです。
私の推論のどこが間違っていますか?
アップデート
[RFC 2581](https://www.rfc-editor.org/rfc/rfc2581) は、CWND を次のように定義しています。任意の時点で、TCP は、確認済みのシーケンス番号の最大値と cwnd および rwnd の最小値の合計よりも高いシーケンス番号を持つデータを送信してはなりません (MUST NOT)。
これは@jmanの説明を裏付けています。