Está en la página 1de 21

Tema 8

Ampliacin de Redes de Computadores (4 II)

El modelo Cliente-Servidor
1. Prerrequisitos, objetivos y breve introduccin. 2. Conceptos bsicos 2.1 Clasificacin 3. Caractersticas y estructura de un Cliente 3.1 Obtencin de informacin 3.2 Algoritmo de un cliente UDP 3.3 Algoritmo de un cliente TCP 3.4 Procedimiento ConnectSock 4. Caractersticas y estructura de un Servidor 4.1 Algoritmo de un servidor secuencial UDP 4.2 Algoritmo de un servidor secuencial TCP 4.3 Procedimiento PassiveSock 4.4 Algoritmo de un servidor concurrente UDP 4.5 Algoritmo de un servidor concurrente TCP 4.6 Servidores Multiprotocolo 4.7 Servidores Multiservicio 4.8 El Super-Servidor INETD 5. Conclusiones.
Tema 8: El modelo Cliente-Servidor

Duracin: 4 horas
1

Bibliografa: [Com01] (Cap. 26 y 28) [Com00] (Cap. 21) y [Com97] (Cap. 2 y 6-14)

1. Prerrequisitos, Objetivos y Breve Introduccin


Prerrequisitos
- Conocimiento de la Interfaz Socket - Conocimiento de la arquitectura de protocolos TCP/IP. - Conceptos bsicos de sistemas operativos. - Programacin.

Ampliacin de Redes de Computadores (4 II)

Objetivos
- Estudiar el funcionamiento del modelo cliente-servidor. - Conocer y estudiar los algoritmos para la implementacin de los diferentes tipos de clientes y servidores. - Observar diferentes ejemplos de aplicacin del modelo clienteservidor, en servicios comunmente conocidos.
Tema 8: El modelo Cliente-Servidor 2

Prerrequisitos, Objetivos y Breve Introduccin


Introduccin
entre dos aplicaciones(procesos) de forma local o remota.

Ampliacin de Redes de Computadores (4 II)

El TCP/IP y el interfaz de los sockets permiten la comunicacin Las aplicaciones deben establecer la forma en la que van a distribuir el trabajo entre las mquinas participantes. En la prctica, un modelo de interaccin domina el uso del TCP/IP y la interfaz de los sockets para programar las aplicaciones. La inmensa mayora de las aplicaciones en Internet se basan en el modelo Cliente-Servidor. La interaccin Cliente-Servidor forma la base de la mayor parte de la comunicacin por redes y es fundamental ya que nos ayuda a comprender las bases sobre las que estn construidos los algoritmos distribuidos.

Tema 8: El modelo Cliente-Servidor

Ampliacin de Redes de Computadores (4 II)

2. Conceptos Bsicos
El modelo Cliente-Servidor define la estructura de las aplicaciones comunicantes y su sincronizacin. Estas se dividen en dos partes: El Cliente y el Servidor. La sincronizacin se resuelve haciendo que el servidor se ejecute de forma indefinida, esperando al cliente.
Cliente: Peticin enviada al puerto bien-conocido Servidor: Respuesta enviada al puerto del cliente

Cliente
A.U S.O

Servidor Sockets
Puerto Bien-Conocido

Sockets
Hardware

A.U S.O

Internet
Tema 8: El modelo Cliente-Servidor

Hardware
4

Ampliacin de Redes de Computadores (4 II)

Conceptos Bsicos
El Cliente: Programa que inicia la comunicacin y que es dirigido por el usuario. Cada vez que una aplicacin de un cliente se ejecuta, el cliente contacta con el servidor, enva una peticin y espera la respuesta.
Sencillos, no requieren privilegios del sistema.

El trmino Servidor se aplica a cualquier programa que ofrece un servicio que se puede obtener en una red. El servidor est ejecutndose indefinidamente a la espera de peticiones de servicio de los clientes (Normalmente, inicia su ejecucin cuando se inicia el sistema).
Necesitan acceder a recursos del sistema (privilegios). Son ms complejos y ms robustos, su diseo debe de ser cuidadoso. Deben tener en cuenta aspectos como: Autenticacin, Autorizacin, Seguridad y Privacidad de la informacin y Proteccin del sistema donde residen.

Tema 8: El modelo Cliente-Servidor

Conceptos Bsicos
Clasificacin
Cliente estndar vs Cliente no estndar

Ampliacin de Redes de Computadores (4 II)

Los clientes estndar invocan los servicios bien-conocidos de TCP/IP (e-mail, WWW, TELNET, FTP, HTTP, etc.) que tienen identificadores de puerto universalmente reconocidos Los clientes no estndar, utilizan servicios localmente conocidos y hechos a medida que utilizan tambin TCP/IP para comunicarse (automatrcula, acceso a bibliotecas, etc.)

