UDP丢包修复

Posted

技术标签:

【中文标题】UDP丢包修复【英文标题】:UDP Packet loss Fix 【发布时间】:2013-11-21 11:06:27 【问题描述】:

我用 UDP 在 Java 中实现了聊天。我有一个线程将数组列表的数据发送到另一个客户端,一个线程从另一个客户端接收数据。数组列表可以用方法填充。

要发送消息,从数组列表中选择一个字节[],发送它的长度,然后发送字节。

现在我正在考虑丢包问题。我该如何解决这个问题?将消息发回将是非常低效的。如果接收方没有收到消息,我可以发回一条消息,因为我知道消息的长度,但为此我需要在两个客户端都有第二个套接字,因为接收方和发送方是两个线程。另一个问题是数据长度的数据包丢失,读取的数据包是长度时会发生什么。

有人可以帮我实现吗?

(TCP 不是解决方案,因为我喜欢做 UDP 打孔)

【问题讨论】:

你喜欢做 UDP 打洞并不是不使用 TCP 的理由,而且有两个线程也不是需要第二个套接字的理由。 【参考方案1】:

有一个简单且经过良好测试的协议称为 TCP。因为 TCP 和 UDP 之间唯一(相关)的区别是 TCP 对丢包(和类似情况)进行了校正,而 UDP 没有。

这就是为什么应该在丢包与应用程序无关的情况下使用 UDP。

【讨论】:

感谢您的回答,但这对我没有帮助。我需要一个 UDP 解决方案,因为我正在做 UDP 打孔。【参考方案2】:

您也许应该使用序列号。如果生成了新消息,请将其与序列号一起发送。如果其他对等点检测到丢失的序列号,它应该尝试从其他对等点请求丢失的消息。当然,您还应该能够通过限制重试和使用适当的超时来处理序列号不再可用或不断失败的情况。此外,其他对等方可能会回答“序列号不可用”。

本质上,这类似于 TCP 为您所做的。因此,了解 TCP 如何处理可靠的数据包传输将有助于您找到适合您的用例的解决方案。

简单地说,TCP 通过将数据包保存在缓冲区中来解决这个问题:如果其他对等方确认接收,则从缓冲区中删除数据包。如果检测到丢失的数据包,其他对等方可以请求重新发送缓冲区。为了检测到这一点,接收器还使用了一个缓冲区。如果缓冲区已满,则暂停数据包传输。这就是为什么您需要更大的缓冲区来保持长延迟高速链路(如卫星链路)的管道满载并以最大吞吐量利用链路。由于这不是您所需要的,并且由于您只处理单个消息,因此您可以简化:您的缓冲区是完整的聊天历史记录,序列计数器保持同步,您不需要吞吐量,只需要可靠的传输。

【讨论】:

以上是关于UDP丢包修复的主要内容,如果未能解决你的问题,请参考以下文章

LWIP UDP偶发丢包问题

嵌入式开发之UDP 丢包--- UDP 丢包控制方法

udp丢包和恢复

UDP主要丢包原因及具体问题分析

UDP丢包率可能会增加?

linux 系统 UDP 丢包问题分析思路