viernes, 13 de octubre de 2017

Sockets

Sockets

Introducción

En 1977 la Organización Internacional de Estandarización (Internacional Standards Organization, ISO) estableció un subcomité encargado de diseñar una arquitectura de comunicación y el resultado fue el modelo de referencia para la Interconexión de Sistemas Abiertos OSI (Open Systems Interconection), el cual define una arquitectura de comunicación estructurada en siete niveles.

Existen dos protocolos fundamentales en el nivel de transporte de la arquitectura de red: el protocolo de datagrama de usuario (UDP, User Datagram Protocol) y el protocolo de control de transmisión (TCP, Transmission Control Protocol).

TCP está orientado a conexión y transporta un flujo de datos sobre una conexión lógica establecida entre el emisor y el receptor, mientras que UDP permite que un paquete se transporte utilizando comunicaciones sin conexión.

La Interfaz Socket es una API para redes TCP/IP que se compone de funciones o rutinas. Originalmente se construyó a principios de los 80 para el sistema operativo UNIX , aunque hoy en día también la utilizan otros sistemas operativos como Microsoft Windows, Mac, OS2, etc.

El API de sockets de Java, como el resto de interfaces de programación de sockets, proporciona construcciones de programación de sockets que hacen uso tanto del protocolo UDP como TCP.

Sockets

Los sockets son la interfaz más difundida que hay para la comunicación de procesos. Socket designa un concepto abstracto por el cual dos programas pueden intercambiarse cualquier flujo de datos, el socket no es más que un "canal de comunicación" entre dos programas que corren sobre ordenadores distintos o incluso en el mismo ordenador.

Un socket se caracteriza por tres atributos:

  • Dominio: Especifica el medio de comunicación de la red que el socket utilizará.
  • Protocolo: Especifica qué protocolo se va a usar.
  • Tipo: Los protocolos de internet proveen dos niveles distintos de servicio : flujo y datagramas.
  • ¿Qué define a un socket?

    Para que dos programas puedan comunicarse entre sí es necesario que un programa sea capaz de localizar al otro, y además, que ambos programas sean capaces de intercambiarse cualquier secuencia de octetos, para ello son necesarios los tres recursos que originan el concepto de socket, y gracias a los cuales éste queda definido:

  • Un protocolo de comunicaciones, que permite el intercambio de octetos.
  • Una dirección del Protocolo de Red, que identifica una computadora.
  • Un número de puerto, que identifica a un programa dentro de una computadora.
  • Tipos de Sockets

    Sockets Stream: Son los más utilizados, hacen uso del protocolo TCP, el cual nos provee un flujo de datos bidireccional, secuenciado, sin duplicación de paquetes y libre de errores.

    Sockets Datagram: Hacen uso del protocolo UDP, el cual nos provee un flujo de datos bidireccional, pero los paquetes pueden llegar fuera de secuencia, pueden no llegar o contener errores. Por lo tanto el proceso que recibe los datos debe comprobar la secuencia, eliminar duplicados y asegurar la integridad. Se llaman también “sockets sin conexión”, porque no hay que mantener una conexión activa, como en el caso de sockets stream. Son utilizados para transferencia de información paquete por paquete.

    ¿Cómo se da la comunicación?

    Las aplicaciones desarrolladas en Sockets están basadas en la arquitectura Cliente-Servidor.

    Normalmente, un servidor se ejecuta en una máquina específica y tiene un socket asociado a un número de puerto específico. El servidor simplemente espera a la escucha en el socket a que un cliente se conecte con una petición. El cliente conoce el nombre de la máquina sobre la que está ejecutándose el servidor y el número de puerto al que está conectado. Solicitar una conexión consiste en intentar establecer una cita con el servidor en el puerto de la máquina servidora.

    Si todo va bien, el servidor acepta la conexión, pero antes crea un nuevo socket en un puerto diferente. Es necesario crear un nuevo socket (y consecuentemente un número de puerto diferente) de forma que en el socket original se continúe a la escucha de las peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectado.

    En el cliente, si se acepta la conexión, el socket se crea satisfactoriamente y se puede utilizar para comunicarse con el servidor.

    ¿Cómo se utilizan los sockets?

    En Java, el API de sockets datagrama proporciona dos clases:

    1. La clase DatagramSocket para los sockets.
    2. La clase DatagramPacket para los datagramas intercambiados.

    Proceso emisor:

    Un proceso que quiera mandar o recibir datos utilizando esta API debe instanciar un objeto DatagramSocket, o un socket para abreviar.

    Para mandar un datagrama a otro proceso, un proceso debe crear un objeto que representa el datagrama en sí mismo. Este objeto puede crearse instanciando un objeto DatagramPacket que englobe (1) una referencia a un vector de octetos que contenga los datos de la carga, y (2) la dirección de destino (el ID de la máquina y el número de puerto al que el socket del receptor está enlazado). Una vez que se crea el objeto DatagramPacket y en él se incluyen los datos de la carga y del destino, el proceso emisor realiza una llamada al método send del objeto DatagramSocket, especificando una referencia al objeto DatagramPacket como argumento.


    Proceso receptor:

    En el proceso receptor, también se debe instanciar un objeto DatagramSocket y enlazarlo a un puerto local; el número de puerto debe coincidir con el especificado en el paquete datagrama del emisor. Para recibir los datagramas enviados al socket, el proceso crea un objeto DatagramPacket que hace referencia a un vector de octetos y llama a un método receive de su objeto DatagramSocket, especificando como argumento una referencia al objeto DatagramPacket

    DatagramSocket

    Se trata de un servicio de transporte sin conexión. Son más eficientes que TCP, pero no está garantizada la fiabilidad: los datos se envían y reciben en paquetes, cuya entrega no está garantizada; los paquetes pueden ser duplicados, perdidos o llegar en un orden diferente al que se envió.

    El protocolo de comunicaciones con datagramas UDP, es un protocolo sin conexión, es decir, cada vez que se envíen datagramas es necesario enviar el descriptor del socket local y la dirección del socket que debe recibir el datagrama. Como se puede ver, hay que enviar datos adicionales cada vez que se realice una comunicación.

    public class java.net.DatagramSocket extends java.lang.Object
    1. Constructores:
      • public DatagramSocket () throws SocketException.
        Se encarga de construir un socket para datagramas y de conectarlo al primer puerto disponible.
      • public DatagramSocket (int port) throws SocketException.
        Ídem, pero con la salvedad de que permite especificar el número de puerto asociado.
      • public DatagramSocket (int port, InetAddress ip) throws SocketException.
        Permite especificar, además del puerto, la dirección local a la que se va a asociar el socket.
    2. Métodos:
      • public void close().
        Cierra el socket.
      • protected void finalize().
        Asegura el cierre del socket si no existen más referencias al mismo.
      • public int getLocalPort().
        Retorna el número de puerto en el host local al que está conectado el socket.
      • public void receive (DatagramPacket p) throws IOException.
        Recibe un DatagramPacket del socket, y llena el búfer con los datos que recibe.
      • public void send (DatagramPacket p) throws IOException.
        Envía un DatagramPacket a través del socket.

    DatagramPacket

    Un DatagramSocket envía y recibe los paquetes y un DatagramPacket contiene la información relevante. Cuando se desea recibir un datagrama, éste deberá almacenarse bien en un búfer o un array de bytes. Y cuando preparamos un datagrama para ser enviado, el DatagramPacket no sólo debe tener la información, sino que además debe tener la dirección IP y el puerto de destino, que puede coincidir con un puerto TCP.

    public final class java.net.DatagramPacket extends java.lang.Object
    1. Constructores:
      • public DatagramPacket(byte ibuf[], int ilength).
        Implementa un DatagramPacket para la recepción de paquetes de longitud ilength, siendo el valor de este parámetro menor o igual que ibuf.length.
      • public DatagramPacket(byte ibuf[], int ilength, InetAddress iaddr, int iport).
        Implementa un DatagramPacket para el envío de paquetes de longitud ilength al número de puerto especificado en el parámetro iport, del host especificado en la dirección de destino que se le pasa por medio del parámetro iaddr.
    2. Métodos:
      • public InetAddress getAddress ().
        Retorna la dirección IP del host al cual se le envía el datagrama o del que el datagrama se recibió.
      • public byte[] getData().
        Retorna los datos a recibir o a enviar.
      • public int getLength().
        Retorna la longitud de los datos a enviar o a recibir.
      • public int getPort().
        Retorna el número de puerto de la máquina remota a la que se le va a enviar el datagrama o del que se recibió.

    Conclusión

    Los sockets constituyen una herramienta extremadamente útil para la comunicación en un sistema distribuido, ya que su implementación es sencilla y eficiente. Sin embargo, el tipo de socket más utilizado actualmente es el orientado a conexión, ya que presenta mayores ventajas de seguridad e integridad de la información.

    En el futuro, la manera de comunicar un sistema distribuido probablemente se volverá cada vez más eficiente y sencilla, dejando a los sockets no orientados a conexión obsoletos.

    Referencias

  • Hoyo, J. L. (2017). TELECONTROL DE CÁMARA IP MEDIANTE SENSORES INALÁMBRICOS BLUETOOTH. Octubre 15, 2017, de Universidad de Sevilla Sitio web: http://bibing.us.es/proyectos/abreproy/11823/direccion/Volumen+I%252F
  • Liu, M. L. (2004). Computación Distribuida: Fundamentos y Aplicaciones. Madrid: PEARSON EDUCACIÓN, S.A.
  • Coulouris, G. (2001). Sistemas Distribuidos: conceptos y diseño. España: Pearson Educación.
  • 3 comentarios:

    Sistemas Heredados

    Conclusiones Los sistemas heredados pueden llegar a representar la base de la funcionalidad de una empresa, además de contener informa...