Servidores con conexin vs sin conexin


Los primeros utilizan los servicios de TCP y los segundos los de UDP. Cundo elegir uno u otro?. Depende de las necesidades de la aplicacin: Fiabilidad (TCP), entrega ordenada (TCP), entorno de aplicacin (LAN-pocos-errores-UDP,WAN-TCP), sobreflujo computacional de los protocolos (UDP-bajo, TCP-elevado), el uso de

Tema 8: El modelo Cliente-Servidor

multicast y/o broadcast (UDP), etc.

Conceptos Bsicos
Clasificacin
Servidores secuenciales vs concurrentes

Ampliacin de Redes de Computadores (4 II)

Los Servidores Secuenciales procesan usa solicitud cada vez. Las peticiones que lleguen mientras est atendiendo a uno deben de ser encoladas. Se utilizan cuando el tiempo medio de respuesta y servicio que observa el cliente sea pequeo.(DAYTIME). Los Servidores Concurrentes pueden atender a varios clientes al mismo tiempo. Se utilizan cuando el tiempo medio de respuesta y servicio es grande o desconocido a priori (FTP, TELNET, etc.), o cuando la demanda de acceso es elevada.
8La mayora de servidores concurrentes se basan en las capacidades multiproceso del S.O donde residen. 8Son ms complejos y utilizan ms recursos del sistema. 8Existen dos tipos de procesos: Maestro y Esclavo. 8Normalmente existe un nico proceso maestro que recoge las peticiones de servicio de los clientes y crea procesos esclavos que las atienden. 8Un proceso maestro nunca habla directamente con el cliente. 8Cuando un proceso esclavo finaliza el servicio con un cliente, desaparece del sistema.
7

Tema 8: El modelo Cliente-Servidor

Conceptos Bsicos
Clasificacin
de estado

Ampliacin de Redes de Computadores (4 II)

Servidores con informacin de estado vs sin informacin


Mantienen informacin del estado del servicio con sus clientes, haciendo un trabajo lo ms eficiente posible. Ventajas: Los mensajes que intercambian con los clientes son ms cortos y la velocidad de respuesta se eleva. Inconvenientes: La informacin de estado consume recursos, si no hay fiabilidad (UDP) la informacin de estado puede ser incorrecta, e incrementa la complejidad del servidor. Ejemplo: Un servidor de ficheros. Los clientes envan peticiones al servidor para leer o escribir en ficheros. Para cada cliente se guarda informacin del estado de los ltimos accesos (el servidor asigna manejador, nombre fichero, posicin lectura/escritura).

Tema 8: El modelo Cliente-Servidor

3. Caractersticas y Estructura de un Cliente


- Son ms sencillos que los servidores. - En general, no requieren privilegios del sistema.

Ampliacin de Redes de Computadores (4 II)

- No necesitan dialogar con varios servidores, normalmente slo lo hacen con uno. - El desarrollo de clientes suele ser bastante rpido, una vez se conoce el protocolo (dilogo) que debe utilizar para comunicarse con el servidor. - Dos clases de clientes: - Sin conexin (UDP). - COn conexin (TCP).
Tema 8: El modelo Cliente-Servidor 9

Caract. y estructura de un cliente


Obtencin de la Informacin
Cmo se obtiene la direccin del servidor?

Ampliacin de Redes de Computadores (4 II)

El usuario pasa esta informacin en la lnea de comandos cuando ejecuta la aplicacin cliente (Recomendado, lo utilizan la inmensa mayora de las aplicaciones). Ej: $ telnet 161.67.8.30 La direccin del servidor se encuentra en un fichero local (fichero de configuracin del cliente). Se utiliza otra aplicacin para encontrar el servidor que requiere el cliente (difundir un mensaje y todos los servidores responden).

Y si slo se conoce el nombre del servidor?


A cada direccin IP se le puede asignar un nombre 161.67.8.43 almansa.info-ab.uclm.es Servicio de traduccin de nombres a direcciones IP: DNS.

Tema 8: El modelo Cliente-Servidor

10

Caract. y estructura de un cliente


Informacin asociada a un host
-

Ampliacin de Redes de Computadores (4 II)

Existen funciones (interfaz socket) que permiten obtener informacin sobre un host dando su nombre o direccin IP: Gethostbyname y Gethostbyaddr. Buscan la informacin en el fichero etc/hosts (en Windows esta informacin se encuentra en c:\windows\host). Si no la encuentra, procede a la bsqueda sobre un servidor de nombres (DNS).
#include <netdb.h>

