2013-06-04 25 views
4

我目前正在嘗試實現單向TCP,我只是想澄清一下TCP發送者/接收者窗口和接收緩衝區的行爲。TCP窗口和緩衝區 - 檢查我的理解?

我的加窗過程的理解如下:

窗口大小表示該發送方可以一次發送未確認的字節的最大數目。

此尺寸在連接期間達成一致。

TCP發送方應該記錄下較低序號的ACK,並且在接收到ACK時將數據包標記爲ACK。如果最低序列號(它正在跟蹤)與當前窗口中的第一個字節匹配,請將窗口向右滑動。現在

,我接收緩衝區的理解...

這當一個數據包到達不按順序使用。數據被放入緩衝區,接收方不會對其進行確認,而是繼續在最早的無序數據包之前確認它收到的最後一個數據包。這會使發送者在重複的ACK號碼之後「快速」重新發送下一個數據包。

這是對這兩個概念的正確理解,如果不是,請澄清。

謝謝!

回答

16

窗口大小表示發件人一次可以發送的未確認字節的最大字節數。

不是。它是可以傳輸的未確認字節的最大數量。當發件人達到限制時,他必須停止發送。

此尺寸在連接期間達成一致。

不,它在協議中動態調整。

TCP發送方應該跟蹤ACK序號較低的ACK,並且在接收到ACK時將數據包標記爲ACK。

發送方應該緩衝發送的數據直到它被確認,此時它可以被丟棄。如果未確認,則可能會被重新發送等。

如果最低序列號(它正在跟蹤)與當前窗口中的第一個字節匹配,請將窗口向右滑動。

任何ACK都包含一個序列號。所有緩衝的低於該序列號的發送數據都可以被丟棄。

現在,我對接收緩衝區的理解...

這是在數據包到達無序時使用的。

不,它用於任何有序分組到達。它保持在那裏直到應用程序讀取。亂序片段不一定需要緩衝。

數據被放入緩衝區,接收方不會對其進行確認,而是繼續確認它在最早的無序包之前收到的最後一個包。這會使發送者在重複的ACK號碼之後「快速」重新發送下一個數據包。

或多或少,但緩衝部分是可選的。

+0

關於接收緩衝區。 AFAIK,當有序數據到達時,它被放入緩衝區,發送一個ACK作爲響應,並且RCV.NXT指針被更新,預期接下來會接收到第一個字節。當應用程序可用時,它會讀取數據直到RCV.NXT - 1,但它如何知道哪個是要檢索的第一個字節?應該有另一個變量/指針來控制它,對吧? – rutex