【问题标题】:Multicast Join on Linux and IGMPv3Linux 和 IGMPv3 上的多播加入
【发布时间】:2008-10-22 19:50:42
【问题描述】:

我们遇到了一个棘手的问题。我们正在编写一个接收多播 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 吗?

【问题讨论】:

    标签: networking multicast igmp


    【解决方案1】:

    需要注意的几件事。

    第一个是(据我了解)将/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 时,它会使用此行为。

    【讨论】:

    • 有趣。是的,将 force 设置为 3 确实会导致服务器使用 igmp v3。因此,我相信下一步是确保网络使用 igmpv3。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2012-07-16
    • 2013-08-02
    • 2015-04-29
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多