我目前正在尝试实现单向TCP,我只是想澄清TCP发送/接收窗口和接收缓冲区的行为。
我对窗口化过程的理解如下:
窗口大小表示发送方一次可以发送的最大未确认字节数。
此尺寸在连接期间商定。
TCP发送者应跟踪序列号较低的确认字符,并在收到确认字符时将数据包标记为ACKed。如果最低序列号(它正在跟踪的)与当前窗口中的第一个字节匹配,请将窗口向右滑动。
现在,我对接收器缓冲区的理解…
当数据包无序到达时使用。数据被放入缓冲区,接收者不确认字符,而是继续确认字符最早无序数据包之前收到的最后一个数据包。这导致发送方在重复的确认字符号之后“快速”重新发送下一个数据包。
这是对这两个概念的正确理解吗?如果不是,请澄清。
谢谢!
窗口大小表示发送方一次可以发送的未确认字节的最大字节数。
不可以。它是可以传输的最大未确认字节数。当发件人达到该限制时,他必须停止发送。
此尺寸在连接期间商定。
不可以。它在协议中动态调整。
TCP发送者应跟踪序列号较低的确认字符,并在收到确认字符时将数据包标记为已确认。
发送者应该缓冲发送的数据,直到它被确认,此时它可以被丢弃。如果它没有被确认,它可能会被重传等。
如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。
任何确认字符都包含一个序列号。低于该序列号的所有缓冲发送数据都可以丢弃。
现在,我对接收器缓冲区的理解…
当数据包无序到达时使用。
不,它在任何有序数据包到达时使用。它一直保留在那里,直到应用程序读取。乱序段根本不一定被缓冲。
数据被放入缓冲区,接收方不确认字符,而是继续确认字符最早的乱序数据包之前收到的最后一个数据包。这导致发送者在重复的确认字符号之后“快速”重新发送下一个数据包。
或多或少,但缓冲部分是可选的。