我正在尝试在两个单独的客户端和服务器应用程序上实现 Go back N 协议。假设我的序列号必须适合 3 位,因此 2^3 = 8 个最大数字,并且 2^3 - 1 = 7 窗口大小。
我最初发送我的整个窗口。前两个数据包(0 和 1)被正确接收。数据包 2 被丢弃。当 Receiver 收到数据包 3 到 6 时,它期待 2,因此它必须对收到的数据包表示它想要 2。
Sender Receiver
0 0
1 1
2 (packet dropped)
3 nack2
4 nack2
5 nack2
6 nack2
当 Sender 收到第一个 nack2 时,它知道已经收到 0 和 1(通过捎带)并向前移动它的窗口,但它还必须从序列号 2 开始重新发送它的窗口(所以 2-3-4-5-6 - 并且可能是 7-0)。当 Sender 收到第二个 nack2 时,它已经发送了这些数据包。由于协议的原因,发送者将再次重新发送他的整个窗口,包括 2。现在接收者可能会收到 2(和其他),但在第二个 nack2 批次中,它将重新接收 2,这是乱序的,将必须 nack 其预期的数据包,依此类推。我在所有这些假设中都是正确的吗?
如果是这样,在我看来,Go Back N 发送的数据包比 Stop and Wait 多得多,尤其是您增加其窗口大小的次数越多。我没有得到什么?