Java 当PC连接到自身时,UDP数据包真的会丢失吗
场景:VOIP-同时发送和接收UDP数据包 我有问题时,电脑连接到自己(测试目的)。似乎它会丢失数据包,但通过无线路由器连接到第二台机器时不会发生这种情况。这有点令人沮丧,因为我花了14个小时才发现问题不在我的逻辑中,而是在一个简单的情况下,数据包从未收到 我有两台不同基准的笔记本电脑,它们在连接时都是松包的Java 当PC连接到自身时,UDP数据包真的会丢失吗,java,udp,voip,Java,Udp,Voip,场景:VOIP-同时发送和接收UDP数据包 我有问题时,电脑连接到自己(测试目的)。似乎它会丢失数据包,但通过无线路由器连接到第二台机器时不会发生这种情况。这有点令人沮丧,因为我花了14个小时才发现问题不在我的逻辑中,而是在一个简单的情况下,数据包从未收到 我有两台不同基准的笔记本电脑,它们在连接时都是松包的 sender.start(); receiver.start(); 我相信这与线程或NIC的性质有关。如果我没记错,是接收还是发送都会改变模式——但因为有两个线程,它跟不上
sender.start();
receiver.start();
我相信这与线程或NIC的性质有关。如果我没记错,是接收还是发送都会改变模式——但因为有两个线程,它跟不上它们?我错了吗
为什么会发生这种情况?老实说,VOIP将丢失数据包,因为它就是这样设计的 我不知道你们丢了多少包,但我会尽力回答每一个塞纳里奥
UDP使用简单的传输模型,没有隐式握手对话,以提供可靠性、顺序或数据完整性。因此,UDP提供了一种不可靠的服务,数据报可能会无序到达、出现重复或丢失而未经通知。UDP假定错误检查和更正不是必需的,就是在应用程序中执行的,从而避免了网络接口级别上此类处理的开销。对时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待延迟数据包更可取,而延迟数据包在实时系统中可能不是一个选项。如果在网络接口级别需要纠错设施,应用程序可以使用为此目的而设计的传输控制协议(TCP)或流控制传输协议(SCTP)。“-Wiki()既然您在问题中没有提到它,我建议您尝试增加UDP接收缓冲区的大小,看看这是否会有所不同 在网络上运行应用程序时,这也会减少数据包丢失(迟早也会发生数据包丢失)
AFAICT这可以通过使用
套接字在Java中实现。setReceiveBufferSize
UDP是一种有损协议,如果数据包丢失,它将不会重新发送。您的假设是正确的,即数据包在连接到本地主机时不能通过线路丢失。但是,还有另一种丢失数据包的方法:接收器窗口是满了
当操作系统接收缓冲区已满,因为下面的应用程序无法足够快地处理数据包时,数据包将丢失。现在的问题是:为什么会在本地主机而不是网络连接上发生这种情况?下面是一些猜测:
尝试从两个不同的JVM运行发送方和接收方,这将更接近真实情况。尝试通过执行
等待(20ms)在发送方中引入延迟
如果发送到本地主机。请提供更多信息,以便我可以帮助您!我无法真正发布代码或逻辑。但目前,我删除了所有逻辑,只调用发送和接收方法。有时在理想情况下会出现7-12突发-这对我的交织器来说是致命的。我同意您的观点,但有三点:1。除了发送和接收方法外,我对所有方法都进行了注释。除了分配数据包编号和发送存根外,它不做任何工作。2.当两台电脑通过网络连接时,数据包不会丢失。3.我确实正确地进行了侦听,如果无法到达目标机器,我的代码会抛出异常。是的,缓冲区大小是罪魁祸首。但是,我已经一个没有setReceiveBufferSize的。昨天刚刚在while(99999999999)的代码中引入了人工延迟:-)。问题是当我积累大量数据结构,然后尝试通过循环发送所有数据结构时。我从来没有真的期望java会这么快。我接受你的,因为你是最接近的。