我正在使用停止等待协议(protocol)实现客户端/服务器回显程序。部分实现是从服务器随机引入掉落物。我实际上是随机丢弃 ACK 和 FRAME。这样做的副作用是引入了一个极端情况:
如果来自服务器的最后一个 ACK 被丢弃,客户端和服务器都将进入“发送”模式。发生这种情况是因为服务器不知道最后一个 ACK 已被丢弃,从它的角度来看,一切正常,它现在应该回显客户端发送给它的所有内容。
另一方面,客户端不知道最后一个 FRAME 是否被丢弃,或者是否只有 ACK 被丢弃,因此它会尝试重新发送最后一个 FRAME。
我可以看到这个问题可以通过使用 FIN 或其他东西来解决——基本上是在双方认为传输完成时向相反方向发送一个额外的 ACK。但是,我想遵循停止等待的预期方法。
Stop-and-Wait 应该如何处理这种情况?
最佳答案
处理这种情况的一种方法是在每一帧中包含一个一位序列号。每次发送一帧并收到 ACK 时,都会翻转下一帧的位。如果您发送一个帧,但没有收到 ACK,并且必须重新传输该帧,您可以使用相同的序列位重新发送它。
在接收方,如果您连续收到两个(或更多)具有相同序列位的帧,您就知道这是一次重传,因此您可以重新发送 ACK 但忽略该帧,因为您已经对其执行了操作.
不要费心去确认确认。您只是遇到了同样的问题,网络可能会丢弃 ACK 的 ACK。
关于c - 停止等待协议(protocol) - 它如何处理最后一个 ACK 丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20458872/