3

非常に単純なアルゴリズムであるはずの 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の説明を裏付けています。

4

1 に答える 1

3

cwnd未承認のセグメントを表します。そのため、最初の ACK が受信cwnd5れると、スタックは未確認のセグメントがすでに飛行中で2あるため、より多くのセグメントを送信します。3

あなたの例は次のようになります。

  • 送信者は ack 1 を処理し、cwnd を 5 に増やし、さらに 2 つのセグメントを送信します (合計送信数: 6)
  • 送信者は ack 2 を処理し、cwnd を 6 に増やし、さらに 2 つのセグメントを送信します (合計送信数: 8)
  • 送信者は ack 3 を処理し、cwnd を 7 に増やし、さらに 2 つのセグメントを送信します (合計送信数: 10)
  • 送信者は ack 4 を処理し、cwnd を 8 に増やし、さらに 2 つのセグメントを送信します (合計送信数: 12)
于 2013-07-29T17:51:45.937 に答える