ELO-330: Programación de Sistemas
Tarea 4: Estudio de Control de Congestión y Limitación de Tráfico (Versión Java)

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

Introducción

   Esta tarea es similar a la pasada, pero programada en Java, incorpora además la generación de un gráfico. Se hace también un pequeño cambio en la medición la cual usted debe hacer en el receptor en lugar del transmisor.

   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. Además posee un mecanismo de control de flujo el cual cambia la ventana  de transmisión a partir de la ventana reportada por el receptor, que es una indicación de la capacidad disponible en el receptor para almacenar los datos enviados. Para satisfacer ambos criterios, control fe flujo y control de congestión, el transmisor limita su ventana de transmisión al mínimo entre la ventada de congestión y la reportada por el receptor.
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 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.

  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: java tt_server <port> <size> <base_tiempo>
                 java tt_client <port> <size> <base_tiempo>
                 tunnel <port> <host> <hostport>  /* puede ser una versión mejorada o igual a la desarrollada en tarea 3 */

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 considerar si corresponde 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 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_client muestra la tasa de transferencia alcanzada en el último intervalo de recepción. Éste es un cambio respecto a tarea previa. El buffer TCP que recibe los datos desde la aplicación en el lado transmisor acepta datos hasta completar su capacidad, luego si medimos en el lado de la aplicación transmisora, al partir la tasa parece ser alta, pero en realidad estos datos no han salido aún de la máquina y están en la capa 4 (transporte TCP) del stack TCP/IP.
   A continuación de la medición del trafico de bajada, tt_client envía size byte y tt_server muestra la tasa de transferencia cada base_tiempo milisegundos. Con ambas fases se tiene una idea sobre cómo varió el throughput de subida y el de bajada.
  Al término de las transferencias previas, tt_server muestra un gráfico tasa de transferencia versus tiempo. Para esto use matlab, octave, gnuplot, o un gráfico en Java según usted desee. Es importante que su solución corra en aragorn.
 
Evaluación de la Tarea y qué entregar: revisar procedimiento de entrega y criterios usados para evaluar su trabajo.

Recomendaciones
* Para el gráfico, revisar tarea 2
* Revisar la ejecución de programas externos desde java.
* 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 |
    |                              | | | | hostport host |
    |                     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.