停止和等待协议 - 它如何处理上次丢弃的ACK?

时间:2013-12-08 20:47:56

标签: c network-protocols

我正在使用Stop-and-Wait协议实现客户端/服务器echo程序。部分实现是从服务器中随机引入drop。我实际上随机丢弃了ACK以及FRAME。这样做的副作用是引入了一个角落案例:

如果服务器的最后一个ACK被丢弃,则客户端和服务器都以“发送”模式结束。发生这种情况是因为服务器不知道最后一个ACK被丢弃了,从它的角度看,一切正常,它现在应该回显客户端发送给它的所有内容。

另一方面,客户端不知道最后一个FRAME是否被丢弃,或者只是ACK被删除,所以它尝试重新发送最后一个FRAME。

我可以看到这是通过使用FIN或其他东西来解决的 - 当双方认为传输完成时,基本上是一个额外的ACK向相反的方向发展。但是,我希望符合Stop-and-Wait的预期方法。

Stop-and-Wait应如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

处理这种情况的一种方法是在每个帧中包含一位序列号。每次发送帧并接收ACK时,都会将该位翻转到下一帧。如果发送帧,不接收ACK,并且必须重新发送帧,则使用相同的序列位重新发送它。

在接收器处,如果您在一行中收到两个(或更多)帧具有相同的序列位,您知道它是重传,因此您可以重新发送ACK但忽略该帧,因为您已经对其执行了操作

不要费心去承认确认。您遇到了同样的问题,即网络可能会丢弃ACK的ACK。