350 likes | 534 Views
INF 1400: Redes de Computadores. Modelo Cliente Servidor Sockets y RPC. Jorge Baier Alvaro Soto Departamento de Ciencias de la Computación P. Universidad Católica de Chile. Conceptos Básicos. Modelo Cliente servidor Grupo de procesos que cooperan
E N D
INF 1400: Redes de Computadores Modelo Cliente ServidorSockets y RPC Jorge Baier Alvaro Soto Departamento de Ciencias de la Computación P. Universidad Católica de Chile
Conceptos Básicos • Modelo Cliente servidor • Grupo de procesos que cooperan • Existen procesos que proveen servicios: servidores • Existen procesos que requieren servicios: clientes • Clientes y Servidores son procesos de usuario • Los clientes efectúan requerimientos al servidor y reciben una respuesta de éste • Ejemplos de servicios típicos: impresión, email, www
Conceptos Básicos • Procesos • Servidores manejan recursos y proveen servicios a clientes que desean utilizar este recurso. Ej.- ftp, web server, email... • Clientes usan servicios para lograr objetivos • Clientes son activos, piden servicios • Servidores son pasivos, esperan solicitudes • Procesadores • Sólo un proceso • Múltiples servidores • Múltiples clientes • Mezcla de clientes y servidores
1. Cliente envia requerimiento Cliente Servidor Recurso 3. Servidor envia respuesta 2. Servidor procesa requerimiento Protocolo • La operación fundamental es la Transacción • Cliente necesita un servicio y envía mensaje de solicitud • Servidor recibe solicitud, lo interpreta, y manipula su recurso en la forma apropiada • Servidor envía resultado o código de error • Cliente procesa respuesta 4. Cliente procesa respuesta • Ej. Web browser y web server • Protocolo es simple y eficiente • Respuesta sirve como confirmación (ACK) para la solicitud • Basta con dos rutinas de comunicación: • send(destino, mensaje) • receive(dirección, mensaje) • muchas variaciones posibles
Equivalencia con Modelo OSI • Sólo tres niveles son necesario • Niveles 1 y 2 transmiten los mensajes • Nivel 5 es el protocolo de solicitud-respuesta • Define solicitudes válidas • Define respuestas válidas
Sockets • Que es un socket ? • Un socket es una connección virtual que permite comunicar dos procesos • Sockets proveen una transmisión bi-direccional (full duplex) • Como conecciones virtuales, los sockets pueden ser creados en forma dinámica • La interface de sockets fue desarrollada a principios de los 80´ en la universidad de Berkeley • Sockets son la herramienta de comunicación más utilizada en aplicaciones de internet. TCP/IP usa sockets
Socket (connección virtual) Connección Virtual Entre 2 Procesos Host A Host B Proceso 1 Proceso 2 Información Tarjetas de red Red (connección física)
El servidor debe estar siempre esperando requerimientos. El cliente hace el requerimiento y el servidor responde. Host C Cliente 2 socket socket Host A Servidor Cliente 3 Host B Requerimiento Respuesta Socket Cliente 1 Sockets Como Modelo Cliente Servidor
“*” indica llamada a función bloqueadora 1: Requerimiento de Connección * * Ack del requerimiento * 2. Envia comando * 3. Recibe resultado Interface Usada Por Sockets Servidor socket() Cliente socket() bind() listen() connect() accept() write() read() read() write() close() close()
Direcciones, Puertas y Sockets • Ej.- • Uno es la aplicación y vive en un edificio de departamentos • La dirección esta dada por la ubicación del edificio • El servicio de correo es la red • El socket es la llave que permite dejar correo en la casilla correspondiente del edificio • Además uno puede enviar cartas dejándolas en la casilla • Como elegir la puerta a la que se conecta un socket ?
Funciones y Parámetros en Servidor (1) create socket: int socket(int domain, int type, int protocol); socket_id = socket (AF_INET, SOCK_STREM, DEFAULT_PROTOCOL); (2) bind socket: bind (socket_id, server_addr, server_len); (3) listen to socket: listen (socket_id, number_of_connection); (4) accept a connection: accept (socket_id, &client_addr, &client_len); (5) read (receive) data: read (socket_id, buffer, buffer_len); (6) write (send) data: write (socket_id, buffer, buffer_len); (7) close socket: close(socket_id);
socket socket 1 socket socket socket 2 Listen/Connect Servidor Cliente 1 Cliente 2
Funciones y Parámetros en Cliente (1) create socket: igual que servidor socket_id = socket (AF_INET, SOCK_STREM, DEFAULT_PROTOCOL); (2) connect socket: connect (socket_id, serverINETaddress, server_len); (3) write (send) data: write (socket_id, buffer, buffer_len); (4) read (receive) data: read (socket_id, buffer, buffer_len); (5) close socket: igual que servidor close(socket_id);
write() 4. FIN close() Sockets Terminando la Sesión SERVIDOR “*” indica llamada a función bloqueadora socket() CLIENTE socket() bind() 1: Requerimiento de connección * listen() connect() * accept() write() * read() 2. Envía comando * read() 3. Recibe resultado
Prepara la estructura de • datos para manejar el socket • OS es el responsable Server Socket: Creación Paso 1socket(_): crea el identificador del socket
Puerta Puerta = punto de connección para dos procesos usando sockets 6500 Sockets: Binding Paso 2bind(_): connecta un proceso a una puerta específica Servidor Números de puerta: 0~1023: Reservados Port 21: FTP Port 23: telnet Port 80: HTTP 1024- 65535: disponibles a usuario
listen( ): prepara buffers de memoria para connecciones con clientes Buffer Sockets: Listen Paso 3: listen(_) 6500 listen (socket_id, number_of_connection); Servidor Especifíca máximo número de connecciones antes de rechazar requerimientos de connección
accept ( )es una función bloqueadora Cliente Sockets: Accept Step 4 - Part 1accept(_): el servidor acepta el requerimiento del cliente 6500 Servidor
Servidor OS duplica la connección Una nueva puerta es elegida por el OS Sockets: Accept Paso 4 - Parte1 accept(_) : acepta connección desde el cliente creando un nuevo socket y elegiendo una nueva puerta 6500 Cliente 7100
Transmissión de datos Sockets: Read/Write Paso 5- Parte 1: read(_)ywrite() 6500 Cliente 7100 Servidor El servidor y el cliente se comunican usando el segundo socket
Client Server Sockets: Nuevas Connecciones Paso5-Parte 2: el socket original vuelve al paso 4, i.e., la función accept() 6500
Server Sockets: Close Paso 6: close (_) 6500 Client 7100 El segundo socket es cerrado por el cliente
Llamadas Remotas a Procedimientos: RPC • RPC: Birrel y Nelson, 1984 • RPC permite la ejecución de procedimientos en máquinas remotas • Procedimientos ?, lenguaje de programación procedural • Aún cuando es independiente del lenguaje de programación la mayoría de las implementaciones usan C • Proceso en A llama a un procedimiento en B • Proceso A es suspendido mientras espera respuesta de B • Ejecución del procedimiento ocurre en B • B envia resultado del procedimiento • Proceso en A continúa
RPC • Programas no distinguen llamadas remotas de locales • Información se comunica en argumentos y resultados • Paso de mensajes en invisible, RPC se encarga de los detalles • Algunos inconvenientes • Dos espacios de direccionamiento • Máquinas con distintas representaciones de datos • Falla de máquinas
RPC: Stubs Stubs: procesos adicionales que son agregados para implementar la interface RPC • Client Stub : reemplaza la llamada al procedimiento • ServerStub : reemplaza la llamada al procedimiento Host 2 Host 1 Proceso A Stub delservidor Stub del cliente ProcedimientoB
RPC: Stubs • Llamada remota a procedimiento debe parecer llamada normal • Tanto a quien llama como a quien es llamado • Esquema similar a rutinas que llaman al sistema (ej.- read) • Uso de stub: procedimiento es sólo una interfaz • Cliente hace llamada de la manera usual • Servidor recibe llamada de la manera usual • Stubs esconden detalles • Stubs se generan en forma automática
RPC: Paso a Paso • Cliente llama al stub del cliente de la manera usual • Stub del cliente construye un mensaje y se lo pasa al núcleo • Núcleo envía el mensaje al núcle remoto • Núcleo remoto pasa el mensaje al stub del servidor • Stub del servidor saca los argumentos y llama al servidor de la manera usual • Servidor realiza el trabajo y retorna al stub del servidor • Stub del servidor empaqueta el resultado en un mensaje y se lo pasa al núcleo • Núcleo remoto envía el mensaje al núcleo del cliente • Núcleo del cliente pasa el mensaje al stub del cliente • Stub del cliente saca el resultado y lo retorna al cliente
RPC: Paso de Parámetros • En máquinas identicas los tipos escalares no tienen problemas • Sistemas heterogéneos: • Representación de enteros • Representación de punto flotante • Little vs. Big endian • Tipos de datos conocidos por el cliente y el servidor • Forma canónica para representar información • hton y ntoh • Maquinas idénticas: conversiones inútiles • Paso de punteros y parámetros por referencia
RPC: Ejemplo • Archivo de especificación /* rational.x */ #include "defs.h" program RATIONALSPROG { version RATIONALSVERS { st_rational suma(st_pair) = 1; float rational2float(st_rational) = 2; } = 1; } = 0x20000001; struct st_rational { int num; int den; }; struct st_pair { st_rational A; st_rational B; };
RPC: Ejemplo • Programa Cliente /* rational_client.c */ #include "rational.h" void rationalsprog_1(char *host) { CLIENT *clnt; st_rational *result_1; st_pair suma_1_arg; float *result_2; st_rational rational2float_1_arg; clnt = clnt_create (host, RATIONALSPROG, RATIONALSVERS, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } suma_1_arg.A.num = 1; suma_1_arg.A.den = 4; suma_1_arg.B.num = 3; suma_1_arg.B.den = 4;
RPC: Ejemplo • Programa Cliente result_1 = suma_1(&suma_1_arg, clnt); if (result_1 == (st_rational *) NULL) { clnt_perror (clnt, "call failed"); } rational2float_1_arg.num = 3; rational2float_1_arg.den = 4; result_2 = rational2float_1(&rational2float_1_arg, clnt); if (result_2 == (float *) NULL) { clnt_perror (clnt, "call failed"); } clnt_destroy (clnt); printf("1/4 + 3/4 = %d/%d\n", result_1->num, result_1->den); printf("3/4 = %f\n", *result_2); }
RPC: Ejemplo • Programa Cliente int main (int argc, char *argv[]) { char *host; if (argc < 2) { printf ("usage: %s server_host\n", argv[0]); exit (1); } host = argv[1]; rationalsprog_1 (host); exit (0); }
RPC: Ejemplo • Programa Servidor /* rational_server.c */ #include "rational.h" st_rational *suma_1_svc(st_pair *argp, struct svc_req *rqstp) { static st_rational result; result.num = argp->A.num*argp->B.den + argp->A.den*argp->B.num; result.den = argp->A.den * argp->B.den; return &result; } float * rational2float_1_svc(st_rational *argp, struct svc_req *rqstp) { static float result; result = (float)argp->num / (float)argp->den; return &result; }