我正在尝试使用Raspberry PI作为客户端进行WIFI多播和广播。如果我通过WIFI进行子网广播或多播,则会丢失很多数据包。如果我“广播”到接收者的特定IP,则不会丢失任何数据包。我只有1个接收器/客户端连接到我的WIFI AP。我正在使用QT框架的QUDPSocket :: writeDatagram。因此,我只需要在那里设置IP并从本质上选择广播/子网-广播/多播。我已验证使用Wireshark设置了适当的MAC地址,并且一切似乎正确。我不明白为什么我会在性能上产生如此巨大的差异。全部为UDP,只有一个WIFI客户端。有什么想法吗?
编辑以回复Sam Mason: QUDPSocket :: writeDatagram需要一个IP地址。该IP地址指示您是单播,组播,广播还是子网广播。我循环调用此电话以达到1.5Mbps的固定发送速度。 (与我应该能够通过WIFI网络进行推送的速度相比,这比较慢,因此我的要求并不高)。我的问题确实是为什么单播会丢弃零个数据包,而所有其他方法都丢弃很多数据包。我知道非单播的“最低公分母”方面,但是我只连接了1个客户端,所以...这意味着什么?)。我确实是在对UDP单播和UDP-广播与单客户端连接之间的真正区别进行了详尽的解释。
答案 0 :(得分:1)
简短的答案是:您正在看到特定WLAN路由器的实现细节的工件。其他路由器可能会也可能不会有所不同。
详细信息:
WLAN在链路层使用两种通用的通信模式:单独寻址或组寻址。
对于1:1通信,它使用单独寻址的通信,并且通过在链路层上进行确认和重新传输而使其变得健壮。这用于单播UDP和TCP等。
对于一对多通信,它使用组地址帧,并且在链路层上根本没有防止丢包的保护措施。另外,在这种模式下,路由器可能会回退到最低的WLAN传输速率(1MBits / s),以确保每个STA都能接收到它。
现在,WLAN路由器拥有一定的自由度,可以将哪种模式用于哪个IP数据包:
从发送方到WLAN路由器的任何数据包(单播/多播/广播):单独寻址。这始终是1:1的关系(一个发送方到一个路由器)。
UDP单播和TCP等:它使用单独寻址的帧发送到目标STA。没有丢包。高速。
UDP多播:某些WLAN路由器(实际上这很常见)很聪明,并且当只有一个客户端注册通过IGMP接收此多播组时,它们仍使用单独寻址的帧。当多个STA想要接收多播帧时,它将最有可能使用组地址(具有可见的数据包丢失)。路由器可以自由选择数据速率。通常,它将使用较高的数据速率,而不是1 MB的后备时间。
UDP广播:大多数WLAN路由器会盲目地使用组寻址(具有可见的数据包丢失),并将1MB / s的后备数据速率用作最低公分母。
通过WLAN的UDP mutlicast和UDP广播的行为与通过以太网的UDP多播和UDP广播的行为非常不同。您必须期望有很多工件,数据包丢失,数据包重新排序以及非常慢的数据速率。
上面的解释解释了为什么在使用1 MB / s后备数据速率通过慢速1MB / s组地址链接发射1.5 MB / s广播时看到丢失的数据包的原因。
答案 1 :(得分:0)
假设我正确地解释了您的问题,那是因为单播比广播/多播运行快得多。有关更多信息,请参见https://superuser.com/a/695967,链接的问题For UDP broadcast gurus: Problems achieving high-bandwidth audio UDP broadcast over WiFi (802.11N and 802.11G)也很重要
引用相关部分
如果您包含一些相关的代码行,那么由于Wi-Fi要求多播和广播以一种“最低公分母”的传输速度进行发送,因此任何通过Wi-Fi进行的多播/广播都会变得缓慢。
会很好,因为您的语言用法有些模棱两可。例如“广播到接收者的特定IP”是什么意思?我假设您的意思是发送!