我正在尝试在两个独立的客户端和服务器应用程序上实现Go back N协议。假设我的序列号必须符合3位,所以2 ^ 3 = 8个最大数,2 ^ 3 - 1 = 7个窗口大小。
我最初发送整个窗口。正确接收前两个数据包(0和1)。数据包2被丢弃。当接收器收到数据包3到6时,它预计为2,所以它必须无法收到它想要的数据包2.
Sender Receiver
0 0
1 1
2 (packet dropped)
3 nack2
4 nack2
5 nack2
6 nack2
当发件人收到第一个nack2时,它知道已收到0和1(通过捎带)并向前移动其窗口,但它也必须从序列号2开始重新发送其窗口(所以2-3-4- 5-6-和可能7-0)。当发件人收到第二个nack2时,它已经发送了这些数据包。由于协议,发件人将再次重新发送他的整个窗口,包括2.现在接收器可能会收到2(和其他),但在第二个nack2批次中它将重新接收2,这是不按顺序,将不得不扼杀其预期的数据包,依此类推。我在所有这些假设中都是正确的吗?
如果我在,在我看来,Go Back N发送的数据包比Stop和Wait多得多,尤其是增加窗口大小的数量越多。我没得到什么?
答案 0 :(得分:0)
我发现这个问题的解决方案是简单地使用更多位来表示序列号,因此具有更大的MAX。如果您的MAX是2 *窗口大小,则延迟2不能被误解为正确的ACK。