UDP丢包模拟&概率

UDP Packet loss simulation & probability

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

UDP 数据包在没有 Internet 访问且大约 20 个 arduino 和一台计算机的网络中丢失的可能性有多大?是否需要重新发送方法?

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

How probable is it that UDP Packets get lost in a Network with no Internet access and about 20 arduinos and one computer?

数据包迟早会被丢弃的概率是 100%。

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

Is it even neccessary to have a resend method?

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

Is there a way I can simulate UDP Packet loss in this network to check if the resend mechanisms are working?

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

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
}