REMOTE PROCEDURE CALL

Evolución del modelo C/S.

La principal desventaja del C/S es que las comunicaciones giran con base en esquemas de Entrada/Salida (send/receive).

El objetivo de un S.O.D respecto al I/O es hacerlo ver como centralizado.

La idea con RPC es hacer llamados a procedimientos localizados en otras maquinas.

Funcionamiento:
 

Problemas: Ejecución de una llamada local:

por ejemplo la llamada invocada desde el main:
 
    c = read(fd, buf, nbytes)
 

Paso de parámetros: Por valor copia el contenido en el stack, para el procedimiento tiene un comportamiento de var. local
Por Referencia se pasa es la dirección.

En C, los enteros, escalares y otros se pasan por valor; los arreglos se pasan por Referencia.
 

La idea con RPC es hacer ver a una llamada remota como si fuera local, por esto la invocación debe ser transparente para el que la utiliza.

La transparencia en RPC se logra agregando un Stub o proxy tanto al cliente como al servidor.

Los pasos que ejecuta un Cliente para invocar un procedimiento remoto en un Servidor son los siguientes:

  1. El Cliente llama un procedimiento local llamado el Client Stub (proxy).
  2. El Client Stub empaqueta (marshalling) los parámetros, construye un mensaje y lo envia al kernel.
  3. El kernel local lo envia al kernel donde se encuentra el Server Stub
  4. El kernel remoto envía el mensaje al Server Stub.
  5. El Server Stub desempaqueta (unmarshalling) los parámetros, identifica el procedimiento y lo ejecuta.
  6. El Server Stub recibe el resultado del servidor local
  7. El Server Stub empaqueta (marshalling) la respuesta, construye un mensaje y lo envia al Kernel.
  8. El Kernel lo envia de nuevo al kernel original.
  9. El Kernel local envía el mensaje al Client Stub.
  10. Client Stub desempaqueta (marshalling) el resultado y lo retorna de la misma forma que un procedimiento local.

Paso de parámetros en RPC:

Debido a problemas de alfabetos (ASCII/ABCDIC), representación de enteros (complemento a uno o a dos), punto flotante, ordenamiento de bytes (Little Endian y Big Endian), se hace necesario establecer una forma canonica de representar los distintos tipos de datos.

Se ejecuta un proceso conocido como Marshalling/UnMarshalling, el cual consiste el transformar los tipos de datos locales de una maquina en un formato estándar para ser transmitidos por la red.

Los tipos básicos como escalares entre otros se pasan por valor, cuando son arreglos tanto en los clientes como servidores se realiza una copia local, se manipulan y se envian por la red.

En RPC no hay paso de punteros.

Además de los parámetros normales de una función, se requiere transferir otra información como: Nombre del procedimiento, versión, etc.
 

Localización de Servidores:

Como un cliente localiza un servidor?
1) podría ser que el cliente tuviera la dir. del servidor. Esto es muy ineficiente y estático.
2) realizar un proceso dinámico de asociación o binding con el servidor.

Partimos de una especificación formal del servidor:

La especificación formal es muy util para los generadores de código.

Cuando un servidor comienza a ejecutar envía un mensaje a un programa (local o remoto) llamado el "binder" o servidor de registro.

El cliente conoce la dirección del binder a quien interroga por la existencia o no de los servidores que desea contactar.

Este binder se conoce como un Localizador de Recursos en la red, un broker o un "corredor" de procedimientos.


ESTÁNDAR RPC

El protocolo RPC y XDR fueron originalmente desarrollados por SUN.

Hoy son ampliamente difundidos mediante una las aplicaciones más importantes conocida como Network File System (NFS). Se considera un estándar de facto.

RPC ha tenido evolución hacia DCE (Distributed Computing Environtment) desarrollado por OSF.

Debido a que el desarrollar en este ambiente implica adicionar a mi programa un conjunto de llamadas de RPC (Remote Procedure Call) y XDR (eXternal Data Representation), se requería mucho conocimiento de este, muchas causas de errores, mucha inversión en tiempo dedicado a problemas de comunicaciones a parte del problema en si a resolver, el mantenimiento de una aplicación tambien es traumatica. Por estas razones se decide crear un PreCompilador de RPC, que nos genera automaticamente el código fijo y relacionado con la parte de comunicaciones. Obviamente un procompilador implica la especificación formal de la utilización de RPC en un programa.

Un precompilador muy popular es el RPCGEN.

RPCGEN utiliza un lenjuaje de especificación de procedimientos conocido como RPCL.

Los archivos de especificación son *.x

Los tipos de definciones que permite hacer RPCL son:

RPCGEN genera código en C.

FUNCIONAMIENTO DE RPC
 

En toda maquina que ofrezca servicios en RPC, debe tener un proceso llamado "Portmapper" el cual es responsable de mapear procedimientos a puertos UDP.

El portmapper utiliza en si mismo un puerto bien conocido (111) por el cual cualquier cliente puede contactarlo.

Pasos para llamar un cliente al servidor:

  1. Cuando un servidor (daemon) establece una dirección de escucha de requerimientos, registra los puertos al portmapper, tambien registra los programas RPC y números de versiones, estos números pueden ser arbitrarios.
  2. Antes de que un cliente pueda hacer una llamada remota, se consulta  el portmapper del servidor que identifica el número de puerto que por el cual recibe los mensajes RPC.
  3. El cliente y el servidor establecen un canal a través del cual se comunican para ejecutar llamadas a procedimientos remotos.

