ELO-330: Programación de Sistemas
Tarea 3: Estudio de Control de Congestión y Limitación de Tráfico

Objetivos: En esta tarea usted aplicará: comunicación entre procesos remotos usando TCP, uso de túnel con ssh, Medición de anchos de banda promedios y peaks. 

Introducción

   En la tarea pasada su grupo midió tasas de recepción y transmisión de datos en capa enlace de datos. En esta tarea usted estudiará las tasas a nivel de la capa aplicación para una conexión específica.

   El protocolo TCP posee un mecanismo de control de congestión que cambia la ventana de transmisión basado en la ventana de congestión, que es un indicador de la capacidad de tráfico que la red puede transportar, y la ventana de recepción, que es una indicación de la capacidad disponible en el receptor para almacenar los datos enviados. Si la aplicación receptora lee los datos desde la capa de transporte tan pronto llegan datos, la ventana del transmisor estará limitada sólo por la ventana de congestión. Es así como usted podrá estudiar el comportamiento de esta ventana observando la tasa de transferencia en este escenario.

  Por otro lado es sabido que los proveedores de acceso a Internet dimensionan sus sistemas (caso usuario domiciliario) asimétricamente. Es decir, dan mayor ancho de banda de bajada que de subida.

  Las situaciones previas hacen recomendable (tema memoria, magister?) que según el resultado de esta tarea se propongan formas para controlar la congestión de TCP que consideren los mecanismos usados por los ISP para limitar el tráfico (hay que hacer búsqueda).

  Por otro lado UDP no posee control de congestión, luego a través de éste es posible estudiar los mecanismos usados por los ISPs para limitar el tráfico entrante y saliente (no será usado en esta tarea)

  En esta tarea su grupo sólo procura medir y observar, no se le pide hacer modelos o explicar lo observado.

Nombres: tt_server,  tt_client:  Traffic test server y Traffic test client. Observación de ventana de congestión para tráfico entrante y saliente.
                   tunnel: Túnel TCP vía conexión ssh.

Sintaxis: tt_server <port> <size> <base_tiempo>
                 tt_client <port> <size> <base_tiempo>
                 tunnel <port> <host> <hostport>

Descripción
    tt_server espera por una conexión TCP en el puerto señalado. tt_client establece una conexión hacia el puerto port. Como ambos programas pueden estar corriendo en máquinas distintas, previo a invocar tt_client, usted debe correr tunnel. Vía una conexión ssh, tunnel crea un túnel desde la máquina donde corre (local) hacia la máquina remota host. En el caso de tunnel, port especifica el puerto local a ser re-enviado al puerto hostport en máquina host. Usted puede conseguir esto creando tunnel como un script que invoca ssh con parámetro -L. Esta opción de ssh crea un socket para escuchar en un puerto local. Cada vez que alguien se conecta a este puerto, ssh re-envía la conexión a través del canal seguro de ssh, y hace una conexión al puerto hostport de la máquina host desde el lado remoto (donde corre el servidor de sshd).
   Tan pronto una conexión es hecha a tt_server, éste comienza a enviar tráfico (puede ser basura) lo más rápido que puede hasta completar size bytes. Cada vez que se cumpla el tiempo señalado en base_tiempo -en milisegundos- , tt_server muestra la tasa de transferencia alcanzada en el último intervalo de trasmisión.
   En la siguiente fase, tt_client envía size byte y muestra la tasa de trasmisión cada base_tiempo milisegundos. Con ambas fases se tiene una idea sobre cómo varió el throughput de subida y el de bajada.
 
Evaluación de la Tarea y qué entregar: revisar procedimiento de entrega y criterios usados para evaluar su trabajo.

Recomendaciones
* Revisar man ssh, en especial opciones -L y opción -R
* Escenarios de prueba:
Sin túnel:
    /-------------------------------\
    |  Una máquina        |
    |                   tt_client  |----\
    |                              | |
    |                   tt_server |<---/
\------------------------------ /
Con túnel:
    /-------------------------------\                                /-------------------------------\
    |  Máquina Local      |    |  Máquina Remota     |
    |   Home             tt_client  |----\ /-->| tt_server ELO/aragon |
    |                              | | | | |
    |                     ssh port |<---/ | | |
| | Tráfico vía túnel \---| |
| ssh |------------------------------->| sshd |
\----------------------------- / \-------------------------------/
O alternativamente:
    /-------------------------------\                            /--------------------\      /------------------\
    |  Máquina Local      |    |  Máquina Remota  | | host |
    |   Home             tt_client  |----\ | aragon | |Laboratorio |
    |                              | | | | | |
    |                     ssh port |<---/ | | | |
| | Tráfico vía túnel | / - >|----->|hostport tt_server|
| ssh |--------------------------->| sshd - - - - / | | |
\----------------------------- / \--------------------/ \------------------/


Nota: cabe destacar que algunos enlaces limitan las tasas de tráfico. Por esto lo observado es una combinación entre el control de congestión y el mecanismo de limitación de tráfico del enlace.