Linux和IGMPv3上的多播加入
我们遇到了一个棘手的问题。我们正在编写一个接收组播UDP流量的C++程序。我们正在将应用程序迁移到不同的网络环境,我们的运营团队要求我们支持来自我们应用程序的IGMPv3会员通告。初步调查表明Linux 2.6内核支持IGMPv3。所以,我很困惑,当我们运行tcpdump的,我们看到下面的输出曲线:Linux和IGMPv3上的多播加入
[[email protected]]$ sudo /usr/sbin/tcpdump -i eth1.22 igmp tcpdump: listening on eth1.22
00:20:09.007094 switch-a.stage > ALL-SYSTEMS.MCAST.NET: igmp query v2 [max resp time 20] [ttl 1]
00:20:09.241946 10.129.22.236 > 232.0.1.10: igmp v2 report 232.0.1.10 (DF) [tos 0xc0] [ttl 1]
00:20:10.472159 10.129.22.236 > 236.0.1.101: igmp v2 report 236.0.1.101 (DF) [tos 0xc0] [ttl 1]
44 packets received by filter
我的理解是一个可以强制内核通过指定一个非零值使用IGMP的较低版本文件/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version;不过,我已确认该文件具有零值配置。
我们的应用程序使用下面的代码加入组播组:
... joinMulticast(in_addr mcast_addr, in_addr interface_addr) {
struct ip_mreq mcast_req;
mcast_req.imr_multiaddr.s_addr = mcast_addr;
mcast_req.imr_interface.s_addr = interface_addr;
int err = setsockopt(fFileDesc, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char*)&theMulti, sizeof(theMulti));
// handle errors etc.
// ...
}
是否有额外的东西,我们需要在源程序强制IGMPv3的,包括?
回答:
几件事情要注意。
第一个是(据我所知)将/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version
设置为0并不意味着“使用v3”,但实际上将其设置为“自动”。我相信你可以将它设置为3来强制它使用igmp v3。
但是,要注意的另一件事是,igmp堆栈的行为是由它发现自己的环境决定的。如果你的linux系统接收到来自上游igmp路由器的igmp v2成员查询,那么我相信默认的linux行为(按照igmp v3 rfc的规定)只能使用igmp v2来进行报告。
据我所知,当您将/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version
设置为0时,它使用此行为。
以上是 Linux和IGMPv3上的多播加入 的全部内容, 来源链接: utcz.com/qa/264335.html