UDP数据包丢失模拟&可能性

时间:2017-08-03 15:16:31

标签: sockets udp lan

我目前正在创建一个与多个arduino板通信的服务器软件。由于硬件,我使用的是UDP协议。我有一个非常简单的机制,它会在大多数情况下丢失时重新发送包。我现在有两个问题:

在没有Internet访问的网络和大约20个arduinos和一台计算机上,UDP数据包丢失的可能性有多大?是否有必要使用重发方法?

有没有办法可以模拟此网络中的UDP数据包丢失,以检查重发机制是否正常工作?

1 个答案:

答案 0 :(得分:3)

  

在没有网络的情况下,UDP数据包丢失的可能性有多大   上网和大约20个arduinos和一台电脑?

数据包丢失的概率是100%。

如果你想要一个更详细的统计数据,比如在任何特定时间段内丢弃数据包的概率,唯一真正的方法就是尝试并发现(使用例如数据包中的序列号,以便接收器可以通过记录跳过的序列号来检测分组何时被丢弃。概率很大程度上取决于数据包的大小,数据包的发送速度,接收器的CPU速度,接收器花费CPU时间的其他任务,以太网交换机的质量,质量您的以太网电缆,月相等等。

  

是否有必要使用重发方法?

这取决于丢弃数据包会带来什么后果。对于某些应用程序(例如流式音频或视频或音频计量数据),丢弃数据包并不是什么大问题;你只是忽略了一些数据丢失的事实,并像往常一样继续使用下一个数据包。对于其他应用程序(例如文件传输/接收),丢失数据包意味着接收器需要丢失数据,因此您希望有某种方法从该丢失中恢复,例如,通过检测它并触发重新发送,否则整个传输将失败(或者至少接收器最终只有部分文件)。

  

有没有办法可以模拟此网络中的UDP数据包丢失进行检查   如果重发机制正在运作?

当然,只需将一些逻辑放入接收器中,以便它们偶尔假装没有收到数据包:

int numBytesReceived = recv(...);
if ((rand()%100) == 0)   // Simulate a 1% packet loss rate
{
    printf("Pretending to have dropped a packet!\n");
}
else
{ 
    // handle the incoming packet as usual
}