在选择重传协议中,窗口大小必须小于或等于SR协议序列号空间大小的一半。这是为什么呢?如何做到的?
这是为了避免数据包被错误地识别。
如果窗口大小大于序列号空间的一半,那么如果一个ACK丢失了,发送方可能会发送新的数据包,而接收方则认为这些数据包是重传。
例如,如果我们的序列号范围是0-3,窗口大小是3,则可能会发生这种情况。
[initially] (B's window = [0,1,2])
A -> 0 -> B (B's window = [1,2,3])
A -> 1 -> B (B's window = [2,3,0])
A -> 2 -> B (B's window = [3,0,1])
[lost] ACK0
[lost] ACK1
A <- ACK2 <- B
A -> 3 -> B
A -> 0 -> B [retransmission]
A -> 1 -> B [retransmission]
在丢失了一个数据包后,B现在希望接收到的下一个数据包序列号为3、0和1。
但是,A正在发送的0和1实际上是重传的数据包,因此B会无序地接收它们。
通过在这个例子中将窗口大小限制为2,我们避免了这个问题,因为B现在只期待接收2和3,而0和1只能是重传数据包。当达到最大数后,序列空间会回归零。考虑一种极端情况,即所有的ACK都丢失了——发送方不移动其窗口,但是接收方会移动(因为它不知道发送方没有收到ACK)。如果我们不将窗口大小限制为序列空间的一半,我们将得到重叠的发送方“已发送但未确认”的序列空间和接收方“有效新”的序列空间。这将导致重新传输被解释为新数据包。
http://webmuseum.mi.fh-offenburg.de/index.php?view=exh&src=73
基本上,如果窗口大小过高,那么传输中的损坏可能会导致错误的假设,并导致最终结果中的数据损坏。