2024 Lab2 - Enunciado
2024 Lab2 - Enunciado
Objetivos
● Aplicar la comunicación cliente/servidor por medio de la programación de sockets,
desde la perspectiva del servidor.
● Familiarizarse con un protocolo de aplicación diseñado en casa.
● Comprender, diseñar e implementar un programa servidor de archivos en Python.
Protocolo HFTP
Llamaremos Home-made File Transfer Protocol (HFTP) a un protocolo de transferencia de
archivos casero, creado por nosotros específicamente para este laboratorio.
HFTP es un protocolo de capa de aplicación que usa TCP como protocolo de transporte. TCP
garantiza una entrega segura, libre de errores y en orden de todas las transacciones hechas
con HFTP. Un servidor de HFTP escucha pedidos en el puerto TCP 19500.
Comandos y Respuestas
1
Ver End of Line (EOL) en https://en.wikipedia.org/wiki/Newline:
\r = CR (Carriage Return) Usado como un carácter de nueva línea en Mac OS.
\n = LF (Line Feed) Usado como un carácter de nueva línea en Unix/Mac OS X.
\r\n = CR + LF Usado como un carácter de nueva línea en Windows/DOS y varios protocolos.
Cátedra de Redes y Sistemas Distribuidos
resultado exitoso tiene código 0 y con su texto descriptivo podría ser 0 OK.
Comando: get_file_listing
Respuesta: 0 OK\r\n
archivo1.txt\r\n
archivo2.jpg\r\n
\r\n
Byte: 0 5 10 15 20 25 30 35 40
v v v v v v v v v
Archivo: !Que calor que hace hoy, pinta una birra!
Comando: get_slice archivo.txt 5 20
Respuesta: 0 OK\r\n
Y2Fsb3IgcXVlIGhhY2UgaG95LCA=\r\n4
2
Los nombres de archivos no deberán contener espacios, de lo contrario, el protocolo no puede
diferenciar si un espacio corresponde al nombre del archivo o al comienzo de un argumento.
3
Atención que de acuerdo a la codificación ASCII, algunos caracteres fuera del lenguaje Inglés
se representan con dos Bytes. En el archivo del ejemplo, de haber usado ¡ en lugar de ! al
comienzo de la frase, la respuesta hubiese sido “ calor que hace hoy,” (con espacio al principio
en lugar de al final) ya que el carácter ¡ ocupa dos bytes.
4
Esta es la codificación base64 de “calor que hace hoy, ”. El sentido de utilizar base64 es que al enviar
el archivo posiblemente binario, se codifica en una cadena ASCII.
Cátedra de Redes y Sistemas Distribuidos
Manejo de Errores
En caso de algún error, el servidor responderá con códigos de respuestas diferentes a 0, más
algún texto descriptivo a definir por el implementador. En particular:
Los errores con código iniciado en 1 son considerados fatales y derivan en el cierre de la
conexión una vez reportados por el servidor. Los errores que inician con 2 permiten continuar
con la conexión y recibir pedidos posteriores.
Tarea
Deberán diseñar e implementar un servidor de archivos en Python 3 que soporte
completamente un protocolo de transferencia de archivos HFTP. El servidor debe ser robusto
y tolerar comandos intencional o maliciosamente incorrectos.
1. Descargar el kickstarter del laboratorio desde el aula virtual. Descomprimir con: tar -
xvzf kickstart_lab2.tar.gz. El kickstarter provee una estructura para el servidor
que se deberá completar (server.py y connection.py), un archivo con las constantes
a utilizar (constants.py), el cliente HFTP funcionando y un archivo de testeo server-
tets.py para correr junto con el servidor.
2. Armar un entorno virtual de python con python 3.6 según esta nota
3. Ejecutar el laboratorio como está
4. Modificar el archivo server para que acepte conexiones y con esa conexion cree un
objeto connection, testearlo con telnet
5
A diferencia de los errores no fatales 200 y 201, este error es producto de alguna malformación crítica a
criterio del implementador. Por ejemplo, un comando malintencionado, de gran longitud, podría provocar
un DoS o disminución de performance en el server y podría ser intervenido por un error fatal de este tipo.
6
Se aplica particularmente al comando get_slice y debe generarse cuando no se cumple la condición
OFFSET + SIZE ≤ filesize.
Cátedra de Redes y Sistemas Distribuidos
5. Implementar los distintos comandos empezando por el quit, después testear cada
comando con telnet. (usar el archivo client.py para sacar ideas de cómo manejar las
conexiones)
6. Una vez implementados los comandos , probar el funcionamiento con el cliente que se
le entrega en el kickstarter (client.py)
7. Una vez que funcione el cliente ejecutar el test para probar los casos “no felices”
8. Implementar múltiples clientes utilizando hilos
9. (Punto estrella) Implementar múltiples clientes con poll (
https://stackoverflow.com/questions/27494629/how-can-i-use-poll-to-accept-multiple-
clients-tcp-server-c
https://betterprogramming.pub/how-to-poll-sockets-using-python-3e1af3b047
Preguntas
1. ¿Qué estrategias existen para poder implementar este mismo servidor pero con
capacidad de atender múltiples clientes simultáneamente? Investigue y responda
brevemente qué cambios serían necesarios en el diseño del código.
2. Pruebe ejecutar el servidor en una máquina del laboratorio, mientras utiliza el cliente
desde otra, hacia la ip de la máquina servidor. ¿Qué diferencia hay si se corre el
servidor desde la IP “localhost”, “127.0.0.1” o la ip “0.0.0.0”?
Tarea Estrella
En caso de implementar el servidor capacidad de atender múltiples clientes simultáneamente
con poll, se otorgarán puntos extras. De acuerdo al funcionamiento del mismo y la capacidad
del alumno de explicar lo realizado en la evaluación oral, se podrán dar hasta 2 puntos extras
en la 1er evaluación de la defensa de los laboratorios.
Requisitos de la entrega
● Las entregas serán a través del repositorio Git provisto por la Facultad para la Cátedra,
con fecha límite indicada en el cronograma del aula virtual.
● Junto con el código deberá entregar una presentación (tipo powerpoint) y un video de
10 +/-1 minutos. Les damos una estructura de base como idea, pero pueden
modificarla/ ampliarla.
1. Introducción al proyecto:
a. Presenta brevemente el contexto del proyecto y sus objetivos.
b. Explica la importancia de desarrollar un Protocolo de transferencia de datos.
2. Responder preguntas como:
a. ¿Cómo funciona el paradigma cliente/servidor? ¿Cómo se ve esto en la
programación con sockets?
b. ¿Cual es la diferencia entre Stream (TCP) y Datagram (UDP), desde la
perspectiva del socket?
c. ¿Qué es el protocolo FTP? ¿Para qué sirve?
d. ¿Qué es base64? ¿Para qué la usamos en el laboratorio?
e. ¿Qué pasa si queremos enviar un archivo contiene los caracteres \r\n? ¿Cómo
lo soluciona esto su código?
3. Explicar el desarrollo de las funciones principales del servidor
4. Errores y dificultades enfrentadas y cómo se resolvieron
5. Conclusiones
a. Deben agregar un apartado importante aquí mencionando la relación de este lab
con el lab anterior de APIS
● El trabajo es grupal. Todos los integrantes del grupo deberán ser capaces de explicar el
código presentado.
● No está permitido compartir código entre grupos.