为什么在SR协议中窗口大小小于或等于序列号的一半?

28
在选择重传协议中,窗口大小必须小于或等于SR协议序列号空间大小的一半。这是为什么呢?如何做到的?
4个回答

32

这是为了避免数据包被错误地识别。

如果窗口大小大于序列号空间的一半,那么如果一个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只能是重传数据包。

好的解释。我忽视的是发送者(A)将始终一次性发送#个窗口大小的数据包。 - Mo Beigi
根据接收窗口大小<=n/2,其中“n”是发送窗口的序列号。那么我们应该始终使用接收窗口大小=1,这将更有效。不是吗? - rachitmanit

15

当达到最大数后,序列空间会回归零。考虑一种极端情况,即所有的ACK都丢失了——发送方不移动其窗口,但是接收方会移动(因为它不知道发送方没有收到ACK)。如果我们不将窗口大小限制为序列空间的一半,我们将得到重叠的发送方“已发送但未确认”的序列空间和接收方“有效新”的序列空间。这将导致重新传输被解释为新数据包。


5
由于接收器无法区分旧数据包或新数据包,接收器是基于序列号识别数据包的,并且每个连接只有有限数量的唯一序列号。您无法拥有无限缓冲区。
让我们来看一个显然的失败场景:
窗口大小大于序列号空间。假设我们有序列号0、1、2。而我们的窗口大小为4。这意味着窗口中有两个0.
0,1,2,0 <- 取模回绕。当我们收到一份具有序列号0的数据包时。这是第一个数据包还是第四个?不清楚。现在,只要窗口大小大于序列号空间的一半,这个问题就会发生。为什么?因为始终有可能接收器正在查看可能包含在来自发送器的新或旧数据包中的序列号。它总会发生吗?不。但是当它发生时,以下情况会发生:
情况1:
接收器在正确接收数据包0、1、2之后的窗口。 0,1,2,[3,0,1],2 但如果ACK丢失了怎么办?好吧,发送器将重新发送0、1、2。但是0、1是OLD还是NEW?接收器无法判断。
情况2:
接收端相同的窗口。收到了三个数据包。
0,1,2,[3,0,1],2
现在,接收器正确地接收了所有的ACK,除了一个。让我们选择第二个(1)。现在,它将重新发送1。但接收器正在查看1!那么这是期望的新数据吗(不是),还是旧数据?
因此,为了确保窗口永远不会期望可能由潜在的未完成数据包(无论是来自正常传输还是重新传输丢失的ACK)使用的序列号,我们必须要么减小窗口大小,要么增加序列号。
看看当我们将序列号空间增加到6时会发生什么。
0,1,2,3,4,5.
无论我们如何定位窗口,它都不会冒着接收具有旧序列号数据包的风险。
0,1,2,[3,4,5]0,1...
当窗口回绕时,我们可以肯定地知道已按顺序接收了以前的数据包。

1
这个链接有一个动画,逐步演示了协议的每个步骤,以解释为什么窗口大小很重要:

http://webmuseum.mi.fh-offenburg.de/index.php?view=exh&src=73

基本上,如果窗口大小过高,那么传输中的损坏可能会导致错误的假设,并导致最终结果中的数据损坏。

1
请修改您的回答,实际回答问题,而不是告诉人们可以在哪里找到答案。 - anon
请从参考链接中引用答案的重要部分,因为如果链接页面发生更改,答案可能会失效。 - DavidPostill
@PetterFriberg 嗯,什么?你看过链接页面了吗?它解释了为什么窗口大小很重要。这不是垃圾信息,只是NAA。 - anon
我整理了链接并添加了一些解释,我发现动画很有启发性。 - Eric Leschinski
1
链接已经下线,很遗憾。 - OuttaSpaceTime
这个选择重传/回退N或者这些回退协议选择重传协议的动画可能会有所帮助。 - Jun Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接