Remote Procedure Call RPC Qu es RPC Es

  • Slides: 27
Download presentation
Remote Procedure Call (RPC)

Remote Procedure Call (RPC)

¿Qué es RPC? Es un protocolo que permite a un programa ejecutar código en

¿Qué es RPC? Es un protocolo que permite a un programa ejecutar código en otra máquina remota sin tener que preocuparse por los mecanismos de comunicación entre ambas máquinas

RPC • Creado por Bireel & Nelson en 1984 • Permiten a los programadores

RPC • Creado por Bireel & Nelson en 1984 • Permiten a los programadores llamar procedimientos localizados en otras máquinas. • Un proceso X en una máquina A, puede llamar a un procedimiento localizado en una máquina B. • Información puede llevarse del proceso invocador al invocado dentro de los parámetros. • Ningún mensaje u operación de E/S es visible para el programador. • Problemas a resolver: • Procedimiento invocador e invocado se ejecutan en diferentes máquinas, i. e. diferentes direcciones y posiblemente diferentes arquitecturas. • Ambas máquinas pueden fallar.

Arquitectura de RPC

Arquitectura de RPC

Stub (sustituto) • El stub cliente empaqueta (marshall) los parámetros en un mensaje (considera

Stub (sustituto) • El stub cliente empaqueta (marshall) los parámetros en un mensaje (considera el formato de red) • El stub cliente pasa el mensaje a la capa de Transporte para ser enviado luego al servidor • Cuando el mensaje llega al servidor, la capa de Transporte pasa el mensaje al stub servidor, éste desempaqueta los parámetros y hace la llamada al procedimiento de manera local • Al terminar el procedimiento se retorna el valor devuelto al stub servidor, éste empaqueta el valor de retorno y lo pasa a la capa de Transporte para su envío al cliente • La capa de Transporte recibe el mensaje y lo envía al stub cliente para el desempaquetado del valor devuelto

RPCs: IMPLEMENTACIONES MÁS POPULARES • ONC-RCP (Open Network Computing, ONC-RCP), desarrollada por Sun Microsystem

RPCs: IMPLEMENTACIONES MÁS POPULARES • ONC-RCP (Open Network Computing, ONC-RCP), desarrollada por Sun Microsystem y distribuida con casi todos los sistemas UNIX. • DCE-RPC (DCE, Distributed Computing Enviroment) definido por la Fundación de Software Abierto (OSF, Open Software Foundation) e incluida en los sistemas operativos Windows

ONC - RPC • Desarrollada inicialmente por Sun Microsystem • Disponible en la gran

ONC - RPC • Desarrollada inicialmente por Sun Microsystem • Disponible en la gran mayoría de los sistemas UNIX • Especificación de ONC-RPC versión 2: RFC 1831 • Especificación de XDR: RFC 1832

ONC RPC • ONC-RPC cuenta con los siguientes componentes: • rpcgen: un compilador que

ONC RPC • ONC-RPC cuenta con los siguientes componentes: • rpcgen: un compilador que toma la definición de la interfaz de un procedimiento remoto y genera el “stub” del cliente y el “stub” del servidor. • XDR (e. Xternal Data Representation): un estándar para la descripción y codificación de datos que garantiza portabilidad entre sistemas de arquitecturas diferentes • Una biblioteca que maneja todos los detalles

XDR (e. Xternal Data Representation) • XDR es un protocolo estándar para la descripción

XDR (e. Xternal Data Representation) • XDR es un protocolo estándar para la descripción y codificación de datos • Útil para transferir datos entre diferentes arquitecturas computacionales • Encaja dentro de la capa de presentación del modelo OSI • Utiliza “Implicit Typing” (sólo viaja el valor de la variable por la red) • Utiliza un lenguaje (similar a C) para describir los formatos de los datos. No es un lenguaje de programación • RPC lo utiliza y extiende para describir su formato de datos y declarar procedimientos remotos • Se asume como unidad fundamental de información el byte (= 8 bits) y que es portable

XDR (e. Xternal Data Representation) Algunos Tipos de Datos • Entero con signo: Rango:

XDR (e. Xternal Data Representation) Algunos Tipos de Datos • Entero con signo: Rango: [-2147483648, 2147483647] (32 bits) Representación: Complemento a 2 Declaración: int identifier; • Entero sin signo: Rango: [0, 4294967295] (32 bits) Declaración: unsigned int identifier; • Enteros de 64 bits: Declaración: hyper identifier; unsigned hyper identifier;

XDR (e. Xternal Data Representation) • Algunos Tipos de Datos Enumeración: Tiene la misma

XDR (e. Xternal Data Representation) • Algunos Tipos de Datos Enumeración: Tiene la misma representación de los enteros con signo. Declaración: enum {name-identifier=constant, . . . } identifier; Ejemplo: enum {RED=2, YELLOW=3, BLUE=5} colors;

XDR (e. Xternal Data Representation) Algunos Tipos de Datos : • Punto Flotante de

XDR (e. Xternal Data Representation) Algunos Tipos de Datos : • Punto Flotante de Presición Simple Codificación: IEEE 754 (32 bits) Declaración: float identifier; • Punto Flotante de Doble Presición Codificación: IEEE 754 (64 bits) Declaración: double identifier;

XDR (e. Xternal Data Representation) Algunos Tipos de Datos • Arreglo Declaración: type-name identifier[n];

XDR (e. Xternal Data Representation) Algunos Tipos de Datos • Arreglo Declaración: type-name identifier[n]; (Arreglo de longitud fija) type-name identifier; (Arreglo de longitud variable) • Estructura Declaración: struct { component-declaration-A; component-declaration-B; . . . } identifier;

XDR (e. Xternal Data Representation) • Cadenas de caracteres: Declaración: string object;

XDR (e. Xternal Data Representation) • Cadenas de caracteres: Declaración: string object;

XDR (e. Xternal Data Representation) ONC-RPC es un protocolo de mensajes especificado en XDR.

XDR (e. Xternal Data Representation) ONC-RPC es un protocolo de mensajes especificado en XDR. El lenguaje especificado por RPC es idéntico al lenguaje de XDR, excepto que agrega la definición de “programa” program-def: "program" identifier "{“ version-def * "}" "=" constant "; " version-def: "version" identifier "{“ procedure-def * "}" "=" constant "; " procedure-def: type-specifier identifier "(" type-specifier (", " type-specifier )* ")" "=" constant "; "

Portmap Es un servicio demonio encargado de mapear tuplas #Programa/#versión hacia números de puerto

Portmap Es un servicio demonio encargado de mapear tuplas #Programa/#versión hacia números de puerto para una versión determinada de algún programa. Siempre se ejecuta en el puerto 111 de TCP/UDP #rpcinfo –p #sudo apt-get install rpcbind

Registro y localización de un servicio RPC

Registro y localización de un servicio RPC

Asignación de los números de programa en los RPCs de SUN Desde Hasta Designado

Asignación de los números de programa en los RPCs de SUN Desde Hasta Designado por 0 x 0000 0 x 1 FFFFFFF SUN Microsystems Inc. 0 x 20000000 0 x 3 FFFFFFF Usuario 0 x 40000000 0 x 5 FFFFFFF Sin uso 0 x 60000000 0 x. FFFF Reservado

Creación de una aplicación usando XDR 1. Creación de la definición de interfaz usando

Creación de una aplicación usando XDR 1. Creación de la definición de interfaz usando XDR. Ej. suma. x struct sumandos { int sumando 1; int sumando 2; }; program SUMA_PRG { version SUMA_VER { int suma (sumandos) = 1; } = 0 x 20000001;

Creación de una aplicación usando XDR 2. Generación de stubs y plantillas mediante rpcgen.

Creación de una aplicación usando XDR 2. Generación de stubs y plantillas mediante rpcgen. Ej. # rpcgen -a suma. x Archivos generados: • Makefile. suma : Makefile necesario para compilar todos los archivos • suma_xdr. c : funciones para el empaquetado de tipos de datos • suma. h : definición de prototipos de funciones • suma_server. c : Cuerpo de las funciones publicadas • suma_svc. c : Ejemplo de servidor (registro y llamado de funciones) …* • suma_client. c : Ejemplo de un cliente (conecta con cliente, llama función y cierra conexión) …* • suma_clnt. c : Funciones de traducción que necesitan menos parámetros

Creación de una aplicación usando XDR 3. Llenado del cuerpo de las funciones. (suma_server.

Creación de una aplicación usando XDR 3. Llenado del cuerpo de las funciones. (suma_server. c) Ej. # nano suma_server. c /* * This is sample code generated by rpcgen. * These are only templates and you can use them * as a guideline for developing your own functions. */ #include "suma. h" int * suma_1_svc(sumandos *argp, struct svc_req *rqstp) { static int result; /* * insert server code here */ result=argp->sumando 1 + argp->sumando 2; return &result; }

Creación de una aplicación usando XDR 4. Pasar los parámetros desde el cliente. (suma_client.

Creación de una aplicación usando XDR 4. Pasar los parámetros desde el cliente. (suma_client. c) Ej. # nano suma_client. c /* * This is sample code generated by rpcgen. * These are only templates and you can use them * as a guideline for developing your own functions. */ #include "suma. h" void suma_prg_1(char *host) { CLIENT *clnt; int *result_1; sumandos suma_1_arg; #ifndef #endif DEBUG clnt = clnt_create (host, SUMA_PRG, SUMA_VER, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } /* DEBUG */

Creación de una aplicación usando XDR 4. Pasar los parámetros desde el cliente. (suma_client.

Creación de una aplicación usando XDR 4. Pasar los parámetros desde el cliente. (suma_client. c) Ej. # nano suma_client. c #ifndef #endif DEBUG clnt = clnt_create (host, SUMA_PRG, SUMA_VER, "udp"); if (clnt == NULL) { clnt_pcreateerror (host); exit (1); } /* DEBUG */ suma_1_arg. sumando 1=1; suma_1_arg. sumando 2=2; result_1 = suma_1(&suma_1_arg, clnt); if (result_1 == (int *) NULL) { clnt_perror (clnt, "call failed"); } #ifndef #endif } printf ("La suma de %d + %d es %dn", suma_1_arg. sumando 1, suma_1_arg. sumando 2, *result_1); /* Codigo añadido por programador */ DEBUG clnt_destroy (clnt); /* DEBUG */

Creación de una aplicación usando XDR 5. Compilar y generar ejecutables Ej. # make

Creación de una aplicación usando XDR 5. Compilar y generar ejecutables Ej. # make –f Makefile. suma Archivos generados: • suma_server • suma_client Ej. # sudo. /suma_server #. /suma_client 127. 0. 0. 1