Domanda

Abbiamo riscontrato un problema spinoso. Stiamo scrivendo un programma c ++ che riceve traffico UDP multicast. Stiamo trasferendo le nostre applicazioni in un ambiente di rete diverso e il nostro team operativo ha richiesto di supportare gli annunci di iscrizione IGMPv3 dalle nostre applicazioni. Le prime ricerche indicano che i kernel Linux 2.6 supportano IGMPv3. Pertanto, sono perplesso che quando eseguiamo tcpdump vediamo le seguenti tracce di output:

[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

La mia comprensione è che si potrebbe forzare il kernel a utilizzare una versione inferiore di IGMP specificando un valore diverso da zero nel file /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version; tuttavia, ho confermato che il file ha una configurazione a valore zero.

La nostra applicazione utilizza il seguente codice per unirsi al gruppo multicast:

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

C'è qualcosa in più che dobbiamo includere nel programma sorgente per forzare IGMPv3?

È stato utile?

Soluzione

Un paio di cose da tenere presente.

Il primo è che (come ho capito) impostare /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version su 0 non significa " usa v3 " ;, ma in realtà lo imposta su " auto " ;. Credo che sia possibile impostarlo su 3 per forzarlo utilizzando igmp v3.

Tuttavia, l'altra cosa da tenere presente è che il comportamento dello stack igmp è determinato dall'ambiente in cui si trova. Se il tuo box Linux riceve richieste di appartenenza igmp v2 da un router igmp upstream, allora credo che il comportamento predefinito di Linux (come richiesto da igmp v3 rfc) è usare solo igmp v2 per i report.

Come ho capito quando si imposta /proc/sys/net/ipv4/conf/eth1.22/force_igmp_version su 0, utilizza questo comportamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top