我们正在开发运行Linux的通信接口转换器。
该单元可以接收单播或多播IP并将其转换到某个其他物理层。另一方面,该单元接收数据并发出单播/多播IP,而不改变第一单元接收的内容。数据根据应用程序配置发送。
此外,第一单元具有一些内部设备,该内部设备创建一些将被发送到第二单元的多播数据。
我的问题是,仅当执行 tcpdump 时,第二台设备才会收到来自该设备的多播
'tcpdump -i 任何主机'
这是怎么回事? tcpdump 执行什么操作?
答案1
TL;DR:运行ip link set dev eth0 allmulticast on
以解决您的问题(调整卡的名称)。正确修复它可能意味着将您的应用程序修改为多播感知并加入它感兴趣的 (IPv4) 多播组。
tcpdump
将接口放入混杂模式除非另有说明 ( -p
),这意味着它将向系统传输看到的任何以太网帧,即使不是专门发送到卡(的 MAC 地址)。您可以验证tcpdump
与附加-p
选项一起使用不会使您的设置不再起作用。
基于此,这意味着您的接口从未被告知侦听多播流量,并且只会接收仅以其自己的 MAC 地址作为目标地址的单播以太网帧(以及广播帧)。通常,您的应用程序应该使用套接字选项来加入 IPv4 多播组,如从以下位置捕获的示例斯特雷斯:
setsockopt(5, SOL_IP, IP_ADD_MEMBERSHIP, {imr_multiaddr=inet_addr("239.255.1.5"), imr_interface=inet_addr("192.0.2.2")}, 12) = 0
...其中除其他效果外,还会产生额外的影响映射到以太网 MAC 的 IP 的哈希值格式到卡的特定多播 MAC 表中。多播以太网帧很容易被卡识别:它们将目标 MAC 地址的第一个字节的低位设置为 1,这恰好是最重要的。目的MAC的第一位在电线上传输。
如果您事先知道所有正在使用的 (IPv4) 多播组并且它们的数量有限,您可以自己计算结果多播以太网 MAC 地址然后使用类似于此命令的命令(散列为 239.255.1.5)将它们直接添加到卡的多播表中:
ip maddress add dev eth0 01:00:5e:7f:01:05
如果您无法执行此操作,您仍然可以配置您的卡来收听全部组播流量:
ip link set dev eth0 allmulticast on
如果稍后切换做IGMP 监听插入后,如果没有适当的应用程序更改,这可能还不够。