struct hostent * gethostbyname(char *name); struct hostent * gethostbyaddr(char *addr, int addrlen, int addrtype); struct hostent { char *h_name; /*Nombre oficial del host*/ char **h_aliases; /*Lista de alias*/ int h_addrtype; /*Tipo de direccin de host (AF_INET)*/ int h_length; /*Longitud de la direccin */ char **h_addr_list; /*Lista de direcciones */ }; #define h_addr h_addr_list[0]
Tema 8: El modelo Cliente-Servidor

11

Caract. y estructura de un cliente


Informacin asociada a un puerto
-

Ampliacin de Redes de Computadores (4 II)

Existen funciones (interfaz socket) que permiten obtener informacin acerca de los servicios y las direcciones de puertos de protocolo bienconocidos que utilizan: Getservbyname y Getservbyport. Buscan la informacin en el fichero etc/services (en Windows esta informacin se encuentra en c:\windows\services).
#include <netdb.h> struct servent * getservbyname(char *name, char *proto); struct servent * getservbyport(int port, char *proto); struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; }; /*Nombre oficial del servicio*/ /*Lista de alias*/ /*Nmero de puerto */ /*Protocolo a usar */
12

Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un cliente


Informacin asociada a los protocolos
-

Ampliacin de Redes de Computadores (4 II)

Existen funciones que permiten obtener informacin acerca de los protocolos disponibles en un host: Getprotobyname y Getprotobynumber. La informacin de los protocolos de un sistema est almacenada en el fichero etc/protocols (en Windows esta informacin se encuentra en c:\windows\protocols).
#include <netdb.h> struct protoent * getprotobyname(char *name); struct protoent * getprotobynumber(int proto); struct protoent { char *p_name; char **p_aliases; int p_proto; }; /*Nombre oficial del protocolo*/ /*Lista de alias*/ /*Nmero de protocolo */

Tema 8: El modelo Cliente-Servidor

13

Caract. y estructura de un cliente


Algoritmo de un cliente UDP
ALGORITMO DE UN CLIENTE UDP

Ampliacin de Redes de Computadores (4 II)

1.Obtener la informacin IP y el nmero de puerto donde estar esperando el servidor con el que queremos contactar, y construir la direccin de socket remota. 2.Crear un socket de tipo SOCK_DGRAM. (SOCKET) 3.Especificar la direccin del socket local que acabamos de crear, dejando que el sistema seleccione un puerto disponible (Asignacin dinmica).(BIND) 4.(*) Especificar el servidor con el que queremos trabajar. (CONNECT) 5.Protocolo de aplicacin. Dialogo entre cliente y servidor basado en mensajes peticin/respuesta. (SENDTO, RECVFROM, READ*, WRITE*, SEND *, RECV*) 6.Eliminar el socket. (CLOSE)
(*) Opcional. Tema 8: El modelo Cliente-Servidor 14

Caract. y estructura de un cliente


Algoritmo de un cliente UDP
Paso 4: CONNECT sobre un socket UDP (opcional). Define la asociacin entre un cliente y un servidor UDP. Comunicacin restringida al servidor asociado. No conlleva intercambio de mensajes (el CONNECT). Se pueden usar READ, WRITE, SEND, RECV. Paso 5: Transferencia compacta.

Ampliacin de Redes de Computadores (4 II)

Para cada SENDTO se enva todo el mensaje en un solo datagrama, pudiendo recogerlo con un solo RECVFROM. Paso 6: Fin de servicio. Al eliminar un socket, el UDP no informa al otro extremo, rechazando los mensajes dirigidos al puerto que estaba asociado a ese socket.
Tema 8: El modelo Cliente-Servidor 15

Caract. y estructura de un cliente


Algoritmo de un cliente TCP
ALGORITMO DE UN CLIENTE TCP

Ampliacin de Redes de Computadores (4 II)

1.Obtener la informacin IP y el nmero de puerto donde estar esperando el servidor con el que queremos contactar, y construir la direccin de socket remota. 2.Crear un socket de tipo SOCK_STREAM. (SOCKET) 3.(*) Especificar la direccin del socket local que acabamos de crear, dejando que el sistema seleccione un puerto disponible (Asignacin dinmica).(BIND) 4.Establecer la conexin con el servidor. (CONNECT) 5.Protocolo de aplicacin. Dialogo entre cliente y servidor basado en mensajes peticin/respuesta. (READ, WRITE, SEND, RECV) 6.Cerrar la conexin, eliminando el socket. (CLOSE, SHUTDOWN)
(*) Opcional.
Tema 8: El modelo Cliente-Servidor 16

Caract. y estructura de un cliente


Paso 5: Recepcin de datos en TCP

Ampliacin de Redes de Computadores (4 II)

Algoritmo de un cliente TCP

