1
INF 1400 Redes de Computadores
INF 1400: Redes de Computadores
Jorge BaierAlvaro Soto
Departamento de Ciencias de la ComputaciónP. Universidad Católica de Chile
Modelo Cliente ServidorSockets y RPC
2
INF 1400 Redes de Computadores
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
3
INF 1400 Redes de Computadores
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
4
INF 1400 Redes de Computadores
ProtocoloLa 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
Cliente Servidor
1. Cliente envia requerimiento
3. Servidor envia respuesta
Recurso
2. Servidor procesarequerimiento
4. Cliente procesa respuesta
Ej. Web browser y web serverProtocolo 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
5
INF 1400 Redes de Computadores
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
6
INF 1400 Redes de Computadores
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
7
INF 1400 Redes de Computadores
Red(connección física)
Host B
Proceso 2
Host A
Proceso 1
Tarjetas de red
Información
Socket
(connección virtual)
Connección Virtual Entre 2 Procesos
8
INF 1400 Redes de Computadores
Servidor
Host A
El servidor debe estar siempre esperando requerimientos. El cliente hace el requerimiento y el servidor responde.
Cliente 2
Cliente 3
Host C
socket
socket
Cliente 1
Host BRequerimientoRespuesta
Socket
Sockets Como Modelo Cliente Servidor
9
INF 1400 Redes de Computadores
Servidor
bind()
listen()
accept()
read()
write()
close()
Cliente
socket()
connect()
write()
close()
socket()
1: Requerimiento de Connección
2. Envia comando
3. Recibe resultadoread()
“*” indica llamada a función bloqueadora
*
*
*
*Ack del requerimiento
Interface Usada Por Sockets
10
INF 1400 Redes de Computadores
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 ?
11
INF 1400 Redes de Computadores
(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);
Funciones y Parámetros en Servidor
12
INF 1400 Redes de Computadores
Servidor
socket
socket 1 socket 2
Cliente 1
socket
Cliente 2
socket
Listen/Connect
13
INF 1400 Redes de Computadores
(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);
Funciones y Parámetros en Cliente
14
INF 1400 Redes de Computadores
“*” indica llamada a función bloqueadoraSERVIDOR
bind()
listen()
accept()
read()
CLIENTE
socket()
connect()
write()
close()
socket()
*
*
*
1: Requerimiento de connección
2. Envía comando
3. Recibe resultadoread()write()
*
4. FIN
Sockets Terminando la Sesión
15
INF 1400 Redes de Computadores
Server
Paso 1 socket(_): crea el identificador del socket• Prepara la estructura de datos para manejar el socket
• OS es el responsable
Socket: Creación
16
INF 1400 Redes de Computadores
Paso 2 bind(_) : connecta un proceso a una puerta específica
6500
ServidorNúmeros de puerta:
0~1023: Reservados Port 21: FTP Port 23: telnet Port 80: HTTP
1024- 65535: disponibles a usuario
Puerta
Puerta =
punto de connección para dosprocesos usando sockets
Sockets: Binding
17
INF 1400 Redes de Computadores
Paso 3: listen(_)
6500
Buffer
Especifíca máximo número de connecciones antes de rechazarrequerimientos de connección
listen (socket_id, number_of_connection);
listen( ): prepara buffers de memoriapara connecciones con clientes
Servidor
Sockets: Listen
18
INF 1400 Redes de Computadores
Step 4 - Part 1 accept(_): el servidor acepta el requerimiento del cliente
Servidor
Cliente6500
accept ( ) es una función bloqueadora
Sockets: Accept
19
INF 1400 Redes de Computadores
Paso 4 - Parte 1 accept(_) : acepta connección desde el clientecreando un nuevo socket y elegiendo una nueva puerta
Cliente
Servidor 7100
6500
Una nueva puerta es elegida por el OS
OS duplica la connección
Sockets: Accept
20
INF 1400 Redes de Computadores
Paso 5- Parte 1: read(_) y write()
Cliente
Servidor
7100
El servidor y el cliente se comunican usando el segundo socket
6500
Transmissión de datos
Sockets: Read/Write
21
INF 1400 Redes de Computadores
Paso 5-Parte 2: el socket original vuelve al paso 4, i.e., la función accept()
Client
Server
6500
Sockets: Nuevas Connecciones
22
INF 1400 Redes de Computadores
Paso 6: close (_)
Client
Server 7100
El segundo socket es cerrado por el cliente
6500
Sockets: Close
23
INF 1400 Redes de Computadores
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
24
INF 1400 Redes de Computadores
RPCProgramas 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
25
INF 1400 Redes de Computadores
RPC: Stubs
Stubs: procesos adicionales que son agregados para implementar la interface RPC
– Client Stub : reemplaza la llamada al procedimiento– Server Stub : reemplaza la llamada al procedimiento
Proceso A
Stub del cliente
Stub del servidor
ProcedimientoB
Host 1 Host 2
26
INF 1400 Redes de Computadores
Llamada a Procedimientos
27
INF 1400 Redes de Computadores
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
28
INF 1400 Redes de Computadores
RPC: Stubs
29
INF 1400 Redes de Computadores
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
30
INF 1400 Redes de Computadores
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
31
INF 1400 Redes de Computadores
RPC: Ejemplo
/* 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;
};
• Archivo de especificación
32
INF 1400 Redes de Computadores
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;
33
INF 1400 Redes de Computadores
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
34
INF 1400 Redes de Computadores
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 Cliente
35
INF 1400 Redes de Computadores
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;
}