根据我的理解,在Go Back N中,序列号为i的确认表明直到i-1(包括i-1)的所有数据包都已被确认。
因此,如果发送方的窗口大小为 w,基数为 b,因此窗口为 [b, b+w-1],并且收到确认 n, n > b,则发送方可以将窗口向前滑动到 [n, n+w-1].
假设使用模运算,Go Back N 如何在面对无序确认时确保安全?
例如,假设序列号为 0、1、2、3,最大窗口大小为 3。假设由于动态路由,发送方按以下顺序接收确认
确认2
确认3
确认1
收到 ack 2 和 3 时,它将向前滑动窗口
| 0 1 2 | 0 1 2 3 0 1 2 3 0 1 2 3
0 1 | 2 3 0 | 2 3 0 1 2 3 0 1 2 3
0 1 2 | 0 1 2 3 0 1 | 3 0 1 2 3 0 1 2 3
收到ack 1(表示收到数据包0)后,发送方是否不会再次向前滑动窗口,以
0 1 2 3 0 | 1 2 3 | 1 2 3 0 1 2 3
因此发送者无法消除两者之间的歧义 ack 2、ack 3、ack 1(重新排序)和ack 1(丢弃)、ack 2、ack 3、ack 0(丢弃)、ack 1
Go-Back-N (GBN) 是一种通过流水线提高吞吐量的“简单”方法。这种简单性基于一些重要的基本假设,如 Kurose 和 Ross 所著的《计算机网络 - 自上而下的方法》一书中所述:
底层网络可能会丢弃或损坏数据包另一种方法选择性重复 (SR) 可以处理数据包重新排序,因为它单独处理所有数据包:
存储每个收到的数据包,并通过确认确认该数据包的正确性