Scenarion:VOIP - 同时发送和接收UDP数据包
当pc连接到自身时(出于测试目的)我有问题。它似乎丢失了数据包,但是当通过路由器无线连接到第二台机器时它不会发生。这有点令人沮丧,因为我花了14个小时才发现问题不在我的逻辑中,而是在一个简单的情况下,数据包永远不会收到。
我有两台笔记本电脑不同的基准测试,连接自己时都是松散的数据包..
sender.start();
receiver.start();
我认为这与NICS的线程或性质有关。如果我记得正确接收或发送更改模式 - 但由于两个线程它无法跟上它们?我不对吗?
为什么会这样?
答案 0 :(得分:3)
由于你没有在你的问题中提到它,我建议你尝试增加UDP接收缓冲区的大小,看看是否有所作为。
通过网络运行应用程序时,这也会减少数据包丢失(迟早会发生数据包丢失)。
AFAICT这可以使用Socket.setReceiveBufferSize
在Java中完成。
答案 1 :(得分:2)
老实说VOIP会丢包,因为它是按照这种方式设计的。
我不知道你丢失了多少个数据包,但在每个事件发生时我都会尝试回答。
" UDP使用简单的传输模型,没有隐式握手对话,以提供可靠性,排序或数据完整性。因此,UDP提供了不可靠的服务,并且数据报可能无序到达,出现重复或丢失而不另行通知。 UDP假定在应用程序中不需要或执行错误检查和纠正,从而避免了在网络接口级别进行此类处理的开销。时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待延迟数据包更可取,这在实时系统中可能不是一种选择。如果在网络接口级别需要纠错设施,则应用程序可以使用为此目的而设计的传输控制协议(TCP)或流控制传输协议(SCTP)。" - Wiki(Link)
答案 2 :(得分:1)
UDP是一种有损协议,如果数据包丢失,则不会重新发送数据包。假设连接到localhost时数据包不会丢失,这是正确的。但是,还有另一种丢包方法:接收器窗口已满!
当操作系统接收缓冲区已满时,因为位于下方的应用程序无法足够快地处理数据包,数据包将丢失。现在的问题如下:为什么会发生在localhost而不是网络连接?以下是一些猜测:
尝试并运行来自两个不同JVM的发送器和接收器,这将更接近地模拟真实情况。如果发送到localhost,请尝试通过执行wait(20ms)
在发件人中引入滞后。