我目前正在创建一个与多个arduino板卡通信的服务器软件。由于硬件,我正在使用UDP协议。我有一个非常简单的机制,在大多数情况下,它们会在重新发送包时迷失。我现在有两个问题:UDP数据包丢失模拟和概率
在一个没有Internet接入的网络和大约20个arduinos和一台计算机的网络中UDP包丢失的可能性有多大?是否需要重新发送方法?
有没有一种方法可以模拟UDP网络中的数据包丢失,以检查重发机制是否正常工作?
我目前正在创建一个与多个arduino板卡通信的服务器软件。由于硬件,我正在使用UDP协议。我有一个非常简单的机制,在大多数情况下,它们会在重新发送包时迷失。我现在有两个问题:UDP数据包丢失模拟和概率
在一个没有Internet接入的网络和大约20个arduinos和一台计算机的网络中UDP包丢失的可能性有多大?是否需要重新发送方法?
有没有一种方法可以模拟UDP网络中的数据包丢失,以检查重发机制是否正常工作?
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
}
非常感谢您的详细解答! – Nidhoegger
我想说丢失数据包的可能性将取决于你的网络上,则路由arduinos自己的接线类型(或Wi-Fi),节点之间的距离等等......而且你是否需要重新发送取决于你在做什么。对于某些丢失数据包的东西来说没什么大不了的,对于其他的东西可以忽略不计,这可能值得重新发送。 – litelite
arduinos都使用官方的以太网盾(没有TCP的那个)连线。电缆长度约为4米,并且是TP-Link的管理型交换机。 – Nidhoegger