我目前正在创建一个与多个arduino板通信的服务器软件。由于硬件,我使用的是UDP协议。我有一个非常简单的机制,它会在大多数情况下丢失时重新发送包。我现在有两个问题:
在没有Internet访问的网络和大约20个arduinos和一台计算机上,UDP数据包丢失的可能性有多大?是否有必要使用重发方法?
有没有办法可以模拟此网络中的UDP数据包丢失,以检查重发机制是否正常工作?
答案 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
}