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 を強制するために、ソース プログラムに追加する必要があるものはありますか?

4

1 に答える 1

15

注意すべきことがいくつかあります。

1 つ目は、(私が理解しているように)/proc/sys/net/ipv4/conf/eth1.22/force_igmp_versionを 0 に設定することは、「v3 を使用する」という意味ではなく、実際には「自動」に設定するということです。強制的に igmp v3 を使用するには、3 に設定できると思います。

ただし、もう 1 つ注意すべき点は、igmp スタックの動作は、それ自体が存在する環境によって決定されるということです。Linux ボックスがアップストリームの igmp ルーターから igmp v2 メンバーシップ クエリを受信して​​いる場合、デフォルトはLinux の動作 (igmp v3 rfc で義務付けられている) は、レポートに igmp v2 のみを使用することです。

私が理解しているように/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version、0に設定すると、この動作が使用されます。

于 2008-10-23T00:02:06.663 に答える