Comunicaciones Multipunto (Multicast)

Clasificación de las comunicaciones según sus receptores

  1. Punto a punto (unicast): desde un Tx hacia un único receptor.
  2. Difusión (broadcast): desde un Tx hacia todos los receptores de una sub-red.
  3. Multipunto (multicast): desde un Tx hacia múltiples receptores, no necesariamente en la misma sub-red, los cuales se subscriben a un grupo.
  4. Anycast: desde un Tx al receptor más cercano dentro de un grupo.

IGMP: Internet Group Mangement Protocol (RFC 1112, Dic. 1989).
    Este protocolo es usado por máquinas y routers que soportan multicast.
    Se usa para informar a la red física sobre qué máquinas pertenecen actualmente a un grupo multicast. Esta información es requerida por los routers para saber cuándo reenviar un datagrama multicast.

Mensaje IGMP

    Versión IGMP es 1.
    Tipo IGMP:   1 =>  consulta enviada por un router multicast.
                         2 =>  respuesta enviada por una máquina.
    La dirección del grupo es una dirección clase D.
    En consultas la dirección es 0.0.0.0, y la respuesta contiene la dirección siendo reportada.

Protocolo IGMP
    Un concepto fundamental en comunicación multicast es la incorporación a un grupo multicast en una interfaz. La participación en un grupo multicast es dinámica. Los procesos pueden incorporarse y retirarse (join and leave) libremente. Un proceso puede incorporarse a un grupo en más de una interfaz.
    Así, una máquina identifica pares de la forma (grupo multicast, interfaz) y maneja un contador con el número de procesos locales en cada uno de estos pares.

Consultas y reportes IGMP
    Estos mensajes son usados por routers para determinar los miembros de cada grupo multicast en cada una de las redes asociadas al router.

  1. Una máquina envía un reporte IGMP cuando el primer proceso se incorpora a un grupo. El reporte sale por la interfaz a través de la cual se produce la incorporación y va dirigido al grupo que se incorpora. Los routers reciben y procesan los mensajes de todos los grupos multicast.
  2. Un Router multicast envía consultas periódicas para ver si aún hay máquinas en grupos multicast.
  3. Una máquina no envía un reporte cuando un proceso deja un grupo. Cuando recibe una consulta por parte del router y  no hay más procesos subscritos, simplemente no la contesta.
  4. Cada máquina responde enviando un reporte por cada grupo que aún contenga miembros en esa máquina.

Cuando llega un mensaje multicast, el router revisa sus tablas multicast para determinar por qué interfaces se debe reenviar el mensaje.

Algunos detalles de la implementación
    Cuando el primer reporte es enviado, no hay garantía que llegue al router. Una retransmisión se envía dentro de un tiempo random  (0,10] segundos.
    Cuando una encuesta es recibida, la respuesta se envía dentro de un tiempo random. Si la misma respuesta es enviada por otra máquina, el reporte es cancelado.
    Mensajes con Time-to-live (ttl) de 0 no salen de la máquina.
    Mensajes con ttl de 1 no salen de la subred (no pasan ningún  router). ttl de 2 atraviesan un router y llegan a las máquinas de esas subredes.
    Todas las interfaces se integran al grupo 224.0.0.1. Este es el grupo usado por routers para enviar las consultas. Este grupo nunca es reportado.

Haciendo que una puerta sea reusable

int reusePort(int s)  {
  int one=1;

  if ( setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *) &one,sizeof(one)) == -1 )  {
    printf("error in setsockopt,SO_REUSEPORT \n");
    return(-1);
  }
   return(1);
}

Incorporación a un grupo Multicast

int joinGroup(int s, char *group) {
  struct ip_mreq mreq;  /* multicast group info structure */
  in_addr_t mcGroup;

  if( (mcGroup = inet_addr(group))== -1)
       printf("error in inet_addr\n");

   mreq.imr_multiaddr.s_addr = mcGroup;
   mreq.imr_interface.s_addr = INADDR_ANY;

   if ( setsockopt(s,IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq,
                   sizeof(mreq)) == -1 ) {
     printf("error in joining group \n");
     return(-1);
   }
    return(1);
}

Remoción desde un grupo Multicast

void leaveGroup(int recvSock, char *group) {
  struct ip_mreq dreq;  /* multicast group info structure */
  in_addr_t mcGroup;

  if( (mcGroup = inet_addr(group))== -1)
       printf("error in inet_addr\n");

   mreq.imr_multiaddr.s_addr = mcGroup;
   mreq.imr_interface.s_addr = INADDR_ANY;

  if( setsockopt(recvSock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
                (char *) &dreq,sizeof(dreq)) == -1 )   {
    printf("error in leaving group \n");
    return(-1);
  }
    return (1);
}

Definición del Time-to-live (TTL)

int setTTLvalue(int s, u_char *ttl_value)  {
  if( setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) ttl_value,
                 sizeof(u_char)) == -1 )   {
    printf("error in setting loopback value\n");
    return (-1);
  }
    return(1);
}

Definición de loopback

int setLoopback(int s, u_char enable_loop)  {
  if( setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *) &enable_loop,
                 sizeof(u_char)) == -1 )   {
    printf("error in disabling loopback\n");
    return(-1);
  }
    return(1);
}

Ejemplos Simples

Receptor de tráfico multicast. Transmisor a grupo multicast.
Para verificar si multicast está activado en su interfaz, ejecutar
$ ifconfig // buscar por mensaje tipo UP BROADCAST RUNNING MULTICAST MTU:1500
Para verificar adhesión a grupo multicast, ejecutar:
$cat /proc/net/igmp // debería observar el número del grupo en hexadecimal. Notar posible efecto de orden de bits (intel posee orden contrario a orden usado en la red)

Experimentar: Reuse, loopback, TTL, recepción unicast,

Transmisión Tráfico Multicast sobre redes Ethernet En IPv4 el rango de direcciones multicast es: 224.0.0.0 a 239.255.255.255.

Como consecuencia no existe una dirección multicast única para cada dirección multicast IP. 32 grupos multicast diferentes son mapeados a la misma dirección Multicast Ethernet. El receptor pasa el paquete multicast a la capa IP y ésta debe ver si efectivamente hay alguna aplicación esperando por este tráfico.

Corolario: Cuando varias aplicaciones disjuntas corren una red multicast, no conviene diferenciarlos sólo por los primeros 9 bits.

Uso más eficiente del tráfico disponible
Envío de datos usando estructuras: multicast Tx Rx Estos ejemplo ocupan este include.

hay problema cunado las máquinas son heterogéneas: a nivel de compilar usado (tamaño de los campos) o arquitectura de las máquinas (orden de los bits).
Aquí hay otro ejemplo en el cual se envían y reciben datagramas por el mismo socket. McastTxRx.c