如何消除服务器的 TCP 重传/TCP DUP ACK?

如何消除服务器的 TCP 重传/TCP DUP ACK?

应用程序介绍

我们有一个应用程序,它从 TCP 协议(​​物联网设备)接收数据到我们的 Ubuntu 服务器。两端都向对方发送数据接收确认,以维持通信并接受下一条相应的消息。

问题

我们经常发现服务器收到重复数据。这种情况只有在物联网设备与服务器的连接丢失或中断时才会发生。基本上,如果设备没有从服务器收到任何信息,它就会不断重新传输重复数据。

我们发现了什么

我们采取了tcpdump从服务器中获取数据,并使用 Wire Shark 软件进行检查。我们注意到,在设备发送重复数据之前,该时间段内有少量服务器不断尝试TCP 重传/TCP 重复确认(见附件 - 黑色突出显示的行)。我们认为这是导致从设备接收重复数据的问题的原因,因为根据 Wire Shark 日志,设备没有正确接收来自服务器的确认。

在此处输入图片描述

奎斯顿

  1. 有没有办法可以消除TCP 重传/TCP 重复确认从服务器端?我的意思是通过增加每次传输的等待时间间隔?还是其他方法?

  2. 或者这个问题纯粹依赖于设备连接?

  3. 还有其他方法可以调查这个问题吗?

答案1

我认为你所描述的是在对方没有足够快地做出响应的情况下 TCP 通信的完全正常行为。

看看 101596 和 101611 数据包。由于 744 毫秒内 B 方都没有对 A 方发送的 1015946 [FIN, ACK] 数据包做出响应,因此 A 方再次发送了相同的数据包。它的序列号是 101611 。Wireshark 将其视为重复,事实也确实如此。时间差为 14:52:01.188-14:52:00.444=744 毫秒。

由于在接下来的 1472 毫秒内仍然没有收到 B 方的响应,因此 A 方再次(第三次)尝试使用数据包 101634。

然后连接恢复了。B方发出了重复响应,而B方收到了来自A方的多个延迟数据包。等等。

TCP 连接的一个特点是,当它没有收到响应时,它会一遍又一遍地重复发送同一个数据包。经过多次尝试后,如果超时时间过长,它就会宣布连接失败并提前终止连接。

  1. 我认为,没有必要人为地删除重复的数据包。确保连接不中断,并且对方及时响应。然后重复就会消失。
  2. 是的,这个问题纯粹依赖于设备的连接性。
  3. 作为一种分析方法,您可以使用 TCP 序列的详细分析和数据包时间的监控。

相关内容