ELO-330: Programación de Sistemas
Tarea 3: Emunador de variaciones de "Best Effort" en Conexiones TCP

Objetivos: ejercitar uso de hebras, mecanismos de exclusión mutua y conexiones TCP.

Nombres: ert_tcp : Emulador de Retardo y Tasa en conexiones TCP.

Sintaxis: ert_tcp 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 la conexión extremo a extremo posee poca tasa efectiva de transferencia y posiblemente además latencia. 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 menos "ancho de banda" o que tiene mayor retardo? Una opción para limitar la tasa de transferencia es usar un HUB o switch antiguo de 10 Mbps y así obligar a uno de los computadores a correr más lento. El principal problema es que así sólo se pueden probar enlaces de 10 Mbps (que es mucho para muchas conexiones en Internet).  La opción previa no permite emular grandes retardos en la red.
 A través de esta tarea usted creará una aplicación proxy para limitar la tasa máxima de transferencia y aumentar el retardo de conexiones TCP. La idea es poner un proceso intermedio en la conexión y luego ajustar las tasas en cada sentido y retardo a valores a elección, ver Figura 1.

Figura 1: Intercepción de tráfico y cambio de parámetros en un sentido

  puerto corresponde al puerto local donde ert_tcp se espera por conexiones TCP. Tan pronto llegua un cliente a este puerto, ert_tcp abre una conexión hacia el host_remoto en el puerto_remoto. Si se omite el host_remoto se entiende que es la máquina local (localhost).
  En lugar de pasar los paquetes libremente de un lado a otro y en ambas direcciones, ert_tcp maneja hebras en cada sentido destinadas a controlar el tiempo residencia y tasa de salida. El manejo de cada sentido del tráfico (subida o bajada) se puede manejar en forma equivalente. ert_tcp además escucha a un menú de consola para cambiar el retardo o la tasa. Para ello el programa presenta un menú:
1)  Nueva tasa en [Bps] (Bytes por segundo)
2)  Nuevo retardo en [ms]
Su opción es:

 Las figuras 2 y 3 muestran una forma de manejar el flujo de datos. La figura 2 permite controlar la tasa de salida mientras que la figura 3 además incluye el manejo de un retardo adicional. Para la tasa use, en principio, un tamaño de balde de 20KB (notar que el balde es sólo un entero, no memoria). Este valor representa la cantidad máxima de bytes a enviar en forma consecutiva (ráfaga). Usaremos un retardo mínimo fijo; es decir, el retardo introducido por ert_tcp debe ser al menos de ese valor. Si para cumplir la limitación de tasa los paquetes esperar más tiempo, no es problema. El retardo es fijo.
  ert_tcp usa leaky bucket y un buffer circular para limitar el tráfico de salida. La limitación de tráfico es de igual valor en ambas direcciones, luego usted podría usar una misma hebra para incorporar "fichas" o crédito en el balde de cada sentido de flujo (subida, bajada).

Figura 2: Modelo para controlar tasa una dirección del flujo

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 2009.
- Para implementar Leaky Bucket eficientemente estudie el uso de Variables de Condición y el ejemplo: leakyBucket_with_sleep.c. En lugar de sleep puede usar la función usleep para agregar crédito en forma más uniforme (menos discreta). 
- Para probar su tarea, considere usar un navegador configurado para trabajar con un proxy de salida. En particular considerar el uso de  SOCKS. En lugar de apuntar al servidor SOCKS usted lo hace apuntar a ert_tcp y éste lo hace apuntar al verdadero servidor SOCKS. Así todo el tráfico web pasará por su control de tráfico y retardo. Usted podrá limitar las tasa de accesos y retardo a youtube entre otros.
- 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!