sábado, 30 de abril de 2016

Importancia de los puertos y direcciones de multidifusión en la comunicación no fiable de grupos de procesos.


En redes de datos, se le conoce como comunicación no fiable, aquella que no proporciona mecanismos de aseguramiento de la entrega y recuperación de errores. Este tipo de comunicación se implementa en aplicaciones donde la reducción de la latencia tiene mayor impacto que la tasa de pérdidas, por ejemplo, en la transmisión de audio.

Por otra parte, la comunicación a nivel de procesos, puede adquirir la forma de unidifusión y multidifusión. En esta última, un proceso puede enviar un mensaje a varios receptores a la vez. Para ello, dichos receptores deben estar adheridos a un grupo.

A nivel de la capa de red del modelo TCP/IP, la multidifusión cuenta con sus propias direcciones, que en versión IPv4 se ubican dentro del rango 224-239. Mediante estas direcciones es posible identificar un grupo para comunicación entre sus miembros.

El objetivo del siguiente programa será verificar el papel de dos elementos que intervienen en este tipo de comunicación: El puerto y la dirección.  Para ello utilizaremos dos programas.

Fuente.java: Envía un mensaje a una dirección de multicast (grupo) en un puerto específico. Su funcionamiento se resume en los siguientes pasos:

- Obtener dirección multicast
- Generar mensaje en forma de datagrama UDP
- Enviar mensaje al grupo y puerto designado

Destino.java: Este código se ejecuta en forma de dos procesos que se adhieren a una dirección de multicast y por tanto, reciben el mensaje enviado por la fuente. Su funcionamiento se resume en los siguientes pasos:

- Obtener dirección multicast
- Unirse al grupo del multicast
- Leer mensaje en forma de datagrama UDP

Las acciones anteriormente descritas se han colocado en un ciclo infinito tanto en fuente.java como en destino.java de tal forma que los procesos destinos no terminen hasta que reciban un mensaje como miembros del mismo grupo multicast.

Fuente.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 *
 * @author Joaquin Bolaños
 *
 * Envía un mensaje a una dirección de multidifusión utilizando un puerto UDP
 * El tipo de comunicación es no fiable.
 *
 * Dirección multicast del grupo: 230.2.2.5
 * Puerto UDP (socket): 1234
 *
 */

public class Emisor {
    public static void main(String[] args) {
        MulticastSocket puerto; // Clase para el socket multicast
        InetAddress grupo; // Clase para el grupo
        System.out.println("EMISOR");
       
        try{
            while(true)
            {
                // Estableciendo el grupo con una dirección multicast
                // y asociando el puerto UDP al socket multicast.
                grupo = InetAddress.getByName("230.2.2.5");
                puerto = new MulticastSocket(1234);
               
                String mensaje = "Mensaje para el grupo";
                DatagramPacket paquete = new DatagramPacket(mensaje.getBytes(), mensaje.length(), grupo, 1234);
                puerto.send(paquete);
            }
            puerto.close(); // Cierra la conexión.               
        }
        catch(Exception ex)
        {
            System.out.println("" + ex.getMessage());
        }
    }       
}


Destino.java
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 *
 * @author Joaquin Bolaños
 *
 * Envía un mensaje a una dirección de multidifusión utilizando un puerto UDP
 * El tipo de comunicación es no fiable.
 *
 * Dirección multicast del grupo: 230.2.2.5
 * Puerto UDP (socket): 1234
 *
 */


public class Receptor {
    public static void main(String[] args) {
        MulticastSocket puerto;
        InetAddress grupo;
        System.out.println("RECEPTOR");
       
        try
        {           
            while(true)
            {
                // Estableciendo el grupo con una dirección multicast
                // Asociando el puerto UDP al socket multicast.
                // Finalmente se une al grupo con el método joinGroup
                grupo = InetAddress.getByName("230.2.2.5");
                puerto = new MulticastSocket(1234);
                puerto.joinGroup(grupo);
               
                // Buffer para guardar el mensaje que llega al grupo.
                byte[] almacen = new byte[100];
               
                if (almacen.length != 0) // Si ha llegado un mensaje nuevo
                {
                    // Crea datagrama UDP para el mensaje
                    DatagramPacket recibido = new DatagramPacket(almacen, almacen.length);
                   
                    //Lee el mensaje que le llega.
                    puerto.receive(recibido);
                   
                    // Lo muestra en pantalla
                    System.out.println(new String(almacen));
                   
                    break;
                }
            }
            puerto.close(); // Cierra la conexión
        }
        catch (Exception ex)
        {
            System.out.println("" + ex.getMessage());
        }               
    }
}

A continuación, se muestra la ejecución de un proceso fuente y dos procesos destino en los siguientes casos:

Caso 1: La dirección de multicast y el número de puerto coincide tanto en la fuente como en los destinos.

Resultado: Ambos procesos destino que pertenecen al mismo grupo reciben el mensaje

Emisor:

Proceso receptor 1:

Proceso receptor 2:


Caso 2: La dirección de multicast coincide tanto en la fuente como en los destinos; pero no el número de puerto.

Resultado: Aunque ambos procesos pertenecen al mismo grupo, el “buzón de entrada” no coincide, por lo que no leen el mensaje ni tampoco lo muestran.

Emisor:

Proceso receptor 1:
Proceso receptor 2:
 

Caso 3: El número de puerto coincide tanto en la fuente como en los destinos; pero no la dirección de multicast.

Resultado: Aunque ambos procesos leen del mismo “buzón” (puerto); pero no pertenecen al grupo al que se envía el mensaje; por lo que no lo leen y tampoco lo muestran.

Emisor:

Proceso receptor 1:
Proceso receptor 2:
 

Podemos comparar entonces a la dirección de multicast como una ciudad donde si el alcalde “emisor” envía un comunicado, dicho mensaje les compete a todos; pero para que lo lean, debe depositarlo en el buzón adecuado.


Concluimos por tanto que en la comunicación multicast no fiable tanto la dirección de multidifusión como el puerto son importantes para la comunicación. 


No hay comentarios:

Publicar un comentario

Seguidores