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 multicasting.
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 cuando
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).
Auí hay otro ejemplo en el cual se envían
y
reciben datagramas por el mismo socket. McastTxRx.c