2008-10-22 4 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 

나의 이해는 하나가에 0이 아닌 값을 지정하여 IGMP의 낮은 버전을 사용하도록 커널을 강제 할 수 있다는 것입니다 파일 /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; 그러나 파일이 0 값 구성임을 확인했습니다.

우리의 응용 프로그램이 멀티 캐스트 그룹에 가입하려면 다음 코드를 사용 : 우리가 된 IGMPv3 강제로 소스 프로그램에 포함 할 필요가 여분의 뭔가

... 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. 
    // ... 
} 

거기를?

답변

12

알아야 할 몇 가지 사항.

첫 번째는 /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version을 0으로 설정한다고해서 "v3 사용"이 아니라 실제로 "자동"으로 설정된다는 것입니다. 나는 그것이 igmp v3을 사용하도록 3으로 설정할 수 있다는 것을 믿습니다.

그러나 다른 점은 igmp 스택의 동작이 자신이 발견 한 환경에 의해 결정된다는 것입니다. Linux 상자가 업스트림 igmp 라우터에서 igmp v2 멤버십 쿼리를받는 경우 igmp v3 rfc가 명령 한 기본 Linux 동작은 보고서 용으로 igmp v2 만 사용하는 것입니다.

/proc/sys/net/ipv4/conf/eth1.22/force_igmp_version을 0으로 설정하면이 동작이 사용됩니다.

+0

흥미 롭습니다. 예, 힘을 3으로 설정하면 서버가 igmp v3을 사용하게됩니다. 따라서 다음 단계는 네트워크가 igmpv3을 사용하는지 확인하는 것입니다. 감사! – terson

관련 문제