문제

우리는 가시가 많은 문제가 발생했습니다. 우리는 멀티 캐스트 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/conf/oth1.22/force_igmp_version에서 0이 아닌 값을 지정하여 커널이 하위 버전의 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를 강제하기 위해 소스 프로그램에 포함시켜야 할 추가 정보가 있습니까?

도움이 되었습니까?

해결책

알아야 할 몇 가지.

첫 번째는 (내가 이해하는 것처럼) /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version to 0은 "v3 사용"을 의미하지는 않지만 실제로 "자동"으로 설정합니다. IGMP v3을 사용하기 위해 3으로 설정할 수 있다고 생각합니다.

그러나 알아야 할 또 다른 것은 IGMP 스택의 동작이 자체적으로 찾은 환경에 의해 결정된다는 것입니다. Linux 상자가 업스트림 IGMP 라우터에서 IGMP V2 멤버십 쿼리를받는 경우 기본값을 믿습니다. Linux 동작 (IGMP V3 RFC에 의해 의무화 된대로)은 보고서에 IGMP v2 만 사용하는 것입니다.

당신이 설정할 때 이해할 수 있듯이 /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version 0에서 0은이 동작을 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top