Sockets 如何从发送队列中删除重复的UDP数据包

Sockets 如何从发送队列中删除重复的UDP数据包,sockets,visual-c++,mfc,udp,Sockets,Visual C++,Mfc,Udp,我有UDP实现,可以从服务器获取确认信息。客户端重新发送在指定时间内未从服务器接收到确认的数据包。客户端在等待服务器确认第一个数据包时发送大约10个数据包。然后,它重复发送未收到确认的数据包。这在正常情况下工作良好,网络延迟较小 真正的问题是在低带宽连接上遇到的,其中往返延迟有点大。客户端根据确认超时在发送队列中不断添加数据包。这导致许多重复的数据包被添加到队列中 试图找到任何优雅的解决方案来避免发送队列中的重复数据包,但运气不佳。任何帮助都将不胜感激 若我能找到一种方法来标记/设置一个数据包的

我有UDP实现,可以从服务器获取确认信息。客户端重新发送在指定时间内未从服务器接收到确认的数据包。客户端在等待服务器确认第一个数据包时发送大约10个数据包。然后,它重复发送未收到确认的数据包。这在正常情况下工作良好,网络延迟较小

真正的问题是在低带宽连接上遇到的,其中往返延迟有点大。客户端根据确认超时在发送队列中不断添加数据包。这导致许多重复的数据包被添加到队列中

试图找到任何优雅的解决方案来避免发送队列中的重复数据包,但运气不佳。任何帮助都将不胜感激


若我能找到一种方法来标记/设置一个数据包的属性,这样若数据包并没有在NN毫秒内发送,那个么它将从队列中删除,那个么我可以围绕它构建算法

与TCP一样,UDP没有内置重复检测。这意味着任何类型的检测都必须由应用程序本身完成。由于应用程序与发送队列交互的唯一方式是发送数据报,因此在将数据包放入发送队列之前,必须在发送方进行任何类型的重复检测


在这一阶段,您如何确定这是否真的是一个与前一个重复的数据包不应发送,或者这是否是一个重复的数据包,因为原始数据包丢失而应发送,这完全取决于应用程序。任何“…不在NN毫秒内发送…”也必须在应用程序中使用计时器或类似工具实现。您还可以尝试通过使用SO_SNDBUF减小发送队列的大小来获得对队列的更多控制。

真正的问题是,为了接收ACK数据包,必须发送(使用
sendto
函数)。这意味着数据包在应用中已经超越了算法。如果我们能够找到SO_SNDBUF中仍然存在的内容,我们可以在应用程序级别执行重复验证。我知道我们可以减少SO_SNDBUF大小,但这会影响连接良好时的性能。@ManojKumarRai:同样,应用程序无法从发送缓冲区中删除数据包。这正是问题所在,我正在寻找解决方案。所以,若有一种功能可以指定,若一个数据包在SendBuffer队列中的时间超过NN毫秒,那个么将其从队列中删除,那个么它会有所帮助。否则,在带宽较低的网络中,队列会不断增长。@ManojKumarRai:再说一遍:并没有这样的功能。但本质上,您要求UDP具有类似TCP的功能(即可靠性)——为什么不首先使用TCP?@ManojKumarRai:虽然有很多传言称UDP具有性能优势,但如果您能够处理丢失的数据包(如实时音频),这些功能主要适用或者,如果无法将TCP流控制优化到线路属性。假设您实现了自己的ACK,因为您无法忍受丢失的数据包,那么UDP在您的用例中可能不会有任何性能优势。如果有人发明了一种能够解决这些问题的协议。。。面向连接并普遍实现的东西。。。