0

假设发送方和接收方有一个 16 大小的缓冲区和一个 7 大小的窗口。

换句话说,每一边都有一个缓冲区,一个数组,它们可以在其中存储 16 帧。每个帧都有一个适合 16 帧缓冲区(数组中的索引)的 id。接收方有一个窗口,在任何给定时间只允许以任何顺序接受 7 帧。当缓冲区中最旧的帧被填满时,窗口将滑动一格。

我现在的问题是,假设一个框架在途中丢失了,但不知何故让它回来太晚了。接收器收到它的时间太晚了,它实际上填满了帧缓冲区的下一个圆圈。

  1. 发送方发送帧:0、1、2、3、4、5、6、7。
  2. 接收器获取帧并发送回一个 ACK​​,因为它已经得到了 7 个(或每个)。
  3. 发送方在第 0 帧上获得超时,然后重新发送。
  4. 发送方收到最多 7 个的 ACK,因此它发送接下来的帧:8、9、10、11、12、13、14
  5. 接收方收到以下数据包:8, 9, 10, 11, 12, 13, 14。它发送一个 ACK​​ 表示已经收到它们并打开缓冲区:15, 0, 1, 2, 3, 4, 5, 6.
  6. 由于超时,接收方获取发送方发送的旧帧 0。接收方认为数据包是合法的并存储它。

如何避免第 6 步发生的事情?我应该发送整个窗口的 CRC 吗?CRC并不完美,因此可能仍然存在问题。

我目前正在通过 C 中的 UDP 套接字执行此操作,因此是 C 标记。

4

0 回答 0