6

我目前正在尝试实现单向 TCP,我想澄清一下 TCP 发送方/接收方窗口和接收缓冲区的行为。

我对加窗过程的理解如下:

窗口大小表示发送方一次可以发送的最大未确认字节数。

这个尺寸是在连接时商定的。

TCP 发送方应跟踪具有较低序列号的 ACK,并在收到 ACK 时将数据包标记为 ACKed。如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。

现在,我对接收缓冲区的理解......

这在数据包无序到达时使用。数据被放入缓冲区,接收方不确认它,而是继续确认它在最早的乱序数据包之前收到的最后一个数据包。这会导致发送方在重复的 ACK 号之后“快速”重新传输下一个数据包。

这是对这两个概念的正确理解吗?如果不是,请澄清。

谢谢!

4

1 回答 1

22

窗口大小表示发送方一次可以发送的最大未确认字节数。

不,这是可以传输的未确认字节的最大数量。当发件人达到该限制时,他必须停止发送。

这个尺寸是在连接时商定的。

不,它在协议中动态调整。

TCP 发送方应跟踪具有较低序列号的 ACK,并在收到 ACK 时将数据包标记为 ACKed。

发送者应该缓冲发送的数据,直到它被确认,此时它可以被丢弃。如果它没有被确认,它可能会被重新传输等。

如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。

任何 ACK 都包含一个序列号。可以丢弃低于该序列号的所有缓冲发送数据。

现在,我对接收缓冲区的理解......

这在数据包无序到达时使用。

不,它在任何有序数据包到达时使用。它一直存在,直到被应用程序读取。乱序段根本不需要缓冲。

数据被放入缓冲区,接收方不确认它,而是继续确认它在最早的乱序数据包之前收到的最后一个数据包。这会导致发送方在重复的 ACK 号之后“快速”重新传输下一个数据包。

或多或少,但缓冲部分是可选的。

于 2013-06-05T01:49:47.157 回答