ELO-330: Programación de Sistemas
Tarea 3: Emunador de Variaciones de Retardo y Pérdidas en Transferencias UDP

Objetivos: ejercitar uso de hebras, mecanismos de exclusión mutua y transferencias UDP.

Nombres: erp_upd : Emulador de Retardo y Pérdida de paquetes en transferencias UDP.

Sintaxis: erp_udp retardo_promedio variación_retardo porcentaje_pérdida puerto_local [host_remoto] puerto_remoto

Descripción
   En ocasiones nos vemos enfrentados a la necesidad de correr una aplicación que establece conexiones a través de Internet y nos interesaría averiguar cuál sería su comportamiento si las transferencias extremo a extremo poseen retardo y pérdidas de paquetes mayores a las de una red local. Por ejemplo, cuando deseamos controlar un robot remoto a través de Internet. Generalmente los desarrollos se hacen en un laboratorio donde la red de área local ofrece 100Mbps de tasas en nivel físico. Surge la pregunta ¿Cómo podemos correr un proyecto haciéndolo creer que tiene mayor retardo y mayor tasa de pérdida de paquetes?.
 A través de esta tarea usted creará una aplicación proxy para aumentar el retardo y las pérdidas en transferencias UDP. La idea es poner un proceso intermedio entre cliente y servidor y luego incorporar retardo y una tasa de pérdida según valores a elección, ver Figura 1.

Figura 1: Intercepción de tráfico y emulación de retardo y pérdida de paquetes

  puerto corresponde al puerto local donde erp_upd espera por clientes UDP. Tan pronto llega un cliente a este puerto, erp_udp lo almacena en una cola FIFO y lo reenvía al puerto_remoto del host_remoto indicado luego de un retardo variable o eventualmente descarta el paquete para emular pérdida. Si se omite el host_remoto se entiende que es la máquina local (localhost).
  erp_udp maneja hebras en cada sentido destinadas a controlar el tiempo de residencia en cola y la posibilidad de péridada del paquete. El manejo de cada sentido del tráfico (subida o bajada) se puede manejar en forma equivalente.

 La figura 2 muestra una forma de manejar el flujo de datos.  Por simplicidad en esta tarea los argumentos ingresados al programa deben ser usados en ambas direcciones de flujo de datos.
 La figura 3 muestra una forma sugerida para modelar el retardo variable de los paquetes. El tiempo de re-envío de un paquete depende de su tiempo de llegada, del tiempo de salida del anterior.
tri = Random entre {el máximo entre (tai+retardo_promedio-variación_retardo) y tri-1} y {tai+ retardo_promedio + variación_retardo}
Esta expresión permite cumplir orden FIFO de los paquetes, puesto que el límite inferior para el tiempo de re-envío será a lo más igual (en realidad inmediatamente después) al tiempo de re-envío del paquete anterior.

Figura 2: Modelo para emular retardo y pérdida de paquetes en un sentido

Figura 3: Modelo para controlar tasa y retardo en una dirección

Esta tarea sigue las normas generales del ramo para evaluación de tareas y procedimiento de entrega.

Ayuda:
- Revise las mejores soluciones para la tarea similar del año 2013.
- Para probar su tarea, considere usar el servidor echo visto en clases.
- Otra forma de probar su aplicación es usando la aplicación vlc (videolan), la cual permite enviar y reproducir video.
- Haga su tarea de a poco y con tiempo. Con gusto atenderé todas sus preguntas en especial en clases y horas de atención.