Clasificación de las comunicaciones según sus repectores
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
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.
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)
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