Вопрос

Мы столкнулись с щекотливой проблемой.Мы пишем программу на C++, которая получает многоадресный UDP-трафик.Мы находимся в процессе переноса наших приложений в другую сетевую среду, и наша операционная группа попросила нас поддержать объявления о членстве в 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

Насколько я понимаю, можно заставить ядро ​​использовать более низкую версию 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?

Это было полезно?

Решение

Несколько вещей, о которых следует знать.

Во-первых (насколько я понимаю) установка /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version значение 0 не означает «использовать v3», а фактически устанавливает значение «авто».Я полагаю, что вы можете установить значение 3, чтобы заставить его использовать igmp v3.

Однако следует учитывать еще одну вещь: поведение стека igmp определяется средой, в которой он находится.Если ваш Linux-компьютер получает запросы на членство в igmp v2 от вышестоящего маршрутизатора igmp, то я считаю, что поведение Linux по умолчанию (согласно igmp v3 rfc) заключается в использовании только igmp v2 для отчетов.

Я так понимаю, когда ставишь /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version до 0, он использует это поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top