Escolar Documentos
Profissional Documentos
Cultura Documentos
- Socket de red: Se trata de un extremo interno a través del cual enviar o recibir datos
dentro de un nodo en una red de computadoras. Un proceso puede referirse a un socket
utilizando un descriptor de socket. Primero, un proceso solicita que se cree un socket, y
se devuelve un descriptor de socket tal que el proceso pueda identificarlo. Entonces, el
proceso pasa el descriptor del socket a la cola del protocolo cuando desea enviar o
recibir datos utilizando este socket. Existen varios tipos de sockets, que se detallan a
continuación, y su uso durante la práctica se discutirá en la solución que se ha
propuesto.
- Datagram sockets: También conocidos como sockets sin conexión; utilizan el protocolo
UDP.
2. Objetivo
Aclarar conceptos sobre las características y posibilidades que tienen los protocolos de
comunicación entre procesos remotos y una arquitectura en la que el protocolo de cada nivel
permite al usuario servicios adicionales a los de su bloque funcional. Se utilizan los servicios del
nivel de transporte de TCP/IP, programando entidades funcionales basadas en sockets.
3. Resumen
Se plantea la implementación de transferencia de archivos de texto ASCII entre dos procesos
de usuario en máquinas diferentes de forma remota. Ambos procesos han de hacer uso de
funciones de interfaz con las entidades de nivel inferior, que ejecutan un protocolo que
proporciona los servicios de comunicación necesarios.
Nuevamente, se tendrían cuatro procesos, esta vez repartidos en dos máquinas diferentes,
un proceso de usuario y uno de entidad en cada una de ellas.
Las entidades forman parte de la arquitectura de red, mientras que los usuarios son externos
a la arquitectura y podrían utilizar diferentes aplicaciones de usuario (en nuestro caso, eco y
ftp). Es por ello por lo que las entidades deberán realizar las tareas más generales, enfocadas
hacia la comunicación entre equipos, de forma que sean útiles para el funcionamiento con otras
aplicaciones y usuarios. Por esta misma razón, los usuarios deberán aportar la información a las
entidades requerida al formato con el que funciona la entidad.
La comunicación entre estos cuatro procesos será de forma que estén asociados dos a dos:
Usuario 1 y Entidad A conforman al cliente, mientras que Usuario 2 y Entidad B conformarán al
servidor. El mecanismo IPC que comunica a los usuarios y entidades entre sí, es decir el interfaz
de este nivel de la arquitectura es una cola de mensajes, mientras que entre entidades se
comunicarán a través de sockets locales, dado que ambos equipos se encuentran en la misma
subred, estableciendo la comunicación a través del protocolo UDP, de modo que será necesario
introducir el puerto en la cabecera del mensaje. La entidad del equipo servidor, B, abrirá el
datagram socket y quedará a la espera de la conexión de una máquina cliente (entidad A).
Es interesante tener en cuenta, que al iniciar el usuario1, se elige la aplicación con la que
va a funcionar durante la ejecución y por lo tanto la forma de proceder en la comunicación
variará. No obstante, durante la comunicación se pueden definir unos procedimientos
generales:
Aunque el concepto es sencillo, la comunicación entre los usuarios no es directa, sino que
debe tratarse a través de niveles inferiores en la arquitectura de red. En este caso, en primer
lugar, se pasará el mensaje del usuario origen a la entidad con la que se comunique mediante el
interfaz, luego las entidades se comunicarán utilizando el nivel de comunicación y tras ello la
entidad receptora lo pasará al usuario destino utilizando el interfaz del nivel. Tras recibirlo, si es
el usuario 2, deberá devolver el mensaje de una forma similar, pero en sentido inverso.
Este tipo de aplicaciones son de utilidad para comprobar la correcta comunicación entre
equipos ya que en ambos usuarios se obtendrá por pantalla la misma cadena de caracteres.
A continuación, se verán los comandos que puede gestionar este modo de comunicación:
4.1.4.1. DIR
Se trata de un comando homólogo a la instrucción ‘ls’ en un sistema operativo UNIX. Cuando
se invoca se muestran todos los archivos y directorios contenidos dentro de la ruta actual. No
se contempla un control de este comando puesto que si la ruta especificada se encuentra vacía
no se devuelve ningún nombre de archivo.
4.1.4.3. GET
Este comando se emplea para realizar la transferencia de un fichero del servidor al cliente.
Por limitaciones de la aplicación solo se pueden transferir ficheros ASCII en el sentido servidor-
> cliente, siempre y cuando no exista ningún fichero en el directorio con ese mismo nombre. En
cuyo caso se abortará la transferencia, pues no queremos perder información propia.
4.1.4.4. QUIT
Este comando se emplea para romper la comunicación y finalizar los mecanismos de
comunicación existentes del usuario 1 con los demás procesos. No se tiene ningún tipo de
confirmación de que se haya finalizado la comunicación, pero al finalizar utilizando señales del
equipo se da por hecho que el tratamiento es correcto.
Realmente, el interfaz nos especifica la información que debe transmitirse entre usuario y
entidad, así como la estructuración de esta información y tamaño del mensaje. Atendiendo a las
diferentes etapas que se suceden podemos distinguir entre unos campos fijos en el interfaz y
unos campos variables:
- Campos fijos: como campos fijos en la comunicación nos encontramos con que en todo
mensaje que se inicie o tenga destino en un usuario debe emitir el PID del usuario
origen, PID del usuario destino, longitud de la cadena que se desea transmitir, son la
cabecera de los mensajes entre usuarios y entidades.
- Campos dependientes de la longitud del mensaje: la longitud del mensaje es crucial
para el interfaz ya que si los datos que se desean transmitir tienen una longitud
suficiente como para poder ser enviados a través de la cola junto con los parámetros
fijos de la cabecera se enviarán con ella. En caso de ser demasiado grandes para
enviarlos de este modo, se deberá dividir el envío, enviando en el primer mensaje la
cadena de datos vacía y posteriormente se envían mensajes íntegramente de datos.
- Campos dependientes de la comunicación: a esta clasificación se corresponden
aquellos parámetros que se añaden en ciertas ocasiones. Estos son:
o Mensaje de usuario 1 a entidad A: se debe añadir además de los elementos fijos,
debe indicar los parámetros de inicialización: si se ejecuta eco o ftp, ipc o
sockets, protocolo y el puerto de comunicación (novedad de comunicación con
sockets).
o Mensaje de entidad B a usuario 2: en este campo se añade, además de la parte
fija de la cabecera, la aplicación que solicita servicios (eco o ftp).
Si el tamaño de los datos que deseamos transmitir es demasiado grande para nuestro
tamaño máximo de cola menos el de las cabeceras, será necesario dividir el mensaje, el
mecanismo es el siguiente:
1. Creación de la cola de mensajes: las entidades serán las encargadas de crear el canal de
comunicación entre la propia entidad y el usuario colindante. Para una transmisión
correcta se añadirá un identificador a la cola creada ya que no será extraño contar con
más de un cliente transmitiendo información de manera simultánea.
2. Abrir la cola de mensajes: con las colas tipo POSIX que emplearemos en la
implementación no será necesario abrir las colas en las entidades, ya que al crearse se
consideran preparadas para el envío.
3. Recepción de mensajes: los mensajes enviados por parte del usuario llegan a la cola de
mensajes que funcionará como una pila FIFO, no obstante, como la entidad se
encontrará en un proceso de espera del mensaje raramente se acumularán mensajes ya
que al recibir la información empezará a procesarla.
4. Enviar mensajes: la entidad enviará hacía el usuario los mensajes recibidos por parte de
otra entidad. Tras recibir el mensaje de la entidad le da el formato correcto y envía los
datos por la cola.
5. Control de las longitudes de mensaje: tanto en envío como recepción de mensajes, la
entidad debe controlar que lo que se envía o recibe tiene un tamaño correcto o
demasiado grande para el tamaño permitido por el interfaz. En caso de querer recibir
un mensaje mayor que el tamaño máximo se debe conocer la longitud para saber en
cuantos bloques debe enviarse.
6. Cerrar comunicación: una vez se haya finalizado la comunicación y ya no se vaya a
utilizar más, se cerrará el canal de comunicación con el usuario.
7. Borrar la cola de mensajes: para evitar ocupar demasiados recursos del sistema con
colas de mensaje que no tienen utilidad, será necesario eliminarlas una vez se ha
cerrado el canal.
PAT DEST ORG PROT E/FTP IPC/S TYPE CNTRD FRAG LEN DATA
8bit 16bit 16bit 1bit 1bit 4bit 2bit 32bit 32bit 16bit 2032B
Los protocolos se definirán por niveles, comunicando entidades en un mismo nivel, siendo
transparentes para el resto de los niveles. Asimismo, también es ajena a los protocolos la
información que contiene el mensaje que tratan.
Este método de funcionamiento permite a los usuarios tener la sensación de entablar una
comunicación directa con otros usuarios.
En esta práctica se definirán dos protocolos que se implementarán en ambas entidades:
4.5.1. Protocolo 1
Todos los mensajes enviados a través de este protocolo son del tipo 0 (datos).
Otro caso de transmisión fallida podría ser cuando enviamos un mensaje y no recibimos
ningún tipo de respuesta al cabo de un tiempo. Esto puede darse a múltiples causas relacionadas
con errores en el canal de comunicación o bien que la entidad destino se haya desconectado.
Las entidades deben estar preparadas para tratar este tipo de fallos ya que, de no hacerlo, se
quedarán bloqueadas esperando un mensaje de confirmación que nunca llegara. Uno de los
métodos más efectivos para detectar estos errores es el empleo de un “perro guardián” o
“Watchdog”, se trata de un proceso que comprueba iterativamente que el usuario destino se
encuentra activo, en caso de no detectarlo se inicializa una cuenta atrás y en caso de no detectar
signo alguno de que el otro proceso está activo, provoca el final de la comunicación cerrando el
canal.
if(protocolo)
{
p_e_t_i=p_e_t_i | 0B10000000;
}
if(eco_ftp)
{
p_e_t_i=p_e_t_i | 0B01000000;
}
if(ipc_mod=='m')
{
p_e_t_i=p_e_t_i | 0B00010000;
}
else if(ipc_mod=='s')
{
p_e_t_i=p_e_t_i | 0B00111100;
}
if(tipo==1)
{
p_e_t_i=p_e_t_i | 0B00000001;
}
else if(tipo==2)
{
p_e_t_i=p_e_t_i | 0B00000010;
}
return p_e_t_i;
}
o Protocolo 2: Con este protocolo una vez comprobadas estas cabeceras se envía
un mensaje tipo 1 o tipo 2 a la entidad A indicando que la recepción se ha
producido, y tras ello se continua el proceso para enviar la información al
usuario 2.
Figura 5.Gestión de recepción con protocolo 2
El tamaño del mensaje se envía en un primer envío junto a los campos de destino y origen.
En primer lugar, debemos decir que esta entidad es la encargada de generar la cola de
mensajes que la comunica con el usuario 1 y del mismo modo debe crear un socket que se
conectará a la entidad B.
Al igual que la otra entidad, se encuentra programada con un bucle infinito. En este caso
lo primero que se comprueba es la recepción de mensajes por parte del usuario 1, esperando
hasta que llegue un mensaje y comenzar la comunicación con la otra entidad. Las etapas podrían
ser las siguientes:
Una vez escrito el mensaje, dependiendo del protocolo que se esté utilizando se espera un
mensaje de confirmación (protocolo 2) o bien se espera directamente la respuesta (protocolo
1). Un aspecto que no se ha mostrado aún es el del cálculo del número de fragmentos del
mensaje. Para ello se muestra a continuación el procedimiento a seguir una vez se ha recibido
de la cola el campo de datos.
Una vez la entidad B procesa la petición realizada nos emite una respuesta que
almacenamos. Una vez realizadas las comprobaciones oportunas y emitido el mensaje de
confirmación en caso de ser protocolo 2. Se procede a enviar la información al usuario 1.
Una vez contemplados los argumentos de entrada, se pasa a explicar la programación del
usuario. Se han programado las dos aplicaciones (eco y ftp) aunque la segunda de ellas es menos
compacta debido a su mayor complicación.
En primer lugar, hay que indicar que se han reservado dos cadenas de caracteres para cerrar
la aplicación ECO o cerrar todos procesos. De esta manera encontramos una forma de salir de
la aplicación, ya que de no tener estos mecanismos no se podría salir de una forma directa de la
aplicación.
Recepción:
La aplicación eco, cuenta con dos cadenas clave que se utilizan para cerrar su propia
ejecución (-cerrarECO-), y otra para finalizar todas las aplicaciones, eliminando también los
mecanismos IPC (-salir-). Para esta última funcionalidad se emplean señales definidas por el
usuario, las envía usuario1 y son tratadas en el resto de los programas en ejecución.
La aplicación ftp por su parte cuenta con 4 comandos diferentes, luego lo primero que
hace al iniciarse la aplicación es preguntar el comando deseado, en caso de no ser uno de los
comandos contemplados solicita de nuevo el comando diciendo que el solicitado no existe.
Una vez introducido el comando y con él, la acción que se pretende conseguir, se delega
la construcción de la cadena de datos en un switch donde dependiendo del comando deseado
se crea la cadena de datos que se enviará a la entidad A. En la recepción se muestra el resultado
obtenido.
5.4. Usuario 2
El usuario 2 tiene una única aplicación como servidor, inicializándose sin ningún tipo de
comando adicional. El usuario 2 parte de la espera de un mensaje por parte de la cola de
mensajes de la entidad B. Como anteriormente se explicó se le pasan varios campos, pero el más
relevante y el que primero comprueba la aplicación es si el servicio solicitado es eco o ftp.
- Procesamiento de petición eco: en caso de haberse solicitado una petición eco, lo único
que realiza el usuario 2 es mostrar el mensaje en pantalla, cambiar el origen y el destino
y reenviarlo.
- Procesamiento petición ftp: este caso es bastante más crítico y la complejidad del código
es muy superior al caso anterior. Hay que detectar el comando solicitado y según el
realizar una serie de acciones para conseguir y devolver la información solicitada,
gestionando cada comando por separado. A continuación se muestra como se procede:
Entidad A Entidad B
Usuario 2
Usuario 1
Partiendo de los resultados de la figura 30, observamos la existencia del directorio dire,
mediante la ejecución del comando cd ./dire , en la figura 31 y remarcado podemos observar
como al usuario 1 acaba llegando un mensaje de confirmación de que se ha cambiado el
directorio correctamente
Por último, se muestra el resultado del comando quit, con él se consigue cerrar las aplicaciones
de usuario de servidor y cliente, tal y como se muestra en la figura 34.