TCP DUP ACK被发送用于重发分组

我有一个运行Ubuntu 14.0.4的客户端,我发现TCP连接到客户端的问题。 来自客户端的TCP ack被丢弃,服务器将数据包重新发送到客户端。 客户端在收到重新发送请求时,向服务器发送一个DUP ACK。 我的假设是, 只有当数据包被乱序接收时才发送DUP ACK,而不是如果您收到一个已经收到的数据包的传输

这是截图: 截图

有人会知道为什么TCP的行为是这样吗?

重复的ACK可以通过几种方式产生,通常是由于数据包丢失:

  • 发送段时,发送方在configuration的时间间隔内没有收到ACK(200ms非常常见,但这通常是可configuration的),它将重新传输该段,复制该段包含的ACK。
  • 收到时,收到一个意外的段号; 导致接收方重新确认期望的序列号。 这通知发送方可能需要重传。 接下来会发生什么取决于select性确认,这超出了这个答案的范围。
  • 接收时,得到已经被确认的分段。

第一和第三个子弹是相关的。 如果发送者没有得到它的ACK的原因是因为这个ACK被gremlins吃掉了,那么基于定时器的重传将在重发时重发一个片段。 已经确认的接收机将再次进行双重确认并等待下一个段。 如果gremlins不吃那个Dup-ACK,发送者将继续发送。

在你的情况下,数据包的时间表明一个基于定时器的dup-ACK不在这里播放。 最大的RTT是14ms。 这意味着发送方的错误重传,触发Dup-ACK。 我已经看到了这种行为由于错误的networking驱动程序,甚至在TCP卸载引擎的情况下,甚至NIC固件。 虽然,不是最近。