来自广播节点的 UDP 冲突是否可能?

Is UDP collision from Broadcasting nodes possible?

我正在尝试 运行 模拟以测试发生数据包冲突的环境中的数据包丢失。我当前的设置包括几台独立的机器,每台机器都有自己的 send/receive 数据包网络接口。这些机器通过 AP 通过 wifi 连接。我目前正在使用 UDP,因为它能够在单个地址上 广播 数据包。所有机器都在侦听共享 IP 地址,例如 192.168.1.255.

This answer 提到 UDP 数据包是不可靠的,但是它们会因为冲突而失败吗?这里,我用碰撞来指代多个同时传输造成的干扰。也就是说,网络中两个 UDP 节点的同时广播是否会导致我要测试的不可靠性?如果不是,我是否需要考虑更改我的网络配置甚至开始修改内核代码?

如果问题含糊不清,我会说我的最终目标涉及编写一些可能会或可能不会抵抗冲突的分布式算法。

UDP 被认为是不可靠的,因为它不保证数据包传送、重传、流量控制或拥塞。因此,sending/receiving UDP 数据包失败的原因有很多:冲突、不可靠的物理介质、干扰、由于路由器队列溢出导致的数据包丢失等

I am trying to run a simulation to test packet loss in an environment where packet collision is happening.

您可能希望在您的问题中包含碰撞 一词的含义。我将在我的回答中假设你的意思是传统意义上的(即两个网络端点大约同时传输,因此 "talking over each other" 并混淆彼此的传输,使得传输都不成功),而不是在更广泛的意义上 "a packet got dropped due to network congestion".

This answer mentions that UDP packets are unreliable, but will they fail because of a collision?

答案将完全取决于您使用的是哪种网络硬件 运行 您的 UDP 数据包。 UDP 协议本身是独立于硬件的,因此它不会指定任何关于是否会发生冲突的信息,因为它无法知道。

就是说,现在大多数低级网络硬件都有避免冲突的规定(在我上面提到的意义上)——例如,现代以太网交换机只处理有限数量的活动 queueing/buffering 数据包必要时(这比旧的 10Mb/秒以太网集线器更高效、更可靠,后者基本上只是将所有端点的以太网 RX 和 TX 引线电连接成一个大 "shared wire",并希望最好)

另一种常用的网络硬件类型 Wi-Fi 也具有 mechanisms 来减少冲突,但这并不意味着通过 Wi-Fi 进行 UDP 广播是个好主意,因为它会受到影响来自其他问题——一方面,Wi-Fi 路由器必须接收你的广播数据包并重新广播它以确保所有其他客户端都能接收到它,更糟糕的是,它通常会被设置为以非常慢的速度重新传输它 "legacy" 速率,以确保任何古老的 Wi-Fi 卡仍然可以接收广播数据。我的建议是,如果您要使用 Wi-Fi,请将广播(和多播)传输保持在绝对最低限度;甚至向每个其他客户端发送 separate/identical 单播数据包通常更有效(!)——不是为了避免冲突,而是因为即使是少量的 broadcast/multicast 流量也可以将您的 Wi-Fi 网络连接到爬行。