Java 当PC连接到自身时,UDP数据包真的会丢失吗

Java 当PC连接到自身时,UDP数据包真的会丢失吗,java,udp,voip,Java,Udp,Voip,场景:VOIP-同时发送和接收UDP数据包 我有问题时,电脑连接到自己(测试目的)。似乎它会丢失数据包,但通过无线路由器连接到第二台机器时不会发生这种情况。这有点令人沮丧,因为我花了14个小时才发现问题不在我的逻辑中,而是在一个简单的情况下,数据包从未收到 我有两台不同基准的笔记本电脑,它们在连接时都是松包的 sender.start(); receiver.start(); 我相信这与线程或NIC的性质有关。如果我没记错,是接收还是发送都会改变模式——但因为有两个线程,它跟不上

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

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

我有两台不同基准的笔记本电脑,它们在连接时都是松包的

   sender.start();
    receiver.start();
我相信这与线程或NIC的性质有关。如果我没记错,是接收还是发送都会改变模式——但因为有两个线程,它跟不上它们?我错了吗


为什么会发生这种情况?

老实说,VOIP将丢失数据包,因为它就是这样设计的

我不知道你们丢了多少包,但我会尽力回答每一个塞纳里奥

  • 丢失所有数据包:可能是由于未侦听数据包或未连接到正确的地址
  • 损失大量:可能是由于处理器速度。如果您正在加密,则计算机发送数据可能会遇到挑战。如果未及时加密,则不会发送数据。如果延迟接收数据,则会删除该数据
  • 损失少量:这是自然的,应该发生。VOIP必须按顺序播放,如果数据包在本应播放的数据包之后进入,您将无能为力。这就是它被丢弃的原因

  • UDP使用简单的传输模型,没有隐式握手对话,以提供可靠性、顺序或数据完整性。因此,UDP提供了一种不可靠的服务,数据报可能会无序到达、出现重复或丢失而未经通知。UDP假定错误检查和更正不是必需的,就是在应用程序中执行的,从而避免了网络接口级别上此类处理的开销。对时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待延迟数据包更可取,而延迟数据包在实时系统中可能不是一个选项。如果在网络接口级别需要纠错设施,应用程序可以使用为此目的而设计的传输控制协议(TCP)或流控制传输协议(SCTP)。“-Wiki()

    既然您在问题中没有提到它,我建议您尝试增加UDP接收缓冲区的大小,看看这是否会有所不同

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


    AFAICT这可以通过使用
    套接字在Java中实现。setReceiveBufferSize

    UDP是一种有损协议,如果数据包丢失,它将不会重新发送。您的假设是正确的,即数据包在连接到本地主机时不能通过线路丢失。但是,还有另一种丢失数据包的方法:接收器窗口是满了

    当操作系统接收缓冲区已满,因为下面的应用程序无法足够快地处理数据包时,数据包将丢失。现在的问题是:为什么会在本地主机而不是网络连接上发生这种情况?下面是一些猜测:

  • 您正在使用VOIP。可能编解码器假设网络速度始终是瓶颈?如果接收器看到通道尚未饱和(无数据包丢失),某些协议允许他请求更高的比特率。测试期间系统负载如何
  • 也许你的线程有不同的优先级,导致接收器永远不会激活
  • 可能对某些公共资源(即访问单线程解码库)存在锁争用,从而导致发送方受到青睐

  • 尝试从两个不同的JVM运行发送方和接收方,这将更接近真实情况。尝试通过执行
    等待(20ms)在发送方中引入延迟
    如果发送到本地主机。

    请提供更多信息,以便我可以帮助您!我无法真正发布代码或逻辑。但目前,我删除了所有逻辑,只调用发送和接收方法。有时在理想情况下会出现7-12突发-这对我的交织器来说是致命的。我同意您的观点,但有三点:1。除了发送和接收方法外,我对所有方法都进行了注释。除了分配数据包编号和发送存根外,它不做任何工作。2.当两台电脑通过网络连接时,数据包不会丢失。3.我确实正确地进行了侦听,如果无法到达目标机器,我的代码会抛出异常。是的,缓冲区大小是罪魁祸首。但是,我已经一个没有setReceiveBufferSize的。昨天刚刚在while(99999999999)的代码中引入了人工延迟:-)。问题是当我积累大量数据结构,然后尝试通过循环发送所有数据结构时。我从来没有真的期望java会这么快。我接受你的,因为你是最接近的。