在Linux上进行组播加入和IGMPv3

10

我们遇到了一个棘手的问题。我们正在编写一个接收组播UDP流量的C++程序。我们正在将应用程序迁移到另一个网络环境,并且我们的运营团队要求我们的应用程序支持来自IGMPv3成员资格通告。初步调查表明,Linux 2.6内核确实支持IGMPv3。因此,当我们运行tcpdump时,看到以下输出跟踪信息让我很困惑:

[rtv@myhost]$ 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

我理解的是,可以通过在文件/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version中指定非零值来强制内核使用较低版本的IGMP; 然而,我确认该文件具有零值配置。

我们的应用程序正在使用以下代码加入组播组:

... 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?

1个回答

15

需要注意的几个问题。

首先,根据我的理解,将/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version设置为0并不意味着“使用v3”,而实际上是将其设置为“自动”。我相信你可以将其设置为3来强制使用igmp v3。

但是,需要注意的另一件事情是,igmp堆栈的行为取决于它所处的环境。如果您的Linux机器从上游igmp路由器接收到igmp v2成员资格查询,则我认为(根据igmp v3 rfc规定)默认的Linux行为是仅使用igmp v2进行报告。

据我了解,当您将/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version设置为0时,它会使用这种行为。


有趣。是的,将强制设置为3确实会导致服务器使用igmp v3。因此,我认为下一步是确保网络正在使用igmpv3。谢谢! - terson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接