假设发送方和接收方有一个16大小的缓冲区和一个7大小的窗口。
换句话说,每一侧都有一个缓冲区,即一个数组,可以在其中存储16帧。每个帧都有一个适合16帧缓冲区(数组中的索引)的id。接收器得到一个窗口,在任何给定的时间内,只允许以任何顺序接受7帧。当缓冲区中最旧的帧被填满时,窗口将滑动一个。
我现在的问题是,比方说,如果一帧在路上丢失了,但不知何故又回来得太晚了。接收器收到它太晚了,它实际上填充了帧缓冲区的下一圈。
- 发送方发送帧:0、1、2、3、4、5、6、7。
- 接收器获取帧,并发送一个ACK,表示已获得全部7帧(或每个帧)。
- 发送器在第0帧上获得超时,然后重新发送。
- 发送方收到最多7个帧的ACK,因此它发送下一帧:8、9、10、11、12、13、14
- 接收器收到以下数据包:8、9、10、11、12、13、14。它会发送一个ACK,表示已经获得了它们,并为以下内容打开缓冲区:15、0、1、2、3、4、5、6。
- 接收方获取发送方因超时而发送的旧帧0。接收方认为数据包是合法的,并将其存储。
如何避免第6步中发生的情况?我应该发送整个窗口的CRC吗?CRC并不完美,因此可能仍然存在问题。
我目前正在通过C中的UDP套接字进行此操作,因此使用了C标记。