DESARROLLO DE APLICACIONES EN RPC
#include <rpc/rpc.h>
#include <rpc/xdr.h>

EN EL SERVIDOR:

Se utilizan dos llamadas:

Comunicación por defecto en UDP/IP.

int registerrpc( u_long prognum, u_long versnum, u_long procnum, char *(*procname)(), xdrproc_t inproc, xdrproc_t outproc).

void svc_run()

EN EL CLIENTE:

Se utiliza:

int callrpc(char *host, u_long prognum, u_long versnum, u_long procnum, char *in, xdrproc_t inproc, char *out, xdrproc_t outproc)


NETWORK FILE SYSTEM

Sistema de Archivos en Red

Es una facilidad que permite compartir archivos a través de un ambiente heterogeneo de maquinas. S.O., redes, etc.

Para un usuario que este utilizando NFS, es totalmente transparente en que parte de la red están almacenados los archivos.

Para manipular transparentemente los archivo, se utilizan los mismos comandos para manipulación de archivos locales (UNIX: ls, cp, mv, chmod, etc).

Arquitectura NFS:

Desde el punto de vista del modelo OSI, tiene la siguiente arquitectura:

        OSI            NFS

Desde el punto de vista del S.O. que provee el servicio de NFS tenemos 3 entidades: * Interfaz S.O.: llamadas al sistema read/write

* VFS: Provee un Wrapper para que se comporte como un F.S. unix tradicional.

Un sistema de archivos tradicional contiene archivos y directorios, cada uno corresponde  a un inodo.
Cada inodo es único en un F.S. pero no en la red, por esto se diseño VFS el cual contiene vnode.

* La interfaz NFS esta representada por el intercambio de información por la red entre un cliente y un servidor NFS, mediante los protocolos RPC y XDR.
 
 

Transparencia en NFS:

La transparencia que maneja NFS se da respecto a: tipo de F.S, localización del F.S., S.O. (RPC), formato de datos (XDR), tipo de red (TCP/IP y otras).

Protocolo NFS y mount:

NFS nunca interpreta pathnames, en vez de esto utiliza un descriptor de archivo (File Handle) para cualquier referencia. Si es un directorio gana acceso a todos los archivos hacia abajo.

NFS es un protocolo STATELESS.

Mounting:

Es el proceso de montar un sistema de archivos por un cliente.
En Unix, siempre que se desea utilizar una partición de un disco duro, este debe se "montado" en el root "/".

El proceso que se sigue en NFS es el siguiente:

1) En el cliente: Se envía en pathname remoto.
2) En el servidor: si el pathname es válido y tiene los permisos adecuados, se retorna un descriptor de archivo. En este descriptor se envia adicionalmente: tipo de F.S., tipo de disco, # inodo, aspectos de seguridad.

Muchos clientes montan automaticamente un F.S. remotos al momento de booting.

Muchas implementaciones implementan un concepto llamado: Automounting. Esto permite a un conjunto de directorios remotos estar asociados con directorios local, pero que no son montados al momento del boot. En vez de esto, la primera vez que se tenga referencia a un archivo de estos directorios, se envia un mensaje a todos los servidores y el primero que contesta monta este directorio para el cliente.

Ventajas del automounting:

Desventajas del automounting: La otra parte del protocolo NFS se refiere a la manipulación de los archivos.

Se tiene todas las llamadas al sistema para manipulación de archivos excepto open y close debido a que es stateless.

La ventaja de la característica stateless es que el servidor no tiene que almacenar información de los archivos abiertos.

Dado que el sistema de archivos de Unix y otros tipos de F.S. se ofrece las llamadas open y close, simplemente por compatibilidad.

Si no hay estado, como se implementan las operaciones de bloqueo sobre archivos (locking)? La respuesta es que NFS ofrece procedimientos adicionales para proveer este servicio.

Respecto a la seguridad, es de anotar que NFS utiliza el mismo esquema de seguridad de UNIX, es decir, dueño, grupo y todos; y rwx.

NFS no encripta la información que transmite
 



 
CONFIGURACION DE NFS
 

Cada Sistema operacional tiene una forma diferente de configurar el servidor y la manera que un cliente lo monta.

En el caso de UNIX, que es el que más ampliamente a difundido NFS, se tiene un conjunto de pasos mas o menos similares entre marcas diferentes de sistemas Unix, en este caso se presentará para LINUX:

En la maquina Unix que quiere ofrecer un F.S. o directorio a un grupo de maquinas clientes, se especifican en el archivo /etc/exports, el conjunto de F.S. o directorios que dicho servidor ofrece.

En este archivo tambien se puede especificar aspectos de seguridad como: maquinas (por dir ip, nombre, domino, metacaracteres, etc), usuarios, lectura y/o escritura, entre otros aspectos:

Ej, archivo /etc/exports:

    /usr centauro.eafit.edu.co(ro)
    /usr/local/share *.dis.eafit.edu.co(ro)
    /usuarios *.dis.eafit.edu.co(rw)

En el cliente, solo el usuario root puede montar un F.S. remoto, ejecutando el siguiente comando:

    $ mount agamenon:/usuarios /usuarios

Si se quiere que automaticamente monte un F.S. remoto cuando realice el boot, se debe agregar unas entradas al archivo: /etc/fstab, así:
 

Otras consideraciones:

Edwin Montoya, DIS, LabTel. emontoya@eafit.edu.co