2008-10-22 152 views
8

我們遇到了一個棘手的問題。我們正在編寫一個接收組播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的,包括?

回答

12

幾件事情要注意。

第一個是(據我所知)將/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時,它使用此行爲。

+0

有趣。是的,將force設置爲3會導致服務器使用igmp v3。因此,我相信下一步是確保網絡使用igmpv3。謝謝! – terson 2008-10-23 00:33:06