TCP puede agrupar o dividir los mensajes que le pasamos para la entrega al destino. As, si un extremo enva 100 bytes con un write, el otro puede recogerlos con uno o varios read. El caso contrario es posible. Ejemplo: Recepcin de un nmero determinado de octetos.
/*Conexin ya establecida sobre el socket s. Quiero recibir len octetos del otro extremo*/ char buff [500]; write (s, hola, 4); while ((n = read (s,buff,len )>0) { buff += n; len -= n; }

Paso 6: Cierre de una conexin TCP


Debido a que TCP permite la comunicacin bidireccional, el cierre de una conexin TCP requiere cierta coordinacin entre cliente y se rvidor. Los servidores no deciden el cierre de la conexin, esperan recibir las peticiones de los clientes. Para cerrar la conexin establecida se requiere una sincronizacin entre ambas aplicaciones:

Tema 8: El modelo Cliente-Servidor

4Con un mensaje explcito (FTP: bye). 4Cerrando parcialmente la conexin (SHUTDOWN)

17

Caract. y estructura de un cliente


Procedimiento ConnectSock

Ampliacin de Redes de Computadores (4 II)

int connectsock (host,service,protocol) if (strcmp (protocol, "udp") == 0) char *host, *service, *protocol; type = SOCK_DGRAM; { struct hostent *phe; else type = SOCK_STREAM; struct servent *pse; s = socket (AF_INET, type, ppe->p_proto); struct protoent *ppe; if (s<0) errexit ("can'create socket %s\n", struct sockaddr_in sin; sys_errlist[errno]); int s,type; if (connect (s, (struct sockaddr *)&sin, memset ((char *)&sin,0, sizeof (sin)); sizeof(sin)) <0 ) sin.sin_family = AF_INET; errexit ("can't connect to %s.\n", host); if (pse = getservbyname (service, protocol)) return s; sin.sin_port = pse->s_port; } else if ((sin.sin_port = htons ((u_short) atoi (service))) == 0) errexit ("can't get %s service entry \n", service); if (phe = gethostbyname (host)) memcpy (phe->h_addr, (char *)&sin.sin_addr, phe->h_length); else if (((sin.sin_addr.s_addr = inet_addr (host)) == INADDR_NONE ) errexit ("can't get %s host entry \n", host); if ((ppe = getprotobyname (protocol)) == 0) errexit (Bad %s protocol\n", protocol);
Tema 8: El modelo Cliente-Servidor 18

Caract. y estructura de un cliente


Ejemplo: Servicio DAYTIME
actual en una cadena de caracteres. Puerto bien-conocido de DAYTIME: 13. Servicio implementado sobre TCP y sobre UDP.
Versin TCP Versin UDP

Ampliacin de Redes de Computadores (4 II)

Servicio estndar de Internet que suministra la fecha y la hora

Connect

SendReq

Write

SendReply

Close

Servidor

Servidor

Cliente

Cliente

Tema 8: El modelo Cliente-Servidor

19

Caract. y estructura de un cliente


#include <stdio.h> #include <socket.h> #define LINELEN 128 #define MSG Que hora es ? char *service = daytime"; char *host = "localhost"; s = connectUDP (host, service); printf (\n %s: , MSG); write (s, MSG, strlen (MSG));

Ampliacin de Redes de Computadores (4 II)

Ejemplo: Cliente UDP del servicio DAYTIME

int main (argc, argv ) int argc; char *argv []; int connectUDP (host, service) { char *host; int s, n; char *service; char buff[LINELEN]; { switch (argc) { return connectsock (host, service, udp); case 1: host = "localhost"; break; } case 3: service = argv[2]; case 2: host = argv [1]; break ; default: fprintf (stderr, "Uso: DayTime [host [port]]\n"); exit (1); }
Tema 8: El modelo Cliente-Servidor

n = read (s, buff, LINELEN); if (n > 0) printf ("%s", buff) else errexit (Read Failed: %s \n, sys_errlist[errno]; close(s); }

20

Caract. y estructura de un cliente


#include <stdio.h> #include <socket.h> #define LINELEN 128 char *service = daytime"; char *host = "localhost"; int main (argc, argv ) int argc; char *argv []; { int s, n; char buff[LINELEN];

Ampliacin de Redes de Computadores (4 II)

Ejemplo: Cliente TCP del servicio DAYTIME


s = connectTCP (host, service); printf (\n Fecha y Hora: ); while (n = read (s, buff, LINELEN) > 0) printf ("%s", buff); close(s); } int connectTCP (host, service) char *host; char *service; { return connectsock (host, service, tcp); }

switch (argc) { case 1: host = "localhost"; break; case 3: service = argv[2]; case 2: host = argv [1]; break ; default: fprintf (stderr, "Uso: DayTime [host [port]]\n"); exit (1); }
Tema 8: El modelo Cliente-Servidor

21

4. Caractersticas y Estructura de un Servidor


conjunto de clientes. Su diseo depender de la naturaleza del servicio que ofrece.

Ampliacin de Redes de Computadores (4 II)

Un servidor debe de estar dispuesto a dar servicio a un

Los servidores necesitan privilegios de acceso a recursos del sistema. Deben ser robustos y seguros. Existen 4 clases bsicas de servidores:
Secuencial con conexin (TCP). DAYTIME, TIME, ECHO, FINGER. Secuencial sin conexin (UDP). DAYTIME, TIME, ECHO, FINGER. Concurrente con conexin (TCP).TELNET,FTP,WWW,NNTP, SMTP. Concurrente sin conexin (UDP). TFTP.

Tema 8: El modelo Cliente-Servidor

22

Caract. y estructura de un servidor


Algoritmo de un servidor secuencial UDP
ALGORITMO DE UN SERVIDOR SECUENCIAL UDP 1.Crear un socket de tipo SOCK_DGRAM. (SOCKET) 2.Asociar una direccin de socket bien-conocida. (BIND) 3.Esperar la recepcin de un mensaje de peticin de servicio sobre el socket recin creado (RECVFROM) 4.Procesar la peticin de servicio recibida y enviar los resultados al cliente que hizo la peticin (un mensaje o varios). (SENDTO). 5.Volver al paso 3.
Servidor

Ampliacin de Redes de Computadores (4 II)

Estructura de un servidor secuencial UDP


Tema 8: El modelo Cliente-Servidor

Aplicacin Socket
(puerto bien -conocido)

S.O.
23

Caract. y estructura de un servidor


Algoritmo de un servidor secuencial TCP
ALGORITMO DE UN SERVIDOR SECUENCIAL TCP 1.Crear un socket de tipo SOCK_DGRAM. (SOCKET) 2.Asociar una direccin de socket bien-conocida. (BIND) 3.Permitir la recepcin de peticiones de conexin (LISTEN) 4.Esperarse activamente a recibir una peticin de conexin ( ACCEPT). Cuando se establece una nueva conexin se obtiene un nuevo socket, el cual est asociado a la conexin recin establecida. 5.Dialogo cliente servidor basado en un protocolo de tipo peticinrespuesta. Transferencia de informacin (READ, WRITE). 6.Al finalizar el servicio se debe cerrar el socket asociado a la conexin con el cliente. (CLOSE) 7.Volver al paso 4.
Tema 8: El modelo Cliente-Servidor 24

Ampliacin de Redes de Computadores (4 II)

Caract. y estructura de un servidor


Algoritmo de un servidor secuencial TCP
Paso 4: ACCEPT

Ampliacin de Redes de Computadores (4 II)

Se dispone de un socket (socket Maestro) sobre el que se esperan las peticiones de los clientes. Cuando un cliente establece conexin, se crea un nuevo socket (socket Esclavo) asociado a esa conexin.

Paso 6: CLOSE
Cuando se llama a CLOSE, el TCP transfiere los datos an no enviados antes de iniciar el protocolo de cierre. Problema: Si el cierre lo inicia el cliente, Servidor ste podr controlar los recursos (conexiones, puertos, sockets, etc.) A.U que le ofrece el servidor. M E
- Ej. Servidor FTP. Implementa un mecanismo para detectar y eliminar conexiones sin actividad.

S.O

Estructura de un servidor secuencial TCP


Tema 8: El modelo Cliente-Servidor

Hardware
25

Caract. y estructura de un servidor


Procedimiento PassiveSock
int passivesock (service, protocol, qlen) char * service, * protocol; int qlen; { struct servent * pse; struct protoent * ppe; struct sockaddr_in sin; int s, type; memset ((char *)&sin,0, sizeof (sin)); sin.sin_family = AF_INET ; sin.sin_addr.s_addr = INADDR_ANY ; if (strcmp (protocol, "udp") == 0) type = SOCK_DGRAM; else type = SOCK_STREAM;

Ampliacin de Redes de Computadores (4 II)

s = socket (AF_INET, type, ppe->p_proto); if (s < 0) errexit ("No puedo crear el socket: % s\n", sys_errlist[errno]); if ( bind (s, (struct sockaddr *)&sin,sizeof(sin ))< 0) errexit ("No puedo asociar el socket: % s\n", sys_errlist[errno]);

if ( pse = getservbyname (service, protocol )) if (type==SOCK_STREAM && listen (s, qlen) < 0) sin.sin_port = pse ->s_port ; errexit ("No puedo hacer listen: % s\n", else sys_errlist[errno]); if ((sin.sin_port = htons (atoi (service)) == 0) errexit (Servicio inexistente: %s\n", service); return s; if (( ppe = getprotobyname (protocol)) == 0) } errexit (Protocolo inexistente: %s\n", protocol); 26

Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un servidor


Ejemplo: Servidor secuencial UDP de TIME
El servicio TIME es anlogo al servicio DAYTIME.

Ampliacin de Redes de Computadores (4 II)

La fecha y la hora actual se codifica en un entero de 32 bits. Representa el nmero de segundos transcurridos desde las 00:00 del 1/1/1900 (fecha de poca).

Ventajas respecto a DAYTIME:


El servicio es ms rpido (slo se envan 32 bits). No existen problemas de desplazamientos horarios (GMT)

El puerto bien-conocido para TIME es el 37. El comportamiento del servidor TIME es anlogo al del servicio DAYTIME. Uso: Sincronizacin de relojes de hosts.
27

Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un servidor


Ejemplo: Servidor secuencial UDP de TIME
#define UNIXEPOCH 2208988800 int main (argc, argv) int argc; char *argv []; { struct sockaddr_in fsin; char *service = "time"; char buff[1]; int sock, alen; time_t now; switch (argc) { case 1: break; case 2: service = argv [1]; break; default: printf("usage:UDPtimed [port]\n"); exit (1); } sock = passiveUDP (service);
Tema 8: El modelo Cliente-Servidor

Ampliacin de Redes de Computadores (4 II)

while (1) { alen = sizeof(fsin); if (recvfrom (sock , buff, sizeof (buff), 0, (struct sockaddr *)&fsin, &alen) < 0) errexit("recvfrom: %s", sys_errlist[errno]); time (&now); now= htonl ((u_long) (now + UNIXEPOCH)); (void ) sendto (sock , (char *)&now, sizeof(now), 0, ( struct sockaddr *)&fsin, sizeof(fsin)); } /* Fin del while */ } int passiveUDP (service) char *service; { return passivesock (service, "udp", 0); }

28

Caract. y estructura de un servidor


#define QLEN 5 int main (argc, argv ) int argc; char *argv []; { struct sockaddr_in fsin; char *service = daytime"; int msock , ssock , alen; time_t now; char *pts; switch (argc) { case 1: break; case 2: service = argv[1]; break ; default: printf("usage:TCPdaytimed [port]\n"); exit(1); } msock = passiveTCP (service, QLEN);

Ampliacin de Redes de Computadores (4 II)

Ejemplo: Servidor secuencial TCP de DAYTIME


while (1) { alen = sizeof(fsin); ssock = accept (msock , (struct sockaddr *) &fsin, &alen); if (ssock < 0) errexit (accept failed: %s\n, sys_errlist [ errno]; time (&now); pts = ctime (&now); write (ssock , pts, strlen (pts)); close (ssock ); } /* Fin del while */

int passiveTCP (service, qlen) char *service; int qlen; { return passivesock (service, tcp", qlen); }
29

Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un servidor


Algoritmo de un servidor concurrente UDP
Proceso MAESTRO
1.Crear un socket de SOCK_DGRAM. (SOCKET) tipo

Ampliacin de Redes de Computadores (4 II)

Proceso ESCLAVO
1.Recoge la peticin de servicio que le pasa el proceso maestro as como la direccin del cliente. 2.Procesa la peticin enviando los resultados al cliente en uno o varios mensajes. (SENDTO) 3.Finalizado el servicio, el proceso esclavo se autodestruye (EXIT).

2.Asociar una direccin de socket bien-conocida (BIND) 3.Esperar la recepcin de un mensaje de peticin de servicio sobre el socket recin creado (RECVFROM) 4.Crear un proceso esclavo y pasarle la peticin de servicio recibida. 5.Volver al paso 3.
Tema 8: El modelo Cliente-Servidor

30

Caract. y estructura de un servidor


Algoritmo de un servidor concurrente UDP
Esta clase de servidores no se suelen utilizar. Existen pocas aplicaciones en Internet que se ajusten a la estructura de esta clase de servidores. La mayora de servidores concurrentes suelen ser con conexin (TCP). El coste que supone crear un proceso a menudo no compensa el tiempo de servicio de una peticin. Una excepcin: TFTP (Trivial File Transfer Protocol).
Esclavo Esclavo Esclavo -n Esclavo
Aplicacin S.O .

Ampliacin de Redes de Computadores (4 II)

Maestro

Estructura de un servidor concurrente UDP

Socket
Tema 8: El modelo Cliente-Servidor 31

Caract. y estructura de un servidor


Algoritmo de un servidor concurrente TCP
Proceso MAESTRO
1.Crear un socket de SOCK_STREAM. (SOCKET) tipo

Ampliacin de Redes de Computadores (4 II)

Proceso ESCLAVO
1.Recoge el nuevo socket resultante del establecimiento de conexin. 2.Intercambio de mensajes entre el cliente y el servidor. Protocolo de aplicacin. (READ, WRITE) 3.Finalizado el servicio, el proceso esclavo cierra la conexin (CLOSE) y se autodestruye. (EXIT)
32

2.Asociar una direccin de socket bien-conocida (BIND) 3.Permitir la recepcin de peticiones de conexin. (LISTEN) 4.Esperar activamente a recibir una peticin de conexin (ACCEPT) 5.Cuando se establece una nueva conexin, se crea un proceso esclavo (FORK) al que se le pasar el nuevo socket devuelto por ACCEPT 6.Volver al paso 4
Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un servidor


Algoritmo de un servidor concurrente TCP
Con la llamada al sistema fork() un proceso puede crear otro proceso.

Ampliacin de Redes de Computadores (4 II)

El proceso creado (proceso hijo) es una copia exacta del proceso creador (proceso padre). FORK devuelve un entero que permite distinguir ambos procesos(cero al proceso hijo y distinto de cero al proceso padre).
Fork
Proceso Maestro
Proceso Esclavo1

Proceso Esclavo2

Estructura de un servidor concurrente TCP

Proceso EsclavoN

A.U

M S.O

Es1

Es2

Esn

Hardware
Tema 8: El modelo Cliente-Servidor 33

Caract. y estructura de un servidor


Ejemplo: Servidor concurrente TCP de ECHO
programas de red y medidas de tiempos de respuesta. Devuelve los mensajes que envan los clientes. El puerto bien-conocido para ECHO es el 7. Se implementa para TCP y UDP.
Versin TCP
Connect Msg1 Msg1

Ampliacin de Redes de Computadores (4 II)

Servicio estndar de Internet que se utiliza para depuracin de

Versin UDP

Servidor

Cliente

Msg1
. . .

Msg1

Close

Servidor
34

Tema 8: El modelo Cliente-Servidor

Cliente

Caract. y estructura de un servidor


Ejemplo: Servidor concurrente TCP de ECHO
char buff[LINELEN]; char *service; int main (argc, argv ) int argc; char *argv []; { int msock , ssock , n; struct sockaddr_in cli_addr; int cli_size; switch (argc) { case 1: service = "servecho"; break; case 2: service = argv [1]; break ; default: fprintf (stderr, "Uso: echod [port]\n"); exit(1); } msock = passiveTCP (service, 5); if (msock < 0) errexit ("Error passiveTCP: %s\n.", sys_errlist [errno]);
Tema 8: El modelo Cliente-Servidor

Ampliacin de Redes de Computadores (4 II)

while (1) { cli_size = sizeof (cli_addr); ssock = accept (msock , &cli_addr, &cli_size); if (fork ()) close (ssock ); else { /* Proceso hijo */ close (msock ); do_echo (ssock ); exit (0); } } /* fin del while */ } int do_echo(sock ) int sock; { int n; while ( (n = read (sock , buff, LINELEN)) > 0) write (sock , buff, n); close(sock ); }
35

Caract. y estructura de un servidor


Servidores Multiprotocolo
-

Ampliacin de Redes de Computadores (4 II)

Ofrecen un servicio sobre UDP y TCP al mismo tiempo. Muchos servicios estndar de Internet se ofrecen tanto en UDP como en T CP. Parece ms lgico implementar un nico servidor que acepte peticiones de clientes TCP y UDP
Menos procesos en el sistema Facilidad de mantenimiento El servicio es el mismo (reutilizacin de cdigo)

Tema 8: El modelo Cliente-Servidor

Los servidores multiprotocolo pueden ser secuenciales (ms habitual) o concurrentes. El servidor debe atender al Servidor secuencial mismo tiempo las peticiones Multiprotocolo que le lleguen sobre los sockets maestros TCP y UDP. Para ello, se utiliza la llamada al sistema SELECT: Analiza la Aplicacin actividad de los descriptores (sockets maestros) que le Msock Msock Esock S.O. indiquemos. UDP TCP TCP
36

Caract. y estructura de un servidor


Servidor multiprotocolo de DAYTIME
int main (int argc, char *argv []) { struct sockaddr_in fsin; char *service ="daytime, buff[128]; int tsock , usock , ssock , alen, nfds; fd_set rfds; switch (argc) { case 1: break; case 2: service = argv[1]; break ; default: printf("usage: daytimed [port]\n"); } tsock = passivesock (service,"tcp",qlen); usock = passivesock (service,"udp", 0); nfds = MAX (tsock , usock ) +1 ; FD_ZERO (&rfds); while (1) { FD_SET (tsock , &rfds); FD_SET (usock , &rfds);
Tema 8: El modelo Cliente-Servidor if ( select (nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *) 0) < 0) errexit ("select error: % s\n", sys_errlist [errno ]); if ( FD_ISSET (tsock, &rfds)) { alen = sizeof (fsin ); ssock = accept (tsock, (struct sockaddr *) &fsin, &alen); if (ssock < 0) errexit ("accept : % s\n", sys_errlist [errno]); daytime (buff); write (ssock, buff, strlen(buff)); close (ssock); } if (FD_ISSET (usock, &rfds )) { alen = sizeof (fsin ); if (recvfrom (usock, buff, sizeof(buff),0, (struct sockaddr *)&fsin, &alen ) < 0) errexit ("recvfrom: % s\n",sys_errlist[errno ]); daytime (buff); sendto (usock, buff, strlen (buff), 0, (struct sockaddr *) &fsin, sizeof (fsin)); } } /* fin del while * / 37

Ampliacin de Redes de Computadores (4 II)

Caract. y estructura de un servidor


Servidores Multiservicio
-

Ampliacin de Redes de Computadores (4 II)

Son servidores que suministran varios servicios simultneamente La motivacin y ventajas que ofrecen este tipo de servidores son las mismas que las de los servidores multiprotocolo. Pueden ser secuenciales, concurrentes, con o sin conexin. En un servidor multiservicio secuencial UDP, el servidor espera datagramas sobre cualquiera de cada uno de los sockets asociado a cada uno de los servicios ofrecidos. En un servidor multiservicio secuencial TCP, el servidor tiene abierto un socket maestro para cada uno de los servicios ofrecidos, y a lo sumo, un socket esclavo adicional para manejar una conexin particular. En un servidor multiservicio concurrente TCP, el proceso maestro maneja las peticiones de conexin entrantes, mientras un proceso esclavo maneja cada conexin.
38

Tema 8: El modelo Cliente-Servidor

Caract. y estructura de un servidor


Servidor

Ampliacin de Redes de Computadores (4 II)

Estructura de algunos Servidores Multiservicio


Servidor

Aplicacin

Aplicacin

Ms.1

Ms.2

...

Ms.n

S.O.

Ms.1 ... Ms.n


(uno por cada servicio ofrecido)

(uno por cada servicio ofrecido)

(socket para conexin individual)

Ek

S.O.

Secuencial UDP
Maestro
Fork

Secuencial TCP
EsclavoN Esclavo2 Esclavo1
Aplicacin

...

Ms.1 ... Ms.k


(uno por cada servicio ofrecido)

Esock1 Esock2 ... EsockN


(sockets para conexiones esclavas individuales)

S.O.

Tema 8: El modelo Cliente-Servidor

Concurrente TCP

39

Caract. y estructura de un servidor


El Super-Servidor INETD
-

Ampliacin de Redes de Computadores (4 II)

BSD UNIX desarroll un superservidor destinado a atender todas las peticiones de servicios Internet. Se puede clasificar como un servidor multiprotocolo y multiservicio que admite cualquier variante. Permite ahorrar eficientemente recursos del sistema. Utiliza un fichero de configuracin /etc/inetd.conf que almacena informacin sobre los servicios que debe de atender y la forma en que debe hacerlo.
Fichero texto, cada lnea define un servicio.
Service
ftp telnet

Socket-T Protocol Wait? Name


stream stream tcp tcp nowait nowait root root

Program Path Prog.Argument


/usr/sbin/ftpd /usr/sbin/telnetd /usr/sbin/ftpd l /usr/sbin/telnetd

Tema 8: El modelo Cliente-Servidor

El INETD se lanza en el arranque del sistema , de forma que solo atender los servicios descritos en el fichero de configuracin. Todos los sistemas UNIX usan INETD para ofrecer servicios Internet.
40

Caract. y estructura de un servidor


Estructura del Super-Servidor INETD
EsclavoN

Ampliacin de Redes de Computadores (4 II)

Esclavo2 Fork

...

INETD

Esclavo1 Exec Prog.1 Prog.2

Prog.N

Aplicacin

Ms.1 ... Ms.k Esock1 Esock2 ... EsockN


(uno por cada servicio ofrecido) (sockets para conexiones esclavas individuales)

S.O.

Se encarga de recoger las peticiones de los distintos servicios que tiene configurados. Crea un proceso esclavo que a su vez invoca el programa que implementa el servicio demandado.
41

Tema 8: El modelo Cliente-Servidor

Ampliacin de Redes de Computadores (4 II)

5. Conclusiones
El modelo Cliente-Servidor define la estructura de las aplicaciones comunicantes y su sincronizacin En el caso de las aplicaciones Internet, la interfaz de los Sockets sigue mayoritariamente el modelo cliente-servidor. La interaccin Cliente-Servidor forma la base de la mayor parte de la comunicacin por redes y es fundamental ya que nos ayuda a comprender las bases sobre las que estn construidos los algoritmos distribuidos. Existen diferentes algoritmos para la implementacin de los diferentes tipos de clientes y servidores, cada uno adaptado a las necesidades de cada servicio.
Tema 8: El modelo Cliente-Servidor 42