当PC连接到自身时,UDP数据包是否真的丢失了

时间:2012-02-21 04:16:50

标签: java udp voip

Scenarion:VOIP - 同时发送和接收UDP数据包

当pc连接到自身时(出于测试目的)我有问题。它似乎丢失了数据包,但是当通过路由器无线连接到第二台机器时它不会发生。这有点令人沮丧,因为我花了14个小时才发现问题不在我的逻辑中,而是在一个简单的情况下,数据包永远不会收到。

我有两台笔记本电脑不同的基准测试,连接自己时都是松散的数据包..

   sender.start();
    receiver.start();

我认为这与NICS的线程或性质有关。如果我记得正确接收或发送更改模式 - 但由于两个线程它无法跟上它们?我不对吗?

为什么会这样?

3 个答案:

答案 0 :(得分:3)

由于你没有在你的问题中提到它,我建议你尝试增加UDP接收缓冲区的大小,看看是否有所作为。

通过网络运行应用程序时,这也会减少数据包丢失(迟早会发生数据包丢失)。

AFAICT这可以使用Socket.setReceiveBufferSize在Java中完成。

答案 1 :(得分:2)

老实说VOIP会丢包,因为它是按照这种方式设计的。

我不知道你丢失了多少个数据包,但在每个事件发生时我都会尝试回答。

  1. 丢失所有数据包:可能是因为没有侦听数据包或没有连接到正确的地址
  2. 丢失大量:可能是由于处理器速度的原因。如果您正在加密,则计算机发送数据可能是一项挑战。如果它没有及时加密,它就不会发送数据。如果数据是迟到的,则会被删除。
  3. 失去少量:这很自然,应该发生。 VOIP必须按顺序播放,如果一个数据包在它应该已经播放之后进入,那么你无能为力。这就是它被删除的原因。
  4. " UDP使用简单的传输模型,没有隐式握手对话,以提供可靠性,排序或数据完整性。因此,UDP提供了不可靠的服务,并且数据报可能无序到达,出现重复或丢失而不另行通知。 UDP假定在应用程序中不需要或执行错误检查和纠正,从而避免了在网络接口级别进行此类处理的开销。时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待延迟数据包更可取,这在实时系统中可能不是一种选择。如果在网络接口级别需要纠错设施,则应用程序可以使用为此目的而设计的传输控制协议(TCP)或流控制传输协议(SCTP)。" - Wiki(Link

答案 2 :(得分:1)

UDP是一种有损协议,如果数据包丢失,则不会重新发送数据包。假设连接到localhost时数据包不会丢失,这是正确的。但是,还有另一种丢包方法:接收器窗口已满!

当操作系统接收缓冲区已满时,因为位于下方的应用程序无法足够快地处理数据包,数据包将丢失。现在的问题如下:为什么会发生在localhost而不是网络连接?以下是一些猜测:

  1. 您正在使用VOIP。也许编解码器假设网络速度永远是瓶颈?一些协议允许接收器在他看到信道尚未饱和(没有丢包)时请求更高的比特率。测试期间系统如何加载?
  2. 也许你的线程有不同的优先级,导致接收器永远不会变为活动状态。
  3. 可能存在一些公共资源的锁争用(即访问单线程解码库),导致发送者受到青睐。
  4. 尝试并运行来自两个不同JVM的发送器和接收器,这将更接近地模拟真实情况。如果发送到localhost,请尝试通过执行wait(20ms)在发件人中引入滞后。