c - 停止等待协议(protocol) - 它如何处理最后一个 ACK​​ 丢弃?

标签 c network-protocols

我正在使用停止等待协议(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/

相关文章:

java - 使用 Java 在笔记本电脑之间进行基于 MAC 的通信

linux - Linux 中的网络命名空间是什么?

networking - 嵌入式PIC微 Controller 通过互联网与服务器通信的最佳协议(protocol)?

c - 通过使用 -s 开关编译来测试 C 代码?

c - 如何简化 C 语言中的二进制搜索代码?

CSR1000 分配内存

c - 将 DLL 调用函数从 C 翻译成 Delphi

sockets - 如何通过网络维护两个应用程序之间的持久网络连接?

c - 写入同一列(csv 文件)C

java - 解析可变长度消息