12 de febrero de 2013

Protocolo

Redes de Telecomunicaciones
Tarea 2

La tarea para esta semana fue diseñar, implementar, comprobar experimentalmente y documentar un protocolo simple a nivel de aplicación.

Para esto utilice el lenguaje de programación Python, usando algunos paquetes como thread y socket, este último para crear sockets UDP, el cual provee de métodos para enviar y recibir bytes.

EL servidor implementado puede tener varios clientes al mismo tiempo, y por usar sockets UDP, no se establece una sesión entre cliente y servidor como sería con TCP. Lo que sucede con sockets UDP, es que el cliente primeramente envía datos, y cuando llegan al servidor, este puede determinar la dirección de donde vinieron esos datos para poder dar retroalimentación al cliente enviando otro conjunto de datos.

Propósito de su protocolo

El protocolo implementado es muy simple, ya que lo que se hace es el envío y recepción de "paquetes" con las direcciones IP junto con el puerto utilizado por el cliente y el servidor, así como de datos a ser procesados.

El cliente envía una notificación "READY" cuando esta listo para hacer un cálculo, en este caso evaluar si un número es primo o no, y el servidor estará enviando como dato en el paquete un número de 6 dígitos a ser evaluado.

Veamos como esta distribuida la cabecera del paquete y sus datos.

TIPO HOST ORIGEN HOST DESTINO PUERTO ORIGEN PUERTO DESTINO RESPUESTA DATO
0 | 1 0.0.0.0 0.0.0.0 00000 00000 0 | 1 000000

Donde:

TIPO, puede ser 0 o 1, (0 - servidor, 1 - cliente), para corroborar que el paquete viene desde un servidor, o si el paquete es de un cliente que esta enviando información al servidor.

HOST ORIGEN, la IP desde donde se envían los datos.

HOST DESTINO, la IP a donde serán enviados los datos.

PUERTO ORIGEN, el puerto abierto desde donde se envían los datos.

PUERTO DESTINO, el puerto a donde se envían los datos.

RESPUESTA, es 0 cuando el paquete es enviado desde el servidor o cuando el número evaluado resulto no ser primo y es 1 cuando el número evaluado por el cliente resulto ser primo.

DATO, es un número entero de 6 dígitos.

Un ejemplo de paquete sería el siguiente:

TIPO HOST ORIGEN HOST DESTINO PUERTO ORIGEN PUERTO DESTINO RESPUESTA DATO
1 127.0.0.1 127.0.0.1 9999 34872 0 567822

Lo que podemos resumir como un paquete enviado desde el cliente, el cual evaluó el número 567822 para conocer si era primo, pero el resultado fue negativo, por lo tanto el campo de RESPUESTA esta llenado con un 0.

Código


Son dos partes del programa, el servidor y el cliente. No requieren parámetros adicionales. Por ahora al ejecutar el cliente entra en un ciclo infinito en el cual en cada iteración se pide un número al servidor para poder evaluarlo.



Ejecución


Para probar si el código hacia lo que debería ejecute en varias terminales los códigos. En la terminal más amplia es donde se ejecuto el servidor y en las otras cuatro más pequeñas los clientes.


Podemos notar como en la ventana del servidor se están imprimiendo todos los paquetes que van llegando una vez parseados según se indico en el protocolo, y vemos que algunos de los paquetes en el campo de RESPUESTA tienen un "1" que indica que el número evaluado si fue un número primo.


Lo interesante de la siguiente captura es que en tres de las cuatro terminales donde se ejecutaban los clientes se interrumpió la ejecución para detenerlos, y solo un cliente quedo activo, y el servidor no detiene la ejecución aún y si ya no quedan clientes.


Vídeo demostración



Referencias:
Socket programming
UDP communication

1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.