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标记。

5
  • 我不了解您的应用程序在这里是什么-如果您正在寻找强排序、滑动窗口重新组装和丢失时重新传输,为什么不直接使用TCP?对于您的问题,显而易见的答案是“包括序列号”,但这只是TCP的另一个特性。 评论 2014年3月9日15:24
  • 我不打算使用TCP。我已经提到我确实“识别”了他们,但我还是发现了一个问题。我做错了吗?编辑:我继续指定使用选择性重复。
    – 马SMith
    评论 2014年3月9日15:29
  • 当有人说“我想在不使用[y]的情况下做[x]”,而[y]是标准的、行业认可的、预先构建的[x]选项时,通常意味着他们采取了错误的方法。您有什么理由避免TCP?TCP有什么特性对于您的使用来说是次优的,以至于需要重新实现TCP over UDP成为一个好主意? 评论 2014年3月9日15:37
  • 1
    @多项式,我不想争论为什么我选择这样做,我只是在寻找解决我所面临问题的方法。虽然我同意你的观点,但我这么做是为了学习如何做到这一点,所以使用TCP是没有好处的。
    – 马SMith
    评论 2014年3月9日15:47
  • 您可以检查此答案:选择性重复|线程方式 评论 2016年10月14日3:32

0

重置为默认值

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.