2017-08-03 226 views
0

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

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

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

+0

我想说丢失数据包的可能性将取决于你的网络上,则路由arduinos自己的接线类型(或Wi-Fi),节点之间的距离等等......而且你是否需要重新发送取决于你在做什么。对于某些丢失数据包的东西来说没什么大不了的,对于其他的东西可以忽略不计,这可能值得重新发送。 – litelite

+0

arduinos都使用官方的以太网盾(没有TCP的那个)连线。电缆长度约为4米,并且是TP-Link的管理型交换机。 – Nidhoegger

回答

2

UDP数据包在网络中丢失的可能性如何,没有 Internet访问权限和大约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 
} 
+0

非常感谢您的详细解答! – Nidhoegger