   ############################################################
   #                        Tarea # 3                         #
   #                                                          #
   #         Elo330 - Programación de Sistemas                #
   #                                                          #
   #                                                          #
   #                Nombre:                     Rol:          #
   #                Iván Gordón F               2492015-1     #
   #                Alejandro Merello P         2421004-9     #
   #                                                          #
   #                                                          #
   #                    Fecha : 13 de Octubre de 2009         #
   #                                                          #
   ############################################################

Sinópsis:

            throttle_tcp <puerto_local> [host_remoto] <puerto_remoto>

Descripción:

            Este programa es una aplicación proxy para estrangular conexiones TCP. Pone un proceso 
            intermedio en la conexión a intervenir y luego permite ajustar el ancho de banda de sa-
            lida a lo que se desee. En lugar de pasar los paquetes libremente de un lado a otro y 
            en ambas direcciones, throttle_tcp instala dos hebras encargadas de enviar controlada-
            mente el tráfico de salida. Cada hebra a cargo de una dirección. Throttle_tcp usa leaky 
            bucket y un esquema de espera en la lectura para limitar el tráfico de salida. La limita-
            ción de tráfico es la misma en ambas direcciones, luego se usa una misma hebra para extr-
            aer bytes a una tasa fija de los baldes de ambas direcciones. Esta tasa y el tamaño de rá-
            faga son ingresados por teclado y se pueden cambiar en cada momento. Es decir, siempre hay
            un prompt esperando que el usuario defina otro valor para esta tasa, que representa el 
            ancho de banda permitido, y otro valor para la capacidad del balde que representa la can-
            tidad máxima de bytes a enviar en forma consecutiva (ráfaga). Throttle_tcp muestra dos 
            gráficos. Uno con las variaciones de tasa de entrada y otro con la tasa de salida (bytes 
            por segundo). Estos gráficos son refrescados cada dos segundos.
            Para una descripción más detallada de la implementación sírvase revisar el archivo adjun-
            to documentacion.pdf.


De Los Archivos Que Componen La Tarea:

            La tarea se compone de los siguientes archivos, que se
            encuentran dentro de la carpeta con el nombre
            t3_GordonMerello :

            readme.txt:             Este archivo contiene información útil acerca
                                    del uso de la tarea.

            documentacion.pdf:      Este archivo contiene informacion sobre el 
                                    diseño e implementación de la tarea.

            makefile:               Archivo que facilita la compilación de la tarea.

            throttle_tcp.c:         Archivo fuente en codigo C que ejecuta el código principal.


Modo de Compilación:

            Para compilar la tarea basta ejecutar la sentencia make en la
            carpeta donde se encuentran los archivos, con nombre
            t3_GordonMerello.

Modo de Uso:

            Se escribe en el shell ./throttle_tcp <puerto_local> [host_remoto] <puerto_remoto>, en 
            el mismo directorio donde se encuentra el archivo ejecutable o la ruta completa desde 
            cualquier directorio. Si la variable PATH incluye el directorio actual (.) basta con eje-
            cutar el programa escribiendo throttle_tcp <puerto_local> [host_remoto] <puerto_remoto> 
            (Asegurándose previamente que el ejecutable tenga permisos de ejecución, de lo contrario 
            con "chmod 777 throttle_tcp" permite la ejecución del programa a cualquier usuario.)
            <puerto_local> corresponde al puerto local donde throttle_tcp espera por conexiones TCP.
            [host_remoto] corresponde a la dirección de la máquina remota a la cual el cliente se va 
            a conectar.
            <puerto_remoto> corresponde al puerto de la máquina remota que espera por la conexión 
            del cliente.
            Para terminar la aplicación basta escribir un valor negativo de tamaño de balde o tasa de
            vaciado.

Ejemplo de Uso:

            Este ejemplo de uso permite navegar con un browser a través de throttle_tcp haciendo un 
            túnel SOCKS al servidor ssh de aragorn. Requiere tener ssh instalado, cuenta en aragorn y
            matlab (para los gráficos.)
            En un terminal se ejecuta:
                ./throttle_tcp 11111 aragorn.elo.utfsm.cl 22
            En otro terminal:
                ssh -D 8080 -p 11111 tgirardi@127.0.0.1
            Configurar en el broswer:
                Configuración manual de proxy ->    Servidor SOCKS: 127.0.0.1
                                                    Puerto: 8080
            Tras haber realizado estos procedimientos y aceptar el certificado de seguridad de la co-
            nexión, se está en condiciones de navegar a través de throttle_tcp. La línea de comandos 
            permite cambiar tanto el tamaño del balde como la tasa de vaciado.