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



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

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

另一方面,客户端不知道最后一个FRAME是被丢弃的,还是只丢弃了ACK,所以它试图重新发送最后一个帧。

我可以通过使用FIN或其他东西来解决这个问题——基本上,当双方都认为传输完成时,会有一个反方向的额外ACK。但是,我希望符合"停止并等待"的预期方法。

"停止并等待"应如何处理这种情况?

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

在接收器上,如果你连续收到两个(或多个)具有相同序列位的帧,你就知道这是一次重传,所以你可以重新发送ACK,但忽略帧,因为你已经对它采取了行动

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

最新更新