domingo, 15 de octubre de 2017

Ensayo V de sistemas distribuidos: Socket Datagrama

Socket Datagrama

Introducción

Los sockets son una puerta entre procesos de aplicación y el protocolo de transporte que se usa de extremo ya sea TCP o UDP, el tipo de protocolo también definirá el tipo de socket, nos permiten establecer enlaces entre programas que se ejecutan de manera independiente (programa cliente y programa servidor). En si se podría decir que un socket es un canal de comunicación entre dos programas. Hay dos tipos de sockets, los que están orientados a conexión y los que no, esto dependerá de sus atributos.
Las interfaces de programación de sockets, como lo son el API de sockets de java y demás, proporcionan constructores que hacen uso de un protocolo. Usan dos protocolos UDP, en este caso son conocidos como Sockets datagrama, o TCP, y son conocidos como socket stream.
Un socket se identifica por 3 características principales: Su dominio (El medio de comunicación de red que el socket utilizara), el protocolo que utiliza y el tipo que definirá si es un socket datagrama o un socket stream, este último se hace en base al protocolo que utiliza.

Protocolo y funcionalidades del Socket Datagrama

Un socket datagrama está diseñado para admitir un flujo de datos en dos direcciones, el socket datagrama es responsable de la secuencia y de la confiabilidad de administrar. La confiabilidad que ofrece un socket datagrama es bastante buena en redes LAN.
Estos sockets son los que usan el modelo UDP (protocolo de diagrama de usuario),  El modelo UDP permite: “un paquete se transporte (es decir, se envié o reciba en el nivel de transporte) utilizando comunicaciones sin conexión “ (Liu, 2004). Este tipo de sockets pueden dar soporte tanto a una comunicación sin conexión como a una orientada a conexión pero a nivel aplicación. Al mandar datos o recibirlos usando la API de sockets se debe instanciar la clase datagramsocket, esta clase esta enlazada al puerto UDP de la máquina, lo cual la hace local al proceso.
Para intercambiar un datagrama entre un programa emisor y un programa receptor: Para intercambiar un datagrama de un proceso a otro proceso se ocupa la clase DatagramPacket, en estos se debe englobar la dirección del destinatario y una referencia al vector de octetos que contiene los datos de carga, tanto el emisor como el receptor deben instanciar el DatagramPacket y el DatagramSocket en este proceso. El programa receptor solo especifica el vector de datos en el DatagramPacket mientras que el emisor debe especificar los datos y la dirección del receptor.

Características del socket datagrama

Estos datagramas no prometen que la información enviada sea de manera ordenada, tampoco garantizan protección o que no se dupliquen los datos, los límites del registro son los encargados de solucionar esto último, ya que se conservaran los límites de registro en los datos mientras los registros sean menores al límite interno del tamaño del receptor.

Algunas de sus características son:
  • ·         No perder datos durante la transmisión
  • ·         Conservación de los límites de los mensajes enviados
  • ·         Puede haber mensajes urgentes que permiten el envió de datos fuera de flujo de  banda y que son accesibles de inmediato.


Otras de sus características según el Cinvestav son:
  • ·         El que no necesita de un saludo como si lo hace el socket stream
  • ·         El emisor asocia explícitamente la dirección IP y el puerto de destinatario
  • ·         El servidor debe extraer del datagrama recibido, la dirección IP y el puerto del  emisor


El uso de los sockets datagrama en un sentido orientado a conexión es poco común, lo habitual es usar socket stream, pero aun así las clase DatagramSocket ofrece métodos que permiten crear y terminar conexiones, para realizar esta conexión se necesita especificar la dirección de un socket remoto y también la dirección del socket desde el cual se enviaran los datos por lo que el socket solo estará disponible para comunicarse con ese solo socket hasta que la conexión se termine.

Pasos para el envió de un datagrama

En el programa emisor:
Se crea un socket datagrama y se enlaza al puerto local, sitúa los datos en octetos, crea un paquete datagrama, especificando el vector de datos y la dirección del receptor, invoca al método receptor del socket con una referencia al paquete datagrama.

Ejemplo de código de un emisor

inport java.net.*;
inport java.io.*;
public class EjemplolEmisor {
public static void main(String[ ] args) {
                if (args. length != 3)
                               System.out.println ("Este programa requiere 3 argumentos de linea de mandato");
                else {
                               try {
InetAddress maquinaReceptora = InetAddress. getByName (args [ 0 ]);
int puertoReceptor = Integer.parselnt(args[1]);
String mensaje = args[2];
DatagramSocket miSocket = new DatagramSocket ( );
byte[ ] almacén = mensaje.getBytes( );
DatagramPacket datagrama =
new DatagramPacket(almacén, almacén.length, maquinaReceptora, puertoReceptor);
                                               miSocket.send(datagrama);
                                               miSocket.cióse( );
                               }catch(Exception ex){
                                               ex.printStackTrace( ) ;
                                               }//fin del catch
                                }//fin del else
}//fin de main
}//fin de class

*Código proveniente de  (Liu, 2004).


Al analizar este código podemos ver que se piden 3 argumentos, el primero será la dirección de la maquina receptora, el 2 el puerto de recepción y el 3 el mensaje. Se instancia a un socket ya creado y se almacena el mensaje guardado en bytes, la dirección, el puerto y el mensaje se guardan en un DatagramPacket y empleando el método send del socket instanciado es enviado al receptor y finalmente se cierra el objeto socket

En el programa receptor:
Se crea un socket datagrama y se enlaza a un puerto local especifico, esto ya que el programa emisor necesita una dirección en específico, se crea un vector de octetos para recibir los datos, crea el paquete datagrama especificando al vector de datos y luego invoca al método receptor con una referencia al paquete datagrama.

Ejemplo de código de un receptor

inport java.net.*;
inport java.io.*;
public class EjemploReceptor {
public static void main(String[ ] args) {
                if (args. length != 1)
                               System.out.println ("Este programa requiere un argumentos de linea de mandato");
                else {
                               int puerto = Integer.parselnt(args[0 ]);
final int MAX_LON = 1 0 ;
try {
DatagramSocket miSocket = new DatagrairSocket (puerto);
b y t e [ ] a lm a c é n = new b y t e [ MAX_L0N ] ;
DatagramPacket datagrama = new DatagramPacket (almacén, MAX_LON);
miSocket. receive (datagrama);
String mensaje = new String(almacén);
System. out.println(mensaje);
miSocket.cióse( );
} // fin de try
catch (Exception ex) {
ex.printStackTrace( );
                                               }//fin del catch
                                }//fin del else
}//fin de main
}//fin de class

*Código proveniente de  (Liu, 2004).


En este código también se instancia un socket y se usa el método receive en este para recibir lo que envió el programa emisor y el argumento que se pide esta vez (solo se pide uno) es del puerto en donde arribara el mensaje, se recibe y convierte a String y luego se imprime.



API de sockets

Como ya se mencionó anteriormente en el uso de sockets se usa una API que contiene 2 clases necesarias para el uso del DatagramSocket en el envió del mensaje las cuales son:

DatagramSocket

Esta clase representa un socket que envía y recibe paquetes datagrama, es el punto de envió y recibo del servicio de entrega de paquetes, cada paquete enviado o recibido se le asigna una ruta de manera individual, al ser enviados múltiples paquetes de una maquina a otra se tomaran rutas diferentes y probablemente lleguen en diferente orden.
En si maneja sockets para enviar y recibir datagramas UDP y proporciona los constructores para esto como lo son DatagramSocket(), DatagramSocket(int port) y DatagramSocket(int port, InetAddress laddr).
Los métodos de mayor importancia que proporciona esta clase y que serán importantes para mandar datagramas son:

  •          send(DatagramaPacket p): Esta sirve para transmitir el datagrampacket conteniendo el mensaje
  •          receive(DatagramPacket p): en él se coloca el mensaje, su longitud y su origen
  •          setSoTimeout(int timeout): Este método permite imponer un tiempo de espera limite que no debe ser rebasado.
  •          Connect(InetAddress address, int port): Este método se usa para conectarse a un puerto remoto y a una dirección de internet concreta.
Cabe mencionar que estos métodos sirven para transmitir datagaramas entre dos conectores

DatagramPacket

Los paquetes datagrama son usado para implementar un servicio de envió sin necesidad de una conexión, cada mensaje es ruteado de una maquina a otra basado solamente en la información contenida en el paquete. Los paquetes pueden llegar en un orden distinto por las razones que ya se mencionaron en DatagramSocket. Esta clase proporciona los creadores para crear instancias a partir de los datagramas que se reciban y crear instancias que serán enviadas.

Conclusiones

Los sockets datagrama son una herramienta muy útil en los sistemas distribuidos a la hora de crear una comunicación entre dos programas sin que se requiera conexión y gracias a las APIs ofrecidas por java es sencillo trabajar con ellos por lo que son de mucha utilidad al empezar a hacer un sistema distribuido ya que solo hace falta conocer bien la estructura de los DatagramSocket y Datagrampacket que se emplearan tanto en el programa receptor como en el emisor. Los sockets datagrama también se pueden emplear en una comunicación orientada a conexión, pero en estos casos es mejor emplear los sockets stream ya que si bien se pueden emplear de esta manera cuando se trata de una comunicación orientada a conexión los sockets stream tienen mayores ventajas.

Bibliografía

CINVESTAV. (15 de Octubre de 2017). Cinvestav. Recuperado el 15 de Octubre de 2017, de Programacion en Internet (Sockets): http://www.tamps.cinvestav.mx/~vjsosa/clases/sd/Sockets_C_Java_ppt.pdf
Liu, M. L. (2004). Computacion distribuida fundamentos y aplicaciones. San Luis Obispo, California: Pearson.
Martín Santana, A. D., & Martínez Santana, L. I. (15 de Agosto de 2007). La web de Sistemas Operativos (SOPA). Recuperado el 15 de Octubre de 2017, de COMUNICACIÓN ENTRE PROCESOS SOCKETS: http://sopa.dis.ulpgc.es/ii-dso/leclinux/ipc/sockets/sockets.pdf

Univeridad carlos III de madrid. (15 de Octubre de 2017). Univeridad carlos III de madrid. Recuperado el 2017 de Octubre de 2017, de Trabajando con Sockets UDP: http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/



No hay comentarios:

Publicar un comentario

Métricas del diseño

Métricas del diseño Conclusiones Las métricas son esenciales para darle cohesión a un proyecto en todos los ámbitos, y por lo tanto ...