Arquitectura cliente-servidor

1  Introducción a los sistemas distribuidos

Un sistema distribuido es un conjunto de ordenadores que realizan alguna tarea de forma conjunta, para lo que se debe disponer de una red mediante la cual puedan comunicarse. La forma más extendida para permitir la compartición de recursos (discos duros, impresoras, ficheros, bases de datos, etc.) en un sistema distribuido es el uso del modelo cliente-servidor. Un servidor es un programa que se ejecuta en un ordenador y que se encarga de gestionar un recurso o conjunto de recursos. Los clientes son programas que harán peticiones de servicio, a través de la red, al servidor para obtener acceso a los recursos que gestiona.

Los servidores facilitan acceso a los recursos del sistema, formando parte del sistema operativo distribuido. No todos los recursos del sistema se pueden gestionar eficientemente por servidores -como, por ejemplo, la memoria-, siendo gestionados por el núcleo del sistema operativo presente en cada ordenador.

2  La comunicación mediante sockets

2.1  Introducción

Un socket es un mecanismo de comunicación entre dos o más procesos, gracias al cual es posible enviar o recibir información. A efectos de programación un socket funciona como un descriptor de ficheros de bajo nivel; comandos como read() y write() funcionan con sockets de la misma forma que lo hacen con ficheros y tuberías.

El conjunto de servicios que ofrece un socket fue diseñado para facilitar una conexión entre procesos, tanto si se ejecutan en una sola máquina, como si lo hacen en red. Los procesos se intercambian información transmitiendo datos a través de mensajes que circulan entre un socket en un proceso y otro socket en otro proceso. Para la comunicación entre máquinas se suelen utilizar los protocolos TCP/IP, logrando así la independencia del hardware y de la arquitectura de red mediante la cual se establece el enlace; siendo esto posible gracias a la estructura en forma de capas que posee una red de ordenadores (véase ). Los sockets son conexiones que pertenecen a la capa de transporte de la estructura OSI. Una aplicación con sockets debe especificar los puertos de protocolo local y remoto y la dirección IP remota que utilizará, si usará TCP o UDP, y si iniciará transferencia o esperará por una conexión (es decir, si funcionará como servidor o cliente).

2.2  Tipos de sockets

El mecanismo de sockets está diseñado de forma genérica; un socket por sí mismo no contiene información suficiente para describir la comunicación entre procesos. Los sockets operan dentro de dominios de comunicación, que determinan el formato de direcciones a utilizar y el protocolo de comunicación. Además el dominio difine si los dos porcesos que se comunican se encuentran en el mismo sistema o en sistemas diferentes y cómo pueden ser direccionados. De esta forma un socket puede clasificarse según su dominio y según el tipo de conexión que realice.

En función del tipo de conexión se dispone de varios tipos de socket, que describen la forma en la que se transfiere información a través de ese socket: sockets stream, sockets datagrama y sockets raw.

Con respecto a la clasificación en función del dominio, bajo Unix existen dos dominios: uno para comunicaciones internas al sistem (dominio UNIX) y el otro para comunicaciones entre sistemas (dominio Internet). El dominio UNIX (AF_UNIX) permite una comunicación intrasistema entre procesos que corren en el mismo microprocesador. Se permiten tanto los sockets stream como los datagrama; no se permiten los sockets de tipo raw. El dominio Internet (AF_INET) soporta los protocolos estándar de Internet TCP y UDP y se utiliza para comunicar procesos que corren en distintos microprocesadores. Permite sockets stream, datagrama y raw.

2.3  Programación con sockets

Las llamadas al sistema más significativas son:

2.4  Conexiones cliente-servidor

Para la mayor parte de las operaciones que utilizan sockets es necesario asignar los papeles de cliente y servidor. Un servidor es un proceso que realiza alguna función a petición del cliente. Estos papeles no son simétricos y no pueden ser invertidos sin esfuerzo. Existen dos tipos de servidores: iterativo y concurrente.

Un servidor iterativo en el dominio Internet es aquel que atiende a los clientes uno detrás de otro, es decir, el servidor iterativo atiende las peticiones en serie. Un servidor de este tipo es el demonio nfsd que proporciona el servicio NFS

Bibliografía

Para la elaboración de este tutorial he utilizado la siguiente bibliografía:

Nota Importante. Este tutorial parte de unos apuntes personales donde he ido recabando información que he encontrado en diversos libros, revistas, etc., así como de mi propia experiencia. En ningún momento pretende ser un texto original, es por esto que todo el mérito de lo aquí escrito se debe exclusivamente a los autores que cito en la bibliografía.
R. Hernando, 7 de Julio de 2002.