Implementación del TCP en el simulador de redes EasySim. Análisis de las versiones Reno y Vegas del TCP. 1 Introducción EasySim es un simulador de redes desarrollado en Java realizado por estudiantes de Ingeniería Eléctrica para un proyecto de fin de carrera. Su funcionamiento es parecido al simulador NS-2 de Berkeley, pero su utilidad esencialmente menor debido al poco tiempo de desarrollo del mismo. Sin embargo, la arquitectura de EasySim es tal que permite de forma relativamente fácil la adición de diferentes elementos que brinden mayor funcionalidad al mismo. En la etapa actual del simulador, se cuenta con herramientas para simular redes sin protocolos de enrutamiento ni de transporte. Los paquetes generados por las fuentes seguirán siempre el mismo camino a través de la red, caminos establecidos en base a tablas de ruteo estáticas definidas por el usuario en la etapa de configuración de la red. El enrutamiento de los paquetes se realiza en base a etiquetas que estos llevan consigo, del mismo modo que ocurre en una red MPLS. La etiqueta que cada paquete lleva adosada también se define en la etapa de configuración de la red junto con otros parámetros de calidad de servicio que permite la simulación de redes con mecanismo DiffServ. Hasta el momento, no existe ningún agente de transporte que asegure una confiable entrega de paquetes al destino. Simplemente, EasySim posee un generador de tráfico incluido en cada Host que inyecta paquetes en la cola de salida del nodo para su envío inmediato a través del enlace. Si los paquetes se pierden por el camino ya sea por problemas en los enlaces o overflows en las colas, nada se puede hacer. La idea del presente trabajo es la inclusión de un agente de transporte a EasySim, concretamente la inclusión del TCP, como entidad encargada de una comunicación confiable extremo a extremo de la comunicación, y la puesta en practica del simulador con dicho protocolo. Para esto último se decidió analizar y comparar la performance de una conexión cuando el agente de transporte es TCP Reno por una lado, y cuando se trata de una conexión TCP Vegas. Estas versiones del TCP se diferencian principalmente, como se verá mas delante, en el mecanismo de control de congestión, y ambas fueron definidas en el simulador. El resto del trabajo esta organizado de la siguiente manera: el capítulo 2 da una breve reseña a la arquitectura del simulador EasySim. El capítulo 3 describe el algoritmo TCP, tanto para Reno como para Vegas implementado en el simulador. El capítulo 4 analiza el comportamiento de las versiones Reno y Vegas del TCP. 2 Arquitectura de los Hosts del simulador En este capítulo se intentará dejar en claro el mecanismo de inclusión de un agente de transporte en el simulador. Para ello será necesario entender el funcionamiento de un Host de EasySim. La figura 2.1 ilustra la arquitectura interna de un host. En esta figura aparecen los tres componentes fundamentales de un host, a saber, los generadores de tráfico, el agente de transporte y la cola de salida. A cada lado de esta entidades abstractas aparecen las definidas hasta el momento, incluidas las versiones del TCP Reno y Vegas incluidas en esta etapa. Figura 2.1. Arquitectura de un host en EasySim Como se observa en la figura, en cada host del simulador, los generadores de tráfico inyectan de paquetes a los agentes de transporte. Estos a su vez, generan sus propios paquetes dependiendo de la clase de protocolo. Por ejemplo, el TCP construye paquetes de 1500 bytes con los datos recibidos de las aplicaciones y los envía a la capa inferior de la pila de protocolos. Antes de incluir el TCP como agente de transporte en el simulador, los paquetes, si bien atravesaban por un agente de transporte, eran de inmediato colocados en la cola de salida del host, vale decir, el agente definido hasta ese entonces no creaba nuevas estructuras de paquetes ni realizaba ninguna gestión sobre ellos. La idea que se tubo en la etapa de diseño del simulador era justamente la creación de un agente abstracto que brindara únicamente la conectividad necesaria con las demás entidades del sistema, y dejar el esqueleto para la inclusión de agentes reales de transporte. Los paquetes generados por los agentes de transporte son enviados a la cola de salida del host para su futuro envió por el enlace de comunicación. La rapidez con que un paquete deja la cola dependerá del scheduler definido para la cola. Como se observa en la figura 2.1, se han definido hasta el momento 6 schedulers 1 y 2 queue management2 para el funcionamiento de las colas. Cuatro de estos seis schedulers atienden parámetros de calidad de servicio, vale decir, despachan paquetes de acuerdo a la prioridad del retardo que estos posean. Los queue management funcionan como un filtro de paquetes colocado a la entrada de cada cola. Este filtro decidirá si el paquete que arriba entra a la cola o es descartado por el sistema. El queue management mas conocido es Drop Tail, donde simplemente se descarta en paquete cuando la cola alcanza el estado de overflow. Sin embargo, los routers de hoy día están siendo equipados con el mecanismo RED en las colas del los enlaces, mecanismo especialmente útil cuando se trata de una red TCP/IP ya que este sistema permite la cancelación de las oscilaciones de las colas. En el simulador también fue incluido este mecanismo como queue management alternativo al Drop Tail. Tanto los schedulers como los queue management son seleccionados por el usuario desde la interfaz gráfica en la etapa de configuración de la red. Tanto la inclusión de nuevos agentes de transporte, nuevos generadores de tráfico o nuevos tipos de colas se realiza de manera relativamente sencilla en el simulador, y se remite al lector a leer la documentación al respecto en el manual del simulador. [2] 3 Descripción del TCP incluido en EasySim Como se mencionó anteriormente, EasySim provee del esqueleto para la inclusión de nuevos agentes de transporte, el cual brinda la conectividad con las otras clases del sistema. Los paquetes que alimentan al agente provienen de los generadores de tráfico y los paquetes generados por los agentes deben ser colocados en la cola de salida del host. Una vez creado el agente de transporte, la conexión con los generadores de tráfico como con la cola de salida del hosts estarán ya implementadas por el sistema. 3.1 Conexiones TCP Como sucede en la realidad, un mismo agente TCP puede estar manejando varias conexiones a la vez, identificadas cada una de ellas por puertos TCP. El agente TCP creado no escapa a esta regla, y por cada generador de tráfico que se incluya en el host, el agente TCP creara una nueva conexión que se abrirá una vez que el generador comience a producir paquetes. Cada conexión creada por el sistema trabajará de manera independiente de las demás, compartiendo por supuesto, el ancho de banda del enlace de comunicación. 3.2 Establecimiento de una conexión El protocolo TCP es orientado a la conexión. Esto significa que antes de comenzar a intercambiar paquetes, las entidades TCP de los extremos de la comunicación establecen una conexión. El TCP usa el protocolo de acuerdo de tres vías ( three way handshake ) para llevar a cabo la misma. 1 1 2 1 2 Proceso encargado de despachar los paquetes de la cola. Proceso encargado de controlar el estado del buffer. La versión del TCP incluida en el simulador realiza un algoritmo parecido al three way handshake , no exactamente el mismo, ya que el interés primario es el análisis de la performance le protocolo una vez establecida la conexión, vale decir, cuando el TCP ha alcanzado el estado de ESTABLISHED. La descripción del algoritmo es como sigue: Con el primer paquete producido por cada generador, el TCP abre una nueva conexión, asignándole un nuevo número de conexión, y envía un paquete TCP con un flag SYN=1 y ACK=0 hacia el otro extremo de la comunicación iniciando además un timer. Si este paquete TCP es recibido correctamente por el receptor, este envía otro paquete TCP con SYN=1 y ACK=1 indicando que ha recibido el anterior. A la recepción de este paquete por el transmisor, este inicializa sus variables y se comienza con la transmisión de datos. Si alguno de los paquetes de establecimiento de conexión se pierde por el camino, el timer del transmisor da time out y se comienza de nuevo. 3.3 Parámetros del TCP y sus valores iniciales A continuación se describen los parámetros incluidos en esta versión del TCP y los valores iniciales o por defecto que estos adoptan según [1]. SEG_SIZE: Tamaño máximo de segmento configurable por el usuario desde la interfaz gráfica. El TCP implementado solo envía paquetes de tamaño SEG_SIZE. El valor por defecto es de 1500 bytes. rwnd_ini: Ventana inicial anunciada por el receptor en unidades de SEG_SIZE. Este valor también es configurable por el usuario y en esta versión del TCP, la ventana de recepción actual rwnd siempre es igual a este valor inicial, vale decir, la aplicación del lado receptor es infinitamente rápida. Su valor por defecto es de 100 x SEG_SIZE. ssthresh_ini : Umbral de congestión inicial. Este valor se especifica en kbytes y es el valor de cwnd a partir del cual se pasa al estado de CONGESTION AVOIDANCE. Su valor inicial es de 64 kbytes. rwnd : Ventana anunciada por el receptor. En esta versión del TCP rwnd=rwnd_ini durante el transcurso de la simulación. Su valor inicial se establece por lo anunciado por el receptor en la etapa de establecimiento de la conexión. cwnd : Ventana de congestionamiento. Valor inicial cwnd=1. ssthresh : Umbral de congestionamiento. Valor inicial: ssthresh=ssthresh_ini. snd_wnd : Ventana disponible para enviar nuevos segmentos, calculada como snd_wnd=min{cwnd,rwnd}. MaxRexmitTimes : Numero máximo permitido de time outs. Luego de MaxRexmitTimes time outs se aborta la conexión. Su valor por defecto es MaxRexmitTimes=12. RTT : Tiempo estimado de ida y vuelta de un segmento. Su valor inicial es de 0.0 segundos. RTO : Tiempo de expiración del timer de retransmisiones. Su valor es calculado dinámicamente en base a los valores medidos para RTT y el algoritmo de Karn y Jacobson. Su valor inicial es de 3.0 segundos. MaxRTO : máximo tiempo de asignación posible para RTO. Su valor por defecto es de 64.0 segundos. 3.4 Estimación del RTT (M) y cálculo del RTT y RTO A continuación se muestra el algoritmo de estimación del tiempo de ida y vuelta de un segmento, M, y el cálculo de los valores de RTT y RTO usados en la presente versión del TCP, mediante el uso un pseudo código: Para la estimación del RTT, es decir, el valor de M: Con el envió de un segmento o Si ya esta corriendo la medida del rtt para un segmento, no reinicie la medida o Si no se esta midiendo el rtt de ningún segmento, reinicie la medida del rtt. Con el envió de una retransmisión o Si esta corriendo la medida del rtt de algún segmento, cancélela. o Si no esta corriendo la medida del rtt para ningún segmento, no reinicie la medida. Con el arribo de un ack o Establezca el valor de M a la diferencia entre el tiempo de envió del paquete y el tiempo de llegada del ack. Dado un valor para M, el RTT y RTO se calculan mediante el algoritmo de Jacobson, como sigue D=ALFA*D+(1-ALFA)|RTT-M|; RTT=ALFA*RTT+(1-ALFA)*M; RTO=RTT+4*D; Donde ALFA es un valor constante fijado en 7/8. 3.5 Gestión de la ventana de envío y procesamiento de acks Esta sección intenta dar una idea de cómo procede el TCP con la llegada de un ack al transmisor. Con la llegada de un ack, el algoritmo primero actualiza todas la variables y luego envía la ventana disponible snd_wnd. La ventana disponible snd_wnd se calcula como el mínimo entre la ventana de congestionamiento y la ventana de recepción, esto es, snd _ wnd mincwnd, rwnd El valor de rwnd se dijo que permanece constante en todo el proceso de simulación, sin embargo, la actualización de cwnd depende del estado del TCP. A continuación se describen los cuatro estados del TCP, para las versiones de Reno y Vegas implementadas en el simulador. 3.5.1 Slow Start TCP Reno Con la recepción de un nuevo ACK: si cwnd =< ssthresh 1. cwnd ++ 2. envíe la ventana disponible. en cambio si cnwd > ssthresh, pase a congestión Avoidance para procesamiento del ACK Con la recepción de un ACK duplicado: si el número de acks consecutivos duplicados es menor que 3, no haga nada en cambio si el número de acks consecutivos es igual a 3, pase al estado de FastRetransmit de Fast Retransmission/Recovery TCP Vegas Con la recepción de un nuevo ACK: si cnwd =< ssthresh 1. cwnd ++ una vez por medio 2. envíe la ventana disponible. en cambio si cnwd > ssthresh, pase a congestión Avoidance para procesamiento del ACK Con la recepción de un ACK duplicado: si el número de acks consecutivos duplicados es menor que 3, no haga nada en cambio si el número de acks consecutivos es igual a 3, pase al estado de FastRetransmit de Fast Retransmission/Recovery Como se observa, slow start en Vegas incrementa la ventana de congestionamiento mas lentamente que Reno al incrementar cwnd una vez por medio en vez de hacerlo con el arribo de cada ack. 3.5.2 Congestion Avoidance TCP Reno Con la recepción de un nuevo ACK: 1. cwnd += 1/cwnd 2. envíe la ventana disponible Con la recepción de un ACK duplicado: si el número de acks consecutivos duplicados es menor que 3, no haga nada en cambio si el número de acks consecutivos es igual a 3, pase al estado de FastRetransmit de Fast Retransmission/Recovery TCP Vegas El algoritmo de TCP Vegas será descrito en detalle en el capítulo siguiente. Aquí solo expondremos los pasos del algoritmo en la etapa de congestion avoidance. Con la recepción de un nuevo ACK: 1. 2. 3. 4. 5. Si el RTT medido es menor a base_rtt establezca base_rtt=RTT. Calcule diff=cwnd-cwnd*(base_rtt/RTT) Si diff<alfa incremente cwnd en una unidad En cambio si diff>beta reduzca cwnd en una unidad envíe la ventana disponible Con la recepción de un ACK duplicado: si el número de acks consecutivos duplicados es menor que 3, no haga nada en cambio si el número de acks consecutivos es igual a 3, pase al estado de FastRetransmit de Fast Retransmission/Recovery. 3.5.3 Fast Retransmit / Fast Recovery El protocolo de ventana corrediza del TCP permite la recepción de paquetes fuera de secuencia en el eventual caso de la pérdida de uno de ellos. Con la recepción de un paquete fuera de orden, el TCP reconoce el último paquete que le llegó bien. En el lado transmisor, al recibir tres acks duplicados (4 acks consecutivos iguales ) se pasa el control al estado de Fast Retransmit, donde se actualizan algunas variables y se retransmite el segmento perdido de inmediato. Luego de esto, se pasa a la fase de Fast Recovery hasta que se reciba un nuevo reconocimiento, momento en el cual se pasa el control a congestion Avoidance. El algoritmo es como sigue: Fast Retransmit: 1. ssthtresh = max (snd_wnd/2,2) 2. retransmita el segmento perdido 3. candy = setters +3 Con la recepción de un ACK duplicado: cwnd ++ envíe la ventana disponible Con la recepción de un nuevo ACK: 1. Establezca cwnd = ssthresh 2. Pase el control a congestión Avoidance para procesamiento del ACK 3.6 Gestión de la ventana de recepción y generación de acks Muchas versiones del TCP retardan los acks a la espera ya sea de nuevos datos desde la aplicación para enviar junto con los acks (piggybacking), o de mas datos del transmisor para enviar acks que resuman la secuencia completa de paquetes. En esta versión del TCP no ocurren ninguna de esta dos funciones, y el TCP envía un ack no bien recibe un paquete desde la entidad transmisora. Además, una entidad TCP en el caso del presente simulador, solo puede ser transmisor o receptor pero no ambos a la vez. Los hosts que posean generadores de tráfico serán las entidades TCP transmisoras y abrirán la conexión con el receptor. Si el receptor también contiene generadores de tráfico, este abrirá una nueva conexión aunque el destino de los paquetes sea el host que le esta enviando datos también. Como ya se mencionó, se supone que la aplicación del lado receptor mantiene el buffer del mismo en el estado que este indicó al establecer la conexión, es decir, la variable rwnd, que indica el tamaño de la ventana anunciada por el receptor, se mantendrá en el valor establecido en la etapa de establecimiento de la conexión. 3.7 La interfaz gráfica con el usuario Terminada la descripción del TCP implementado en el simulador, pasamos a describir la interfaz con la cual interactuará el usuario para crear un agente TCP en el simulador EasySim. La figura 3.1 muestra la ventana que aparece en la interfaz gráfica del simulador una vez que el usuario selecciona el panel de Agentes en la configuración de un host. En el ejemplo, el usuario seleccionó un agente TCP Vegas para el host. Los parámetros configurables por el usuario para el TCP son los que aparecen en la figura, donde se indican además los valores por defecto asignados por el sistema. Figura 3.1 Selección de un agente de transporte 3.8 Los threads del simulador El simulador EasySim esta escrito en lenguaje Java. Muchas de la clases definidas en el sistema heredan de la clase thread del API de Java haciendo que la ejecución de las mismas compartan tiempo de CPU. Sin la ayuda de estos threads, sería imposible lograr el comportamiento correcto de ciertas clases del sistema. Los threads permiten que un único proceso sea llevado a cabo mediante varios hilos de ejecución ejecutándose paralelamente, simulando la presencia de varios procesadores en el sistema. Lo que se hace en realidad es compartir tiempo de CPU entre los diferentes threads del proceso. Por citar un ejemplo, los generadores de tráfico del sistema necesitan estar continuamente generando paquetes y no pueden esperar la ejecución de otra tareas por parte del procesador para seguir adelante. Todos los generadores del sistema heredan de una clase abstracta Generador que a su vez hereda de Thread convirtiéndola en un hilo de ejecución en el sistema y logrando el comportamiento requerido. La inclusión de threads en el sistema hace que el procesador reparta su tiempo entre todos ellos. Cuanto mas threads hallan sido creados mas lentamente evolucionará el simulador. De cara a lo anterior, se incluyó la opción “El agente siempre tiene datos para enviar” para los agentes TCP, como se observa en la figura 3.1. Lo que le estamos diciendo al sistema al seleccionar esta opción es que apague todos los generadores de tráfico y suponga que el buffer de transmisión siempre tiene datos para enviar. Lo único que debe hacer el TCP ahora es formar paquetes de tamaño seg_size y enviarlos a la cola de salida del host. De esta forma estamos reduciendo el número de threads en el sistema logrando mayor velocidad de simulación. Por supuesto, si el usuario requiere que halla una aplicación entregando paquetes al TCP, no tiene mas que seleccionar el modelo de tráfico de la misma y desactivar esta opción. 4 Los agentes de transporte TCP Reno y TCP Vegas 4.1 Mecanismo de control de congestión Con el objetivo de lograr un uso eficiente de la red, TCP controla el flujo entregado a la misma mediante realimentación. Para controlar el flujo entregado, TCP necesita estimar el ancho de banda disponible usando alguna forma de estimación del ancho de banda. La gran diferencia entre Reno y Vegas es la forma en que se estima este ancho de banda disponible. 4.1.1 TCP Reno TCP Reno utiliza la pérdida de paquetes para estimar el ancho de banda disponible. Mientras no halla pérdida de paquetes, TCP Reno continúa incrementando su ventana de congestionamiento en cada round trip time. Cuando experimenta pérdida de paquetes, este reduce su ventana a la mitad de su valor actual. Este mecanismo es conocido como additive increase and multiplicatiuve decrease. Este mecanismo resulta útil para estimar el ancho de banda, pero como veremos luego, esto causa una oscilación periódica en el tamaño de la cola debido a la constante actualización de la ventana. Esta oscilación en el tamaño de la ventana causa oscilación en el round trip delay de los paquetes. Esta oscilación, a su vez, resulta en un gran jitter y un uso ineficiente del ancho de banda disponible debido a las muchas retransmisiones del mismo paquete cuando ocurren los drops en la colas. La velocidad con que cada conexión actualiza su ventana depende del round trip delay de la conexión.. Por lo tanto, las conexiones con retardo mas cortos actualizarán sus ventanas mas rápido que aquellas con retardos mas largos, y por lo tanto obtendrán la mayor parte del ancho de banda disponible. TCP Reno es injusto con las conexiones con round trip delays grandes. 4.1.2 TCP Vegas TCP Vegas adopta una forma mas sofisticada de estimación del ancho de banda. Usa la diferencia entre el flujo esperado y el actual para estimar el ancho de banda disponible en la red.. La idea es que cuando la red no esta congestionada, el flujo actual estará cerca del flujo esperado. De otra forma, el flujo actual será mas pequeño que el flujo esperado. TCP Vegas usa la diferencia en los flujos, estima el nivel de congestión de la red, y actualiza su ventana de acuerdo a lo anterior. Note que esta diferencia en los flujos puede ser fácilmente trasladada a la diferencia del tamaño de la ventana y el número de paquetes reconocidos durante un round trip time, usando la ecuación Diff Expected ActualBaseRTT (4.1) donde Expected es el flujo esperado, Actual es el flujo actual, y BaseRTT es el mínimo round trip time. Los detalles del algoritmo son como sigue: CWND , donde BaseRTT CWND es el tamaño actual de la ventana y BaseRTT es el mínimo round trip time. 2. Segundo, la fuente estima el flujo actual usando el actual round trip time de CWND acuerdo a Actual , donde RTT es el actual round trip time de cada RTT paquete. 3. La fuente, usando los flujos actual y esperado, calcula el tamaño esperado de la cola a partir de la ecuación (4.1). 4. Basado en Diff, la fuente calcula su tamaño de ventana como sigue 1. Primero, la fuente calcula el flujo esperado Expected CWND 1, si Diff CWND CWND 1, si Diff CWND , en otrocaso (4.2) Figura 4.1. Control de ventana de TCP Vegas La figura 4.1 ilustra el comportamiento de TCP Vegas. Considere un red simple con una única conexión y un solo enlace de capacidad C. Sea BaseRTT el mínimo round trip window delay. El throughput de esta conexión es cuando window C BaseRTT . BaseRTT En la figura, w corresponde al tamaño de la ventana cuando window C BaseRTT . Cuando window w , la cola comienza a crecer y Expected Actual 0 . TCP Vegas incrementa el tamaño de la ventana en uno durante el siguiente round trip time si window w y la decrementa en uno si window w . De otra manera deja la ventana incambiada. En la figura, Diff es el tamaño de la cola del enlace estimado por el usuario (la conexión). TCP Vegas intenta mantener la cola del enlace con al menos paquetes pero no mas de . Note que el mecanismo utilizado por TCP Vegas es radicalmente diferente al usado por TCP Reno. TCP Reno siempre actualiza su tamaño de ventana para garantizar una completa utilización del ancho de banda disponible, incurriendo en una constante pérdida de paquetes, mientras que TCP Vegas no causa ninguna oscilación en el tamaño de la ventana, con la cual converge a un punto de equilibrio. 4.1.3 Simulación con EasySim. Caso de colas Drop Tail En esta sección, verificaremos mediante simulación, los resultados de las secciones anteriores. En concreto, contrastaremos el comportamiento de la cola del enlace crítico de la figura 4.2 cuando las conexiones son TCP Reno y cuando las mismas son TCP Vegas. Usaremos en esta instancia, colas del tipo Drop Tail, es decir, aquellas en donde se producen descarte de paquetes solo cuando las misma alcanza el estado de overflow. Figura 4.2. Topología de red usada para la simulación. Las cuatro conexiones TCP de la figura, comparten un único enlace L5. De esta forma, la cola de dicho enlace creará el cuello de botella de la red. Los valores de los parámetros seleccionados para la red de la figura 4.2 fueron los siguientes: Enlaces L1 a L4: 10 Mbps y 20 mseg de retardo de propagación Enlace L5: 5 Mbps y 80 mseg de retardo de propagación Tamaño de la cola de los enlaces L1 a L4: infinita Tamaño de la cola del enlace L5: 100 paquetes, Drop Tail. Tamaño de segmento TCP: 1500 bytes Tiempo de simulación: 50 segundos La figura 4.3 muestra el buffer en función del tiempo para el caso de TCP Reno. Observamos de dicha figura las oscilaciones producidas en la cola debido a la constante actualización de la ventana del TCP Reno. Al llegar el buffer a 100 paquetes, comienza a descartarlos, haciendo que las conexiones TCP reduzcan su ventana de congestionamiento drásticamente3. Al hacerlo todas a la vez, se producen las oscilaciones observadas. Esto se conoce como sincronización global, y el efecto es mitigado por TCP Vegas como se observa en la figura 4.4. También se puede mitigar el efecto de las oscilaciones si se introduce el mecanismo de control de congestión RED en la cola del cuello de botella. 1 3 3 La reducción de la ventana depende de si la perdida del paquete es detectada por un time out o por la llegada de un triple ack duplicado. En el primer caso, la ventana de congestionamiento se reduce a un segmento, mientras que en caso de triple acks, esta se reduce a la mitad de la ventana de congestionamiento actual mas tres segmentos. Figura 4.3. Buffer vs tiempo para la cola del enlace crítico cuando las conexiones son TCP Reno. Como se mencionó en la sección 4.1.2, TCP Vegas intentará mantener la cola del enlace crítico entre y paquetes. Estos parámetros son seleccionables por el usuario en EasySim, como lo muestra la figura 3.1. Para la topología de la red de la figura 4.1 y para el caso de conexiones TCP Vegas, se seleccionaron 5 y 6 . Cada conexión TCP Vegas entonces, intentará mantener la cola del enlace L5 entre dichos valores. Como resultado, la cola del enlace será forzada a mantenerse entre 20 y 24 paquetes ( la suma de cada conexión). Este resultado se aclara en al sección que sigue. La figura 4.4 muestra como al usar conexiones TCP Vegas, la cola del enlace se amortigua rápidamente a un valor entre 20 y 21 paquetes verificando así los resultados teóricos. De esta forma se eliminan las oscilaciones, mejorando la performance de cada conexión, utilizando el ancho de banda disponible mas eficientemente. Figura 4.4. Buffer vs tiempo para la cola del enlace crítico cuando las conexiones son TCP Vegas. 4.1.3.1 El retardo de propagación elegido Con los valores seleccionados para los enlaces, se tiene un round trip delay de 200 mseg, 20 80 2 para cada conexión TCP. Tanto en TCP Vegas como en Reno, una pérdida de paquete es encontrada ya sea por un time out o por la llegada de un triple ack duplicado. En el primero de los casos, el TCP reduce su ventana de congestionamiento a un segmento, y en el segundo a la mitad de la ventana actual mas tres segmentos. Para que la pérdida de un paquete sea detectada por un triple ack, es necesario que haya una cantidad suficiente de paquetes en tránsito para esa conexión, de manera que el receptor TCP reciba una secuencia de acks consecutivos luego de la pérdida de un paquete y reconozca de esa forma el último correcto de la secuencia. Si la red no alberga la cantidad suficiente de paquetes, el transmisor deberá esperar un time out para retransmitir el paquete perdido degradando la ventana de congestionamiento a un segmento cada vez que se pierda un paquete. Con la finalidad de detectar la mayoría de las perdidas de paquetes por triple acks, se eligió un retardo de propagación de ida y vuelta de 200 mseg, de manera que cantidadde paquetesen transito velocidaddel enlacecritico(paq/seg) round tripdelay 5e 6 200e 3 83.33 paquetes 1500 8 En promedio, cada conexión tendrá en todo momento 20.83 (83.33/4) paquetes en tránsito, de manera de poder detectar la pérdida de un paquete por la llegada un triple ack duplicado, y de esa forma, no degradar demasiado la conexión. 4.2 Imparcialidad de TCP Vegas Como mencionamos antes, TCP Reno beneficia a las conexiones con cortos round trip delays. En esta sección demostraremos que TCP Vegas es imparcial con las conexiones con retardos cortos y largos, analizando un simple modelo de fluidos. Asumiremos que los paquetes son infinitamente divisibles, es decir, usaremos un modelo de fluidos, y el retardo de propagación será determinístico. Considere el modelo de la figura 4.5. Hay dos usuarios con diferentes round trip delays, que comparten un mismo cuello de botella. El usuario i tiene un round trip delay d i y ejecuta un control de flujo basado en ventana. Sea qi (t ) el tamaño de la cola del usuario i en el tiempo t. Sea ahora rtt i (t ) wq (t ) di el retardo ida y vuelta de la conexión i en el tiempo t, donde wq (t ) es el retardo en la cola del cuello de botella. Asumimos que la cola es FIFO, y que tiene buffer infinito. Suponga que ei (t ) denota la velocidad con que el usuario i recibe los acks. Figura 4.5. Red con dos usuarios Los usuarios actualizan sus ventanas una vez durante cada round trip time. Ya que el tamaño de la ventana es igual a la suma de la cantidad de fluido en tránsito mas lo que hay en la cola: wi (t ) qi (t ) t di e (s)ds i (4.3) t Note que el segundo termino de la ecuación (4.3) es la cantidad de fluido en tránsito en el tiempo t. Cada fuente estima la cantidad de paquetes en la cola usando la diferencia entre los flujos esperado y actual.. Por lo tanto, la cantidad estimada de fluido en la cola en el tiempo t para el usuario i es t t w (t ) 1 d w (t ) di Diffi i e ( s ) ds ei ( s)ds (4.4) i i i di rtt ( t ) rtt ( t ) i i t rtt i ( t ) t rtt i ( t ) Al cabo de un tiempo t o , la cantidad anterior convergerá a un valor tal que: t d wi (t ) i ei ( s )ds (4.5) rtti (t ) t rtti (t ) Ahora suponga que la ventana satisface la ecuación (4.5). Si sustituimos (4.3) en (4.5) tenemos que qi (t ) t di ei (s)ds t t di ei ( s )ds (4.6) rtti (t ) t rtti ( t ) Una vez que las fuentes satisfacen (4.5) ya no cambian mas sus ventanas. Suponga que el sistema es cuasi estático y ei (t ) es relativamente constante. Entonces el segundo y tercer termino de (4.6) se cancelan dando qi (t ) (4.7) Note que bajo las hipótesis de sistema cuasi estático, el tamaño de la cola de cada conexión no depende del retardo de propagación d i , eliminando el favoritismo hacia las conexiones con retardos de propagación mas cortos del TCP Reno. Ya que la cola es FIFO, el throughput de cada conexión es directamente proporcional al tamaño de la cola del cuello de botella. Cada conexión entonces obtiene el mismo throughput independientemente del su retardo de propagación. Las conexiones con retardo de propagación mas largos deberán tener una ventana mayor, a los efectos de mantener mas fluido en tránsito, manteniendo la misma cantidad de paquetes en la cola que la conexión con retardo mas corto, obteniendo así el mismo throughput. 4.2.1 Resultados de simulación En esta sección intentaremos verificar mediante simulación con EasySim, los resultados de la sección anterior. La red a analizar será la de la figura 4.6. En ella, el host H1 envía paquetes al H3, y el H2 envía hacia H4. El retardo de propagación ida y vuelta para H1 vale 100 mseg, y para H2 lo hacemos variar desde 160 mseg hasta 300 mseg variando el retardo del enlace L5. Figura 4.6. Dos conexiones TCP con diferentes retardos de propagación A la luz de la sección anterior, mediremos el throughput de cada conexión a través de la cantidad de acks recibidos por cada una de ellas en la ventana de tiempo de simulación. Tabla 4.1. Conexiones Reno Tabla 4.2. Conexiones Vegas Los valores seleccionados para los parámetros fueron: Links L1, L2, L4 y L5: 10 Mbps Link L3: 1.5 Mbps Retardo de propagación de la conexión 1 (H1 y H3): 100 mseg Retardo de propagación de la conexión 2 (H2 y H4): 160, 200, 230, 260 y 300 mseg. Tamaño de las colas: Lo suficientemente grande para no ocurrir desbordes. Tamaño de segmento: 1500 bytes Para TCP Vegas: 2 y 3 La tabla 4.1 muestra la relación de throughputs para ambas conexiones en la ultima columna cuando las conexiones son TCP Reno. Los acks1 son los recibidos por la conexión con retardo mas corto (H1 y H3). Observamos que esta relación crece linealmente conforme aumentamos el retardo de propagación de la otra conexión (H2 y H4), confirmando el favoritismo hacia las conexiones con retardos cortos del TCP Reno. La tabla 4.2 corresponde a los resultados de la simulación de la misma red, pero esta vez con conexiones TCP Vegas en los hosts. Se observa que la relación de throughputs es mucho mas pareja para ambas conexiones, sin importar el retardo de propagación de las mismas, como lo habíamos anticipado. 4.3 Incompatibilidad entre Vegas y Reno En las secciones anteriores hemos demostrado que TCP Vegas generalmente permite mejorar la performance de una conexión, utilizando mejor el ancho de banda disponible en la red. Sin embargo, cuando una conexión Vegas comparte un enlace con una conexión Reno, esta ultima resulta quedarse con la mayor parte del ancho de banda disponible, debido al mecanismo de control de congestión conservativo de TCP Vegas. TCP Reno continúa incrementando su ventana mientras no ocurran perdidas de paquetes. Los paquetes se pierden principalmente por overflows en las colas. Este mecanismo de estimación del ancho de banda resulta en una oscilación periódica del tamaño de la ventana y llenado del buffer, como vimos en la sección 4.1.1 y confirmamos mediante simulación en la sección 4.1.3. Por lo tanto, mientras TCP Vegas intenta mantener el tamaño de la cola en unos pocos paquetes, TCP Reno mantiene muchos mas paquetes en la cola, en promedio, quedándose con la mayor parte el ancho de banda disponible. Sea qv (t ) y q r (t ) la cantidad de paquetes en la cola del enlace crítico en el tiempo t, de las conexiones Vegas y Reno respectivamente, y sea B el tamaño del buffer. Si asumimos que qv (t ) k , q r (t ) toma valores entre 0, B k . Asumamos que q r (t ) se distribuye uniformemente en ese intervalo. La cantidad promedio entonces de Bk paquetes de Reno en la cola es q r . La relación entre el throughput de Reno y el 2 Bk de Vegas es entonces, . Cuando B es relativamente grande, que es usualmente el 2k caso, entonces es obvio que TCP Reno consigue la mayor parte del ancho de banda disponible. Estos resultados serán verificados mediante simulación con EasySim en la sección que sigue. El mecanismo de control de congestión de TCP Reno es agresivo en el sentido que deja poco espacio en el buffer para las otras conexiones, mientras que TCP Vegas es mas conservativo manteniendo pocos paquetes en el buffer. Cuando una conexión TCP Reno comparte un enlace con TCP Vegas, Reno utiliza mas espacio de buffer que Vegas, y esta ultima reconoce esto como una señal de congestión bajando el tamaño de su ventana de congestionamiento. Esta es una razón por la cual TCP Vegas no ha sido ampliamente desarrollada, además de otras propiedades indeseables que posee. 4.3.1 Simulación con EasySim El objetivo de esta sección será verificar los resultados de la sección anterior mediante simulación con EasySim. Otra vez, mediremos el throughput de cada conexión a través de la cantidad de acks recibidos durante el transcurso de la simulación. La topología a simular será la de la figura 4.6. El retardo de propagación para ambas conexiones se fijó en 260 mseg. , los valores para Vegas, 1 y 3 , y los demás valores idénticos a la simulación anterior. Además, ahora el tamaño del buffer del cuello de botella se fue cambiando desde 10 a 50 paquetes. Tabal 4.3 Resultados de la simulación La tabla 4.3 verifica los resultados de la sección anterior. Cuanto mayor sea el tamaño del buffer del cuello de botella, mayor será la disparidad entre los throughputs de las conexiones Reno y Vegas, obteniendo esta última la parte mas pequeña del ancho de banda disponible de la red. Cuanto mas grande sea el buffer, mas espacio tendrá Reno para colocar sus paquetes aumentando su ventana de congestionamiento en cada RTT. Por otro lado, al crecer la cantidad de paquetes en la cola, crece también el retardo que los paquetes experimentan en la misma, wq , lo que hace crecer el RTT, con lo cual hace que TCP Vegas decremente su ventana de congestionamiento. La última columna de la tabla indica el intervalo en el que debe caer la relación de throughputs, según la estimación anterior para la cantidad promedio de paquetes de Reno en la cola. En todos los casos, se verifican los resultados de la sección anterior. El tiempo de simulación usado fue de 100 seg.