UDP 单播比广播更可靠?

UDP unicast more reliable than broadcast?

我们有一个目前同时支持单播和广播的网络引擎——我们一直在使用单播,但我正在探索广播功能以减少网络流量。

我的测试似乎表明单播比广播 更可靠 - 这不是我期望看到的(我没有强大的网络背景) .

例如,在一个简单的测试场景中,数据包通过千兆以太网 LAN 从主机发送到客户端 - 我每秒可以单播 15,000 个 1000 字节的数据包,而不会丢失任何数据包。如果我切换到广播,在遇到 +/- 20% 的数据包丢失之前,我只能管理大约 1200 个 1000 字节的数据包。

这是预期的吗?在阅读有关单播和广播之间差异的信息时,我无法找到这个特定问题的明确答案。

如果这确实是预期的行为,那么多播在这方面是否更类似于单播而不是广播 ('reliability')?

测试详情

我开发了一个应用程序,它允许对各种设置进行操作(发送速率、数据包大小、每个 'iteration' 发送的数据包数量等)。我在本地 运行 这个应用程序的几个实例,然后在网络上的其他 PC 上有更多实例(我 运行 在我的 PC 和另一台 PC 上只有一个实例)。

每个数据包都包含发送它的应用程序实例的名称、一个整数 ID(每次应用程序发送数据包时递增)和一个有效负载(通常为 0、500、1000 或 1400 字节大)。

收到数据包后,我会检查 ID 字段,然后确定它是否是预期的 ID(我跟踪我希望从每个应用程序实例接收的下一个 ID)。晚于我预期的 ID 表示数据包已丢失或乱序到达,早于我预期的 ID 表示数据包乱序到达。

发送速率可以修改,我默认使用20ms的延迟。每次发送的数据包数量也可以修改 - 例如,我可以指定我想每 20 毫秒发送 50 个数据包(每个数据包都有一个唯一的 ID)。

当您向网络发送 UDP 广播时,必须复制数据包并将其发送到网络上的每个节点,从而为网络设备创建大量工作。如果您的 LAN 包含大量以前未被单播到的设备,则进行完整广播可以创建更多网络 activity 并为网络设备工作。

但是,如果您的网络完全由需要参与的节点组成,我希望广播选项更可靠,因为网络设备从源接收的数据较少并且能够 运行将广播数据包发送到与单独单播数据包时相同数量的主机的优化程序。

进行网络测试时,使用受控环境非常重要,在该环境中您可以了解所涉及的变量并了解不同类型的缩放如何影响您的性能。