Comunicaciones Multipunto (Multicast)

Clasificación de las comunicaciones según sus repectores

  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 red.
  3. Multipunto (multicast): desde un Tx hacia múltiples receptores, los cuales forman 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.
    Informa 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 colsultas la dirección es puesta en 0. Y la respuesta contie                     ne la dirección siendo reportanda.

Protocolo IGMP
    Un concepto fundamental en comunicación multicast es la incorporación a un grupo multicast en una interface. La participación en un grupo multicast es dinámica. Los procesos pueden incorporarse y retirarse (join and leave). 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.
  2. Una máquina no envía un reporte cuando un proceso deja un grupo. Cuando recibe una consulta por parte del router simplemente no la contesta.
  3. Un Router multicast envía consultas periódicas para ver si aún hay máquinas en grupos multicast.
  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
    El primer reporte se envía, 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).
    Todas las interfaces se intengran 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) Ver artículo sobre definición del 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.

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

Transmisión Tráfico Multicast sobre redes Ethernet

Como consecuencia no existe una dirección multicast única para cada dirección multicast IP. 32 grupos multicast diferentes estam mapeados a la misma dirección Multicast Ethernet. El receceptor 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 coviene 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

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