Universidad de Buenos Aires Facultad de Ciencias Exactas y Naturales Departamento de Computación Una aplicación de coordenadas de red para aumentar el tráfico intra-ISP en BitTorrent Tesis presentada para optar al tı́tulo de Licenciado de la Universidad de Buenos Aires en el área de Ciencias de la Computación Jorge Lucángeli Obes Director de Tesis: Dr. Claudio E. Righetti Buenos Aires, abril de 2009 Una aplicación de coordenadas de red para aumentar el tráfico intra-ISP en BitTorrent Resumen El tráfico generado por los protocolos peer-to-peer (P2P) plantea un desafı́o para los proveedores de Internet (Internet Service Providers, ISPs). Por un lado, este tráfico representa una gran proporción del tráfico total de Internet. Por otro lado, el tráfico P2P es mayormente simétrico, mientras que las conexiones de banda ancha residencial son generalmente asimétricas. Los protocolos P2P transforman a los clientes en proveedores de contenido, incrementando el tráfico intercambiado entre usuarios de distintos ISPs. Esto incrementa a su vez los costos de los proveedores, pues el tráfico que sale de la red de un ISP tiene un costo mayor para el ISP que el tráfico intercambiado entre sus propios usuarios. Frente a esta situación, los proveedores han respondido regulando agresivamente el tráfico generado por los protocolos P2P, afectando su correcto funcionamiento. Las soluciones propuestas comparten el enfoque de modificar los protocolos P2P para que los nodos ejecutando el protocolo prefieran conectarse e intercambiar información con otros nodos en su mismo ISP. Este trabajo presenta una modificación al protocolo P2P BitTorrent que incrementa el tráfico intercambiado entre nodos en el mismo ISP sin disminuir la tasa de transferencia de los usuarios. Nuestra propuesta consiste en modificar el algoritmo principal de BitTorrent para que cada nodo ejecutando el protocolo prefiera intercambiar información con nodos cercanos en términos de latencia, dado que dos nodos con baja latencia entre sı́ tienen mayor probabilidad de estar en un mismo ISP. A diferencia de otros trabajos, nuestra propuesta no modifica el comportamiento del tracker (servidor de información administrativa) de BitTorrent, lo que nos permite mantener las propiedades de robustez y utilización de recursos del protocolo. Utilizamos el mecanismo de estimación de latencia Vivaldi para evitar que los nodos tengan que medir latencias constantemente. Realizamos una implementación de Vivaldi y BitTorrent en un simulador que permite construir redes con enlaces similares a las conexiones de banda ancha residencial. La experimentación con el simulador permitió, por un lado, caracterizar el comportamiento de Vivaldi en una red de esas caracterı́sticas. Por otro lado, logramos validar la modificación al protocolo BitTorrent, incrementando el porcentaje de tráfico entre nodos del mismo ISP del 25 % al 33 %, sin que los usuarios sufran una disminución en su tasa de transferencia. i An application of network coordinates to increase intra-ISP traffic in BitTorrent Abstract Traffic generated by peer-to-peer (P2P) protocols poses a significant challenge for ISPs. On the one hand, P2P traffic represents an important fraction of the total traffic volume. On the other hand, P2P traffic is mainly symmetric, while most residential broadband connections are asymmetric. P2P protocols transform clients into content providers, causing a surge in traffic exchanged between users of different ISPs. This increases traffic costs for ISPs as traffic leaving the network of an ISP is more expensive for the ISP than traffic that flows between its internal users. In return, ISPs have started to regulate the traffic generated by P2P protocols, affecting their correct operation. Proposed solutions share the approach of modifying P2P protocols so that nodes running the protocol prefer to connect and exchange information with other nodes in the same ISP. This work presents a modification of the BitTorrent P2P protocol that increases traffic exchanged between nodes in the same ISP, without decreasing download rates for users. Our proposal modifies BitTorrent’s main algorithm so that each node running the protocol prefers to exchange information with nodes that are close latency-wise, as two nodes with low latency between them have a greater chance of being in the same ISP. In contrast to other works, our proposal does not modify the behaviour of the BitTorrent tracker (administrative information server), allowing us to keep BitTorrent’s robustness and resource utilization properties. We use the Vivaldi latency estimation mechanism so that nodes don’t have to measure latencies constantly. We implemented both Vivaldi and BitTorrent in a simulator that allows building networks having links with properties similar to residential broadband connections. Experimentation with the simulator allowed us, first, to characterize Vivaldi’s behaviour in a network of those characteristics. More important, we succeeded in validating our modification to BitTorrent, increasing the fraction of traffic exchanged between nodes in the same ISP from 25 % to 33 %, without decreasing download rates for users. ii Agradecimientos En primer lugar querı́a agradecer a mis padres y a mi hermano, que me apoyan siempre. A mis amigos del FDS: Andy, Utter, el Gordo, Nico, Cere, Moro, Biffo, Santi, Dan, Vero, Ana, Maria, Vane, Sofi y Aldi. Junto a ellos nació la idea de estudiar Ciencias de la Computación. A mis amigos de la facu: Toto, Sabi, PabloH, Eze, Fede, Luigi, Pı́ter, Guido, Mati, PabloB, PabloR, Pancho, Lata, Tommy, Lea, Droopy y Román. No me imagino haber hecho la carrera sin ellos. A las profesoras del FDS que acompañaron mi interés por la computación y la matemática: Claudia y Gloria. A la UBA, a la FCEN y al DC: por recibirme como alumno, formarme y permitir que me desempeñe como docente. A los docentes del DC, que generan el mejor ambiente. Especialmente a Chapa, Diego Garbervetsky, Santi Figueira, Serge, Dani Gorı́n, Diego Bendersky, Ale Furfaro y Diego Fernández Slezak. Al jurado, Esteban y Fernando, por tomarse el tiempo de leer la tesis y señalarme las cosas que se podı́an mejorar. A mi director, Claudio, por darme la oportunidad de hacer la tesis en este tema y guiarme durante el proceso. Finalmente, a Tamara, la persona más importante en mi vida. Estás a mi lado para todo, y fuiste a quien más tiempo le robé para la carrera y para la tesis. iii Índice 1. Introducción 1.1. Nuestro trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3 2. Marco de trabajo 2.1. Aplicaciones peer-to-peer . . . . . . . 2.2. Ubicación del contenido en Internet . . 2.3. Las redes de banda ancha residenciales 2.4. Trabajos relacionados . . . . . . . . . 2.5. El debate sobre las coordenadas . . . . 6 6 6 6 7 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Enfoque 10 4. Vivaldi 4.1. El protocolo Vivaldi . . . . . . . . . . . . . . . . . 4.2. Interpretación fı́sica . . . . . . . . . . . . . . . . . 4.3. Desplazamiento adaptativo . . . . . . . . . . . . . 4.4. Espacios . . . . . . . . . . . . . . . . . . . . . . . . 4.5. Modificaciones al protocolo Vivaldi . . . . . . . . . 4.5.1. La modificación a Vivaldi propuesta en este . . . . . . . . . . . . . . . . . . . . . . . . . trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 13 14 15 16 18 5. BitTorrent 5.1. El protocolo BitTorrent . . . . . . . . . . 5.2. Comunicación entre los peers . . . . . . . 5.2.1. Mensajes del protocolo BitTorrent 5.3. Mecanismo de choking . . . . . . . . . . . 5.4. Modo fin-de-juego . . . . . . . . . . . . . 5.5. Un ejemplo de comunicación entre peers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 19 20 21 22 22 6. El simulador SSFNet 6.1. La jerarquı́a de clases en SSF.OS . 6.2. Transmisión de información . . . . 6.3. La jerarquı́a de clases en SSF.Net . 6.4. Direccionamiento . . . . . . . . . . 6.5. El lenguaje DML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 24 25 25 26 7. Implementación de Vivaldi en SSFNet 7.1. Detalles de la implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2. La red de prueba para la simulación de Vivaldi . . . . . . . . . . . . . . . . . . . . 27 27 28 8. Resultados de la simulación de Vivaldi 8.1. Visualización de las coordenadas . . . . . . . . . . . . . 8.2. Comportamiento de la componente H . . . . . . . . . . 8.3. Distancias entre los nodos . . . . . . . . . . . . . . . . . 8.4. Distancia como indicador de proximidad . . . . . . . . . 8.5. Comportamiento de las coordenadas frente a variaciones 8.6. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de la . . . . . . . . . . . . . . . . . . . LML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 31 31 32 34 37 37 9. Implementación de BitTorrent en SSFNet 9.1. BitTorrent y la estimación de latencia . . . . . . . 9.2. BitTorrent en SSFNet . . . . . . . . . . . . . . . . 9.3. Implementación de Vivaldi a cuestas de BitTorrent 9.4. Implementación de las modificaciones a Vivaldi . . 9.5. La red de prueba para SSFNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 40 40 43 43 43 . . . . . . . . . . . . . . . iv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.Resultados de la simulación de BitTorrent 10.1. Experimentación con las modificaciones a Vivaldi . . . . . . . . . . . . . . . . . . . 10.1.1. Experimentación con la ampliación del conjunto de vecinos . . . . . . . . . 45 48 49 11.Conclusiones 53 12.Trabajo futuro 55 Índice de figuras 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Tráfico P2P como porcentaje del tráfico total [1] . . . . . . . . . . Volumen de tráfico P2P por protocolo [1] . . . . . . . . . . . . . . Cálculo de distancia en el espacio vectores de altura . . . . . . . . La red de prueba para la simulación de Vivaldi . . . . . . . . . . . Red base para la construcción, con 40 nodos . . . . . . . . . . . . . Red de 160 nodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Red del sistema autónomo . . . . . . . . . . . . . . . . . . . . . . . Visualización de las coordenadas de los nodos . . . . . . . . . . . . Componente H contra LML . . . . . . . . . . . . . . . . . . . . . . Histogramas de distancias, caso 10 ms . . . . . . . . . . . . . . . . Histogramas de distancias, caso 100 ms . . . . . . . . . . . . . . . Visualización de las coordenadas de los nodos, LML 5 ms . . . . . Visualización de las coordenadas de los nodos, LML 10 ms . . . . . Visualización de las coordenadas de los nodos, LML 20 ms . . . . . Visualización de las coordenadas de los nodos, LML 50 ms . . . . . Visualización de las coordenadas de los nodos, LML 100 ms . . . . La red de prueba para la simulación de BitTorrent . . . . . . . . . Visualización de las coordenadas calculadas por Vivaldi a cuestas caso normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualización de las coordenadas calculadas por Vivaldi a cuestas caso interés de subida . . . . . . . . . . . . . . . . . . . . . . . . . Visualización de las coordenadas calculadas por Vivaldi autónomo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de BitTorrent, . . . . . . . . . de BitTorrent, . . . . . . . . . . . . . . . . . . 2 5 17 29 29 30 30 32 33 36 36 37 37 38 38 38 44 45 46 46 Índice de cuadros 1. 2. 3. 4. 5. 6. 7. Distancias promedio en Vivaldi variando la LML . . . . . . . . . . . . . . . . . . . Porcentajes de falsos positivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distancias promedio en BitTorrent. . . . . . . . . . . . . . . . . . . . . . . . . . . . Porcentaje de piezas intercambiadas dentro del mismo AS e ISP . . . . . . . . . . Cantidad total de piezas intercambiadas . . . . . . . . . . . . . . . . . . . . . . . . Porcentaje de piezas intercambiadas dentro del mismo AS e ISP, con las modificaciones Distancias promedio en BitTorrent con modificaciones . . . . . . . . . . . . . . . . 34 35 47 48 48 50 51 Índice de algoritmos 1. 2. 3. 4. 5. Algoritmo Algoritmo Algoritmo Algoritmo Algoritmo Vivaldi, versión centralizada . . . . . . . . . . . . . . . . . . . Vivaldi, versión distribuida . . . . . . . . . . . . . . . . . . . de Vivaldi, versión distribuida con desplazamiento adaptativo de choking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de choking modificado . . . . . . . . . . . . . . . . . . . . . . v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 15 22 41 1. Introducción Las aplicaciones peer-to-peer (P2P) generan una gran proporción del tráfico en Internet (figura 1). Sin embargo, el volumen del tráfico no es el único problema para los proveedores de Internet (Internet Service Providers, ISPs). Los nodos que utilizan aplicaciones P2P generan cantidades similares de tráfico downstream (tráfico de bajada, hacia el nodo) como upstream (tráfico de subida, desde el nodo). En cambio, las conexiones de Internet de banda ancha residencial utilizadas por gran parte de estos nodos son asimétricas: el ancho de banda downstream es mayor que el ancho de banda upstream. Por lo tanto, las aplicaciones P2P presentan un desafı́o nuevo para la planificación de tráfico1 en un ISP. Esta caracterı́stica que posee el tráfico generado por las aplicaciones P2P tiene varias consecuencias. Cada nodo corriendo una aplicación P2P se conecta con otros nodos corriendo la misma aplicación ignorando completamente la estructura de la red subyacente. Esto es esperable, ya que uno de los principios de diseño básico de TCP/IP es el end-to-end principle [2]. Una interpretación de este principio es que un usuario de TCP/IP en el borde de la red (por ejemplo, una aplicación P2P) no debe preocuparse por cómo su conexión con otro nodo atraviesa la red y llega hasta ese nodo. En la visión de un nodo corriendo una aplicación P2P cualquier otro nodo que ejecute la aplicación es equivalente. Sin embargo, el resto de los nodos corriendo la aplicación no son iguales. Estos nodos pueden ser computadoras accediendo a Internet desde universidades, empresas o mediante conexiones residenciales; todos enlaces con distintas caracterı́sticas de ancho de banda2 y latencia3 . El desempeño de la aplicación P2P estará determinado por estas caracterı́sticas de las conexiones de los nodos participantes. Los nodos remotos, por lo tanto, no son equivalentes para una instancia de una aplicación P2P. Otro aspecto importante a tener en cuenta es el costo. Un ISP no tiene el mismo esquema de costos para el tráfico que ocurre entre sus nodos internos como para el tráfico que ocurre entre uno de sus nodos internos y el resto de Internet. La visión end-to-end de las aplicaciones P2P tiene entonces una consecuencia directa sobre los costos de los ISPs. La elección de un nodo por sobre otro puede implicar intercambiar tráfico dentro del ISP (tráfico intra-ISP) o tráfico entre el ISP y el resto de Internet (tráfico inter-ISP), con costos distintos para el ISP. Este tráfico inter-ISP es justamente el que las aplicaciones P2P han incrementado. En el modelo de tráfico histórico para los ISPs, los usuarios residenciales accedı́an a servicios (páginas Web, correo electrónico, etc.) ubicados en lugares más o menos definidos. Las aplicaciones P2P hacen que todos los usuarios residenciales intercambien tráfico entre ellos, cambiando el modelo de tráfico de los ISPs, e incrementando sus costos [3]. El principal uso actual de las aplicaciones P2P es el intercambio de archivos. Analizando la situación desde un punto de vista más global, el hecho que el intercambio de archivos no se realice utilizando protocolos clásicos cliente-servidor podrı́a ser beneficioso para los ISPs. Para el mismo volumen de información, el uso de protocolos P2P permite que al menos una pequeña parte del tráfico total se intercambie entre nodos del mismo ISP. Al contario, si todos los nodos del ISP bajan el mismo archivo desde servidores Web, no hay posibilidad de que nodos en el mismo ISP intercambien partes del archivo. Esto sugerirı́a que el uso de protocolos P2P para el intercambio de archivos resulta preferible para los ISPs que la alternativa cliente-servidor. El problema con este análisis es que gran parte del éxito de los protocolos P2P se debe justamente a que permitieron aprovechar mucho ancho de banda que no estaba siendo utilizado, por ejemplo (pero no únicamente) el ancho de banda de subida de muchas conexiones residenciales. 1 También llamada ingenierı́a de tráfico por algunos autores. ancho de banda de un canal de comunicación, en el sentido más técnico, es la diferencia entre la frecuencia de corte superior e inferior. La frecuencia de corte de un canal es el punto en el que la potencia de salida se ha reducido a la mitad. Este ancho de banda se conoce también como ancho de banda analógico. Está relacionado con la noción de ancho de banda más usual en computación, el ancho de banda digital, que indica la cantidad de bits que pueden ser transmitidos por el canal en un perı́odo de tiempo. 3 La latencia de un enlace de comunicación es el tiempo que tarda la información en llegar desde el emisor al receptor. Cuando medimos la latencia ida y vuelta, es decir el tiempo que tarda la información en ir desde el emisor al receptor y volver al emisor, hablaremos de Round Trip Time o RTT. 2 El 1 Figura 1: Tráfico P2P como porcentaje del tráfico total [1] Con un 50 a 80 % del tráfico total de Internet generado por protocolos P2P (figura 1 y mediciones propias en el ISP Cablevisión), no es necesariamente trivial hacer que ese tráfico utilice otros protocolos. Dicho de otra manera, parece ser que la única manera de sostener el tráfico generado por el intercambio de archivos es utilizando protocolos P2P, y entonces la comparación del párrafo anterior deja de ser posible. Los protocolos P2P permitieron un incremento en el volúmen de tráfico que hubiera sido difı́cil de sostener en una situación cliente-servidor, justificando la necesidad de contener el aumento de tráfico inter-ISP. Este trabajo surge entonces ante el aumento de volumen y el cambio de comportamiento del tráfico IP debido a la utilización por parte de los usuarios de las aplicaciones P2P. Presentamos un aporte que contribuye a aumentar el tráfico intra-ISP de estas aplicaciones, disminuyendo ası́ el tráfico inter-ISP. Creemos que es necesario un enfoque mixto en el cual las aplicaciones P2P contribuyan a que su tráfico sea más ameno para los ISPs, y éstos faciliten el intercambio de información entre sus nodos, por ejemplo aumentando el ancho de banda disponible para tráfico intra-ISP. Las soluciones unilaterales de los ISPs, basadas en técnicas clásicas de regulación de tráfico, no son suficientes. Si bien han amortiguado el efecto de las aplicaciones P2P, esto ha sido a costa de su funcionalidad. El volumen de tráfico es tan grande que la regulación debe ser muy agresiva, dejando a las aplicaciones, en muchos casos, inutilizables. Esto ha despertado una ola de crı́ticas a nivel mundial por parte de los usuarios, y muchas veces los reclamos han contado con el apoyo de los organismos de control correspondientes. Tenemos como ejemplo el caso del ISP Comcast [4] que se vio forzado a cambiar su polı́tica de regulación de tráfico luego de las crı́ticas de los usuarios y la intervención de la FCC (el organismo de control estadounidense). Frente a esta situación, algunas aplicaciones P2P ya están considerando incluir mecanismos para disminuir el tráfico inter-ISP [5]. 2 1.1. Nuestro trabajo En este contexto, nuestro trabajo presenta un mecanismo para aumentar el porcentaje de tráfico intra-ISP dentro del total de tráfico generado por la aplicación P2P BitTorrent [6]. La elección de BitTorrent se debe a su popularidad, siendo el protocolo P2P más utilizado en términos de cantidad de tráfico generado (figura 2 y mediciones propias en el ISP Cablevisión). En BitTorrent, los nodos o peers colaboran para transferir un archivo en particular. El conjunto de peers que está bajando el archivo se denomina swarm. El archivo a distribuir se divide en piezas de tamaño fijo, de manera de que cada peer bajando el archivo pueda ir subiendo a otros peers las piezas que ya bajó. Nuestro objetivo fue encontrar maneras de guiar la comunicación de los peers de un swarm de BitTorrent para aumentar el tráfico intra-ISP. En el caso óptimo, una vez que un fragmento del archivo a bajar es recibido por un peer de un ISP, el resto de los peers conectados al mismo ISP obtendrı́an el fragmento de ese peer. Este serı́a el punto de tráfico inter-ISP mı́nimo: cada pieza entra al ISP exactamente una vez, y luego es replicada dentro del ISP. Esta situación es difı́cil de lograr. Por un lado, requerirı́a un enorme conocimiento de la estructura de los ISPs usados por los peers presentes en el swarm. Se necesitarı́a saber siempre cuando dos peers pertenencen al mismo ISP, y con este conocimiento, guiar el intercambio de piezas. Por otro lado, en una enorme proporción de los casos, el peer que obtiene la pieza no tendrá suficiente ancho de banda para atender los pedidos de todo el resto de los peers que la quieren replicar dentro del ISP, por lo tanto esta solución no será óptima en términos de throughput4 . Elegimos tomar un camino más indirecto, en el cual cada peer aprovecha información que puede obtener de manera local para realizar inferencias que le ayudan a elegir otros peers dentro del mismo ISP. Haciendo que cada peer intercambie piezas preferentemente con estos peers cercanos esperamos aumentar el tráfico intra-ISP del swarm. El hecho básico que justifica la utilización de estos métodos indirectos es que generalmente es mucho más fácil para un nodo llegar hasta otro nodo en su mismo ISP que hasta un nodo en otro ISP. Los distintos ISPs tienen pocos puntos de contacto entre sı́. Por lo tanto, el tráfico IP cambia de ISP en pocos lugares. En consecuencia, todos los nodos de un ISP pasarán por el mismo lugar para salir del ISP, de lo cual se desprende que para comunicarse entre sı́ solamente tendrán que llegar, en peor caso, hasta ese punto. Como siempre, pueden existir excepciones a este hecho. Si dos nodos de un ISP en el cual la latencia hasta ese punto de “salto” es muy alta tratan de comunicarse entre sı́, posiblemente tengan una latencia mayor que cualquiera de ellos comunicándose con un nodo en otro ISP donde la latencia entre el nodo y el punto de salto sea más baja. En particular, las conexiones de banda ancha residencial tienen esta caracterı́stica: la latencia entre el nodo y el punto en el que la conexión deja el ISP puede representar una parte grande de la latencia total. En este caso, puede ser más rápido recorrer una vez esta latencia y luego llegar a un nodo fuera del ISP que recorrer dos veces esa latencia para comunicar dos nodos dentro de ese ISP. Por ejemplo, consideremos dos nodos en un ISP que provee banda ancha utilizando cablemódem. Si la latencia introducida por cada cable coaxil es del orden de los 10 ms (un caso de congestión leve), la latencia entre ambos nodos es de 20 ms. Si uno de esos nodos se conectara con otro nodo por ejemplo en una universidad, la latencia total entre el ISP original y el nodo en la universidad podrı́a ser menor a 10 ms, haciendo que la comunicación entre dos nodos en distintos ISPs tenga menor latencia que una comunicación intra-ISP. Estas excepciones no minimizan la situación existente actualmente en Internet: si dos nodos están cerca en términos de latencia, es muy probable que estén en el mismo ISP. La recı́proca no vale: es posible que dos nodos que están lejos pertenezcan al mismo ISP, especialmente si es un ISP que abarca distintas zonas geográficas. Esto no es un problema, ya que basta identificar un subconjunto de peers que pertenezcan al mismo ISP, no es necesario encontrarlos todos. Nos basamos en este hecho para guiar el comportamiento de los peers. Cada peer va a preferir otros peers dentro del swarm contra los que tenga una latencia baja. El problema es que para conocer esta latencia es necesario medirla, y esta medición podrı́a ser muy costosa. La medición 4 Es decir, la cantidad de bits que el swarm puede intercambiar en un perı́odo de tiempo 3 implica tráfico, ya que se requiere enviar un paquete que vaya y vuelva entre dos nodos. Una propuesta en la que todos los nodos miden la latencia entre sı́ tendrı́a mucho costo extra. Para evitar este costo es necesaria alguna manera de poder estimar la latencia entre los peers del swarm. La estimación de latencia no es un problema nuevo. Se han desarrollado numerosos mecanismos que permiten a cada nodo, con información local, estimar la latencia contra otros nodos, evitando comunicación (o comunicación extra) con esos otros nodos. En particular, existen esquemas de coordenadas virtuales en los cuales se asignan coordenadas a cada nodo de manera de que la distancia entre las coordenadas sea un buen estimador de la latencia. En este trabajo elegimos el protocolo Vivaldi [7]. Utilizamos coordenadas virtuales asignadas por Vivaldi para estimar la latencia entre los peers del swarm de BitTorrent, de manera de guiar el intercambio de piezas de los peers y favorecer el tráfico intra-ISP. Presentamos una variante del algoritmo central de BitTorrent que llamamos upload appeal o interés de subida, en la que cada nodo, con las demás variables iguales, prefiere intercambiar piezas con peers cercanos antes que lejanos. Esta modificación permite pasar, en simulaciones, el porcentaje de tráfico intra-ISP de un 25 % a un 33 %, sin disminuir la tasa de transferencia del swarm. Cada nodo intercambia piezas con un subconjunto de los peers con los que está conectado. A su vez, en la mayorı́a de los sistemas P2P cada nodo se conecta con un subconjunto aleatorio del conjunto total de peers. Al modificar solamente el intercambio de piezas estamos manteniendo el conjunto (aleatorio) de peers con el que cada nodo se conecta. En consecuencia, solamente podremos aumentar el tráfico intra-ISP si dentro de ese subconjunto aleatorio hay peers en el mismo ISP. Otra manera atacar el problema consiste en que los nodos se conecten con subconjuntos de peers en los cuales haya nodos del mismo ISP [8, 9, 10]. Sin embargo, varios protocolos P2P, entre ellos BitTorrent, se basan en la elección aleatoria para garantizar propiedadez de robustez y utilización de recursos [6]. Modificar el intercambio de piezas pero no con qué peers se conecta cada nodo nos permite mantener estas propiedades, que otras soluciones deben considerar explı́citamente. Creemos que el aporte principal de este trabajo es el uso exitoso de un sistema de coordenadas para guiar el intercambio de piezas en BitTorrent, aumentando el tráfico intra-ISP. No hemos encontrado otras descripciones del uso de sistemas de coordenadas para guiar el tráfico en BitTorrent. Vivaldi está implementado en el cliente de BitTorrent Vuze5 , pero la información de coordenadas no es utilizada para guiar el intercambio de piezas, sino para hacer más eficientes las consultas a una base de datos distribuida. Por otro lado, hay literatura que critica el comportamiento de los sistemas de coordenadas en redes reales [11, 12]. Para justificar nuestro uso de Vivaldi incluimos un análisis de su comportamiento en una red con enlaces de banda ancha residencial, analizando qué factores de la red afectan la calidad de la estimación provista por las coordenadas. Revisaremos primero algunos temas básicos en la sección 2, Marco de trabajo. Luego describiremos en profundidad nuestro enfoque en la sección 3. A continuación presentaremos los protocolos Vivaldi y BitTorrent en las secciones 4 y 5; y el simulador que utilizamos en la sección 6. Describiremos las implementaciones que realizamos de Vivaldi y BitTorrent en el simulador en las secciones 7 y 9, y revisaremos los resultados de la simulación en las secciones 8 y 10. Finalmente presentamos nuestras conclusiones en la sección 11 y una corta descripción del trabajo futuro en la sección 12. 5 Este cliente se llamaba anteriormente Azureus, usaremos ambos nombres indistintamente en este trabajo. 4 Figura 2: Volumen de tráfico P2P por protocolo [1] 5 2. 2.1. Marco de trabajo Aplicaciones peer-to-peer Las aplicaciones peer-to-peer (P2P) son aplicaciones de red en las que los nodos se conectan entre sı́ sin distincion de roles. En el modelo tradicional cliente-servidor presente en Internet habı́a una diferencia clara entre cada extremo de una conexión; el cliente realizaba el pedido y el servidor lo respondı́a. En las aplicaciones peer-to-peer ambas partes de la conexión son equivalentes, pudiendo ambos realizar pedidos y responderlos. El pricipal uso de las aplicaciones peer-to-peer es la distribución de archivos. A medida que el tamaño de los archivos a distribuir en Internet aumenta, sube de la misma manera el ancho de banda requerido por el servidor del archivo para poder proveerlo a los múltiples clientes que lo demandan. Inicialmente, las aplicaciones peer-to-peer permitı́an a sus usuarios solamente compartir archivos completos. La aplicación P2P permitı́a a un usuario acceder a los archivos compartidos de todos los otros usuarios de la misma aplicación, y bajar directamente de esos usuarios. Ejemplos de esto son Napster, Gnutella o Kazaa [13]. En el caso de Napster se contaba con un servidor central que coordinaba la base de datos de archivos compartidos por todos los usuarios, y en el caso de Gnutella no habı́a ningún servidor central. El mismo protocolo Gnutella permitı́a realizar búsquedas de archivos de manera completamente distribuida [13, 14]. Fue BitTorrent, sin embargo, la primera aplicación de uso masivo en la cual los peers cooperaban para bajar un archivo en particular. Al utilizar BitTorrent, los nodos que bajan el archivo a su vez contribuyen ancho de banda de subida, de manera de mantener casi constante el ancho de banda que el proveedor del archivo requiere para proveerlo a un grupo creciente de nodos. Cada nuevo nodo bajando el archivo contribuye ancho de banda de subida. 2.2. Ubicación del contenido en Internet El modelo cliente-servidor no es simplemente una caracterı́stica técnica. La situación en Internet, durante los últimos años, consistı́a en proveedores de contenido por un lado y consumidores de este contenido por otro. Habı́a una clara diferenciación entre los sitios Web accedidos por los clientes y los nodos que los clientes utilizaban para acceder a estos sitios Web. Por lo tanto, tenı́a sentido que las aplicaciones fueran cliente-servidor, y que tanto los servicios de acceso a Internet como el tráfico fuera asimétrico, con mayor ancho de banda y mayor tráfico en sentido downstream. Más recientemente ha habido un desplazamiento en la generación de contenido hacia el lado del cliente. Los blogs6 , Twitter [15] y YouTube [16] son ejemplos en los cuales la generación de contenido está en manos de las mismas personas que lo consumen. El crecimiento de las aplicaciones P2P en Internet no es, por lo tanto, un hecho aislado. Desde la aparición de BitTorrent las aplicaciones P2P han ganado una fracción considerable del tráfico total en Internet, tráfico que corresponde mayormente a transferencia de archivos. La distribución de videos (como YouTube) está sufriendo una evolución similar, al punto de que ya se está considerando seriamente utilizar esquemas P2P para distribuir video, especialmente video de alta definición que requiere mucho ancho de banda [17]. Esto agravarı́a todavı́a más el problema para los ISPs. 2.3. Las redes de banda ancha residenciales Una de las causas de este cambio en el tráfico fue la masificación de las conexiones de banda ancha residenciales. Tanto el mayor ancho de banda como la posibilidad de estar conectado constantemente a Internet contribuyeron a que los clientes pasaran a ser generadores de contenido. Estas conexiones de banda ancha son ahora parte del problema. Los clientes generan mucho más tráfico upstream que cuando las tecnologı́as de banda ancha residencial se diseñaron. 6 Un blog (apócope de weblog) es un sitio Web actualizado periódicamente que recopila cronológicamente textos o artı́culos de uno o varios autores. 6 En el caso del cablemódem, la tecnologı́a es en sı́ misma asimétrica. Los ISPs de cablemódem construyen redes HFC (Hybrid Fibre-Coaxial), redes hı́bridas de fibra óptica y cable coaxil. La fibra óptica se utiliza para conectar las distintas dependencias del ISP, y el cable coaxil cubre la última milla: la conexión entre el último equipo del ISP (el Cable Modem Termination System, CMTS) y el primer equipo del cliente (el cablemódem). En un CMTS confluyen muchos clientes, conectados todos al mismo cable coaxil. La conexión de bajada (desde el CMTS hacia el cablemódem) se multiplexa en frecuencia de manera de que cada cliente disponga de un canal propio. Para la conexión de subida (desde cada cablemódem hacia el CMTS) se utiliza un sólo canal compartido entre todos los clientes, multiplexado en el tiempo, Cuando un cablemódem quiere transmitir al CMTS debe pedir una ranura de tiempo antes de enviar información [18]. Esta diferencia en la implementación fı́sica tiene su consecuencia obvia en el ancho de banda y en la latencia. El ancho de banda downstream es mayor que el ancho de banda upstream, y su latencia es menor. Dado que el tráfico de subida debe esperar una ranura de tiempo, su latencia suele ser muy mala, contribuyendo en enorme proporción al RTT entre el cablemódem y el CMTS [18]. Mediciones normales de este RTT en un ISP en Argentina dan resultados de 12 ms, de los cuales 10 ms corresponden al tramo upstream7 . Con la tecnologı́a DSL (Digital Subscriber Line) sucede lo mismo. Tanto razones técnicas como económicas hicieron de la versión asimétrica una opción más razonable, y de esta manera se masificó el ADSL (Asymmetric DSL). En ADSL la última milla se cubre con cable telefónico, y se utiliza multiplexación en frecuencia para poder utilizar la misma lı́nea para transmisión de voz y de datos. El equivalente del CMTS en ADSL es el DSLAM, DSL Access Multiplexer. La velocidad del enlace entre el módem DSL del cliente y el DSLAM del ISP depende mucho de la distancia entre ambos. Para salvar este problema se utilizan técnicas de procesamiento de señales, corrección de errores y compresión de datos [18]. Todo este procesamiento agrega latencia en la transmisión, estando de nuevo frente a un escenario de ancho de banda asimétrico y de alta latencia, como en cablemódem, pero por razones distintas. En ambos casos un gran porcentaje del RTT de un nodo en una red de banda ancha residencial corresponde a la latencia introducida por la última milla. Llamaremos a esta latencia la LML (last mile latency, latencia de la última milla). 2.4. Trabajos relacionados A diferencia de este trabajo, las soluciones existentes para el problema del tráfico generado por las aplicaciones P2P se centran en guiar la elección que cada peer hace de los otros peers con los cuales se conecta. La idea básica de guiar la elección de peers para aumentar el tráfico intra-ISP es presentada por Bindal et al. en [8] y con una perspectiva más matemático-económica por Adler et al. en [9]. El enfoque de [8] requiere el uso de un oráculo8 que resuelve la pertenencia de peers a ISPs. Teniendo esta información se muestra la factibilidad de utilizarla para que el tráfico intraISP se mantenga relativamente constante a medida que aumenta la cantidad de peers, sin reducir la velocidad de bajada del archivo. Podemos distinguir dos corrientes opuestas en estas soluciones. En un caso, que podemos llamar explı́cito, los nodos cooperan con los ISPs de manera directa para resolver la pertenencia de peers a ISPs. En el otro, que podemos llamar implı́cito o indirecto, los peers utilizan información de la red para intentar elegir peers dentro del mismo ISP. Dentro del primer caso encontramos el proyecto P4P [10], que llevan adelante Haiyong Xie et al. La propuesta se basa en el uso de servidores extra en las redes P2P, provistos por cada ISP. Estos servidores estarı́an a cargo de proveer información sobre estado y topologı́a de la red, polı́ticas del ISP y capacidad de la red. Este modelo cuenta en principio con bastante apoyo de la industria (las pruebas realizadas, si bien algo limitadas, involucran al ISP Verizon [19] y más recientemente, a Comcast [20]. Nuestra evaluación es que éste es un modelo ligeramente ad-hoc pero sobre todo muy centralizado, ya que depende de un servidor único en cada ISP. Esto va en contra del espı́ritu de los sistemas P2P, que son inherentemente distribuidos. Por otro lado, la 7 Mediciones en el ISP Cablevisión. oráculo a una entidad, posiblemente imaginaria, que resuelve un problema para el cual no se conoce solución; o que de existir una manera de resolver el problema, abstrae los detalles de cómo se arriba a la solución. 8 Llamamos 7 cooperación de la aplicación P2P con el ISP debe ser explı́cita, y esto es problemático ya que involucra confiar en el comportamiento del servidor provisto por el ISP. A grandes rasgos, la solución planteada por el proyecto P4P intenta acercarse al óptimo utilizando información explı́cita: se obtiene la información necesaria acerca de la topologı́a de la red del ISP, y luego se toman decisiones en base a esa información. La manera más simple de tener acceso a esta información es que el ISP la provea, y para que esto sea posible es necesario introducir servidores nuevos en la red, propiedad de cada ISP. Como ya hemos mencionado, nos parece una solución demasiado ad-hoc para el problema, y la introducción de servidores únicos en un protocolo P2P va en contra de la idea básica del mismo protocolo. Una manera de resolver la pertenencia de peers a ISPs sin requerir cooperación directa entre ambos es utilizar el sistema WHOIS9 . Una consulta WHOIS permite conocer la entidad dueña de una dirección IP, y de esta manera se podrı́a decidir si dos peers están en el mismo ISP o no. El principal problema que encontramos con WHOIS es que la información es administrativa más que topológica de la red. Existen casos en el que nodos de un mismo ISP poseen direcciones IP en rangos que están registrados a distintas entidades, por ejemplo cuando dos ISPs se combinan. También puede suceder que un ISP tenga registrados rangos de direcciones IP en un paı́s distinto que en el que opera, por razones comerciales o de ruteo. Por otro lado, la respuesta de una consulta WHOIS es el nombre de la entidad dueña de la dirección IP. La única manera de utilizar esta información en un programa es realizando una comparación de cadenas de caracteres. Esto tiene como consecuencia que la información obtenida de WHOIS sea discreta, en el sentido que si la respuesta puede ser positiva o negativa, pero no hay posibilidad de valores intermedios. Analizaremos con más detalle la posibilidad de utilizar WHOIS al discutir el trabajo futuro. Por otra parte, en el segundo caso las soluciones existentes intentan obtener información sobre la topologı́a de la red realizando observaciones y mediciones indirectas. Una solución de referencia es Ono [21], desarrollado por Choffnes y Bustamante. Se proponen aprovechar la infraestructura de CDNs (Content Distribution Networks)10 para obtener información sobre la agrupación de peers en ISPs. Ono propone utilizar la redirección DNS provista por las CDNs para inferir la cercanı́a de los peers de un sistema P2P. Disminuir el tráfico inter-ISP tiene un efecto directo sobre los costos de un ISP. Creemos que un cambio en las aplicaciones P2P que tienda a controlar el tráfico generado por ellas podrı́a ser un incentivo para que los ISPs no limiten de la misma manera el tráfico interno que el tráfico externo. Cuánto más ancho de banda tengan los peers del mismo ISP entre sı́, más tráfico inter-ISP podrá transformarse en tráfico intra-ISP. 2.5. El debate sobre las coordenadas El crecimiento de las aplicaciones peer-to-peer ha reavivado el debate sobre la estimación de latencia. Para las aplicaciones peer-to-peer es útil tener la posibilidad de aproximar la latencia entre sus nodos, que suelen estar distribuidos por todo el mundo. Una estimación correcta de la latencia que permita guiar el intercambio de datos puede ser la diferencia entre performance aceptable y mala, del lado de la aplicación; y entre distintos esquemas de costos para el ISP. Esto ha generado la aparición de nuevos mecanismos y protocolos dedicados a la estimación de latencia, entre los que podemos mencionar a GNP [22], Vivaldi [7] y Meridian [12]. Tanto GNP como Vivaldi se enmarcan en los mecanismos de coordenadas virtuales, que consisten en 9 WHOIS es un protocolo utilizado para averiguar la entidad dueña de un nombre de dominio, dirección IP o sistema autónomo. 10 Las CDNs, como su nombre lo indica, son redes de distribución de contenido. Funcionan como nexo entre los proveedores, por ejemplo los sitios Web de canales de televisión, y los consumidores en los ISPs. Colocando servidores propios en los ISPs, servidores que cachean o almacenan enteramente el contenido, las CDNs se aseguran de que los clientes lo accedan de manera local. Esto es especialmente importante para la distribución de video, en la cual una latencia razonable es importante para que el video no se vea entrecortado. La distribución de usuarios a servidores se realiza mediante redirecciones DNS. Cuando un usuario solicita contenido almacenado en una CDN, la dirección IP que recibe para una URL dada se resuelve teniendo en cuenta su localización geográfica y en la red. De esta manera, accederá a la copia del contenido presente en el servidor más cercano (geográficamente, o en términos de latencia) a él. 8 asignar un identificador o coordenada 11 a cada nodo participante de la red. Cada nodo, teniendo la información de su coordenada y la coordenada de un nodo remoto, puede estimar la latencia contra ese nodo remoto realizando una operación local con las coordenadas. Meridian, en cambio, prescinde de asignar coordenadas a los nodos y utiliza un mecanismo de medición directa. Los mecanismos de coordenadas virtuales han sido objeto de un fuerte debate desde su introducción para su utilización en el problema P2P. Sus crı́ticos argumentan que la necesidad de etiquetar cada nodo con un identificador acarrea inevitablemente una cuota de error que mecanismos que no utilizan coordenadas como Meridian pueden evitar. Los defensores de las coordenadas (entre los que nos encontramos) consideran que los márgenes de error son bajos, y que incluso ası́ la información no deja de ser útil. Este trabajo contribuye al debate mostrando que incluso con error, las coordenadas son útiles cuando uno no quiere información absoluta de latencia sino algo más simple: distinguir peers cercanos de peers lejanos, de manera relativa. Gran parte de la discusión se centra en la factibilidad de utilizar los sistemas de coordenadas en aplicaciones reales, fuera del ámbito académico. Los crı́ticos sostienen que la mayor parte de la experimentación con sistemas de coordenadas se ha realizado en ambientes de experimentación controlados como PlanetLab [23]. La red PlanetLab está conformada exclusivamente por nodos en universidades y centros de investigación. Estos nodos tienen conexiones a Internet que no sufren los problemas de latencia y ancho de banda presentados por las conexiones residenciales de banda ancha. Por esta razón, los resultados de la experimentación sobre PlanetLab podrı́an no ser representativos del comportamiento de una aplicación en Internet en general. En particular, la alta LML de las conexiones de banda ancha residencial podrı́an generar coordenadas con mucho error [7], haciendo que los sistemas de coordenadas se comporten mucho peor en la realidad que en la experimentación en PlanetLab. Por otro lado, la evaluación de los sistemas de coordenadas, especialmente en el ámbito académico, se suele realizar de manera autónoma. Las coordenadas se construyen para un conjunto de nodos que no está ejecutando ninguna aplicación en particular. El objetivo, sin embargo, es que las coordenadas contribuyan a las decisiones de alguna aplicación. El mejor caso es que la información del protocolo de coordenadas se intercambie a cuestas del tráfico normal generado por esa aplicación, ya que entonces se estarı́a obteniendo la información necesaria para estimar la latencia sin generar tráfico extra. No obstante, sucede que muchas veces los sistemas de coordenadas son sensibles a los patrones de tráfico, y esta manera de intercambiar la información puede degradar las coordenadas notablemente, como se describe en [11]. Más allá de los detalles, la cuestión básica es si Internet tiene una topologı́a suficientemente amigable como para ser capturada por un espacio métrico de pocas dimensiones. ¿Es Internet “plana”, en el sentido dimensional? El debate está abierto, con argumentos de ambos lados. En [24], por ejemplo, se argumenta que las tecnologı́as P2P llevarán a un “aplanamiento” de Internet. 11 Se utiliza el término coordenada ya que estos identificadores suelen ser elementos de un espacio métrico determinado. 9 3. Enfoque Este trabajo propone utilizar coordenadas virtuales para la estimación de latencia en un swarm BitTorrent. Esta información de latencia permite que los peers del swarm intercambien piezas preferentemente con otros peers de su mismo ISP, y de esta manera se aumenta el tráfico intraISP en el swarm. Una parte importante del uso de aplicaciones P2P se da en conexiones de banda ancha residencial. El único análisis que encontramos del comportamiento de los sistemas de coordenadas fuera de simuladores o entornos de experimentación se encuentra en [11]. Allı́ se presenta un estudio de la implementación del protocolo Vivaldi en el cliente de BitTorrent Azureus. Sin embargo, Azureus no utiliza la información de coordenadas para guiar el intercambio de piezas o la elección de peers, sino para hacer más eficiente la implementación de una DHT12 . [11] muestra las limitaciones de Vivaldi en una implementación real en Internet intercambiando la información de coordenadas a cuestas del tráfico de otra aplicación, y propone modificaciones a Vivaldi para superarlas. Sin embargo, no permite caracterizar el comportamiento de Vivaldi en las condiciones de las redes de banda ancha residencial, ni su uso como estimador de latencia para guiar el intercambio de piezas en BitTorrent. Fue necesario entonces caracterizar el comportamiento de Vivaldi en entornos de banda ancha residencial. Para esto desarrollamos una implementación de Vivaldi sobre el simulador SSFNet [25], el cual permite diseñar redes con enlaces de latencia variable y cualquier interconexión de nodos. Ideamos además una pequeña modificación a Vivaldi que intenta minimizar el efecto negativo de los enlaces de banda ancha residencial en la calidad de las coordenadas; la incluimos en la implementación para poder validarla. Elegimos Vivaldi como mecanismo de estimación de latencia en parte porque ya estaba implementado en Azureus, pero sobre todo porque es un protocolo completamente distribuido. Otros sistemas de coordenadas previos, como GNP [22], requieren un pequeño número de nodos “distinguidos” que se utilizan para realizar el cálculo de coordenadas con mecanismos de triangulación. Vivaldi resulta una mejor elección para la situación de un swarm de BitTorrent. Utilizamos el simulador SSFNet inspirados por [26], donde se desarrolla una implementación de Gnutella sobre SSFNet con el mismo objetivo de aumento de tráfico intra-ISP, aunque sin el uso de sistemas de coordenadas. SSFNet permite construir redes especificando tanto nodos como routers y caracterizando los enlaces en base a su latencia y tasa de transferencia. De esta manera se tiene la posibilidad de simular un protocolo o aplicación en redes de cualquier caracterı́stica, por ejemplo redes que incluyan enlaces de banda ancha residencial. Por otro lado, la simulación en SSFNet cubre desde la capa de aplicación hasta la capa IP13 , por lo tanto las redes sufren congestión y de esta manera su comportamiento se aproxima mejor a la realidad que en una simulación a nivel de aplicación. Construimos una red con enlaces de banda ancha residencial inspirada en un ISP grande de Argentina y evaluamos nuestra implementación de Vivaldi. Con estos resultados desarrollamos, también sobre SSFNet, una implementación de BitTorrent, ya que no encontramos disponible ninguna herramienta que nos permitiera experimentar con BitTorrent al nivel que necesitábamos. Sobre esta implementación validamos nuestra modificación al algoritmo central de BitTorrent, que consiste en utilizar la información de cercanı́a en el momento de decidir a qué peers un nodo va a subir piezas. En la implementación original de BitTorrent esta elección se realiza teniendo en cuenta la tasa de transferencia de los peers hacia el nodo. Nuestra modificación utiliza la información de latencia para desempatar entre peers que tengan tasas de subida similares. De esta manera intentamos garantizar que los nodos no perderán velocidad de bajada, sino que redirigirán 12 Una DHT (Distributed Hash Table) es un sistema totalmente distribuido que provee un servicio de búsqueda de pares clave-valor similar a una tabla de hash. Cualquier nodo participante en la DHT puede obtener de manera eficiente el valor asociado a cualquier clave. La responsabilidad de mantener la asociación entre claves y valores se distribuye entre los nodos de manera de que la llegada y partida de nodos del sistema genere una mı́nima perturbación. Esto posibilita que las DHTs escalen a una gran cantidad de nodos manejando llegadas, partidas y fallas constantes de sus participantes. En BitTorrent se utiliza una DHT para implementar un tracker distribuido y ası́ eliminar el único punto centralizado del protocolo. 13 La capa de red en el modelo OSI. 10 el tráfico para, en caso que se pueda y el resto de los factores sea similar, intercambiar información entre peers del mismo ISP. Llamamos a este mecanismo upload appeal o interés de subida. Nuestra implementación de BitTorrent intercambia la información de coordenadas Vivaldi a cuestas del mismo tráfico generado por el protocolo. Creemos que ésta es la manera más simple para que las aplicaciones P2P tengan posibilidad de estimar la latencia entre los nodos corriendo la aplicación. La carga extra de datos es mı́nima, ya que las coordenadas son como máximo 16 bytes en mensajes que pueden tener varios kilobytes. Debido a esta decisión implementamos, para su uso con BitTorrent, las modificaciones a Vivaldi sugeridas en [11], y las incluimos en la evaluación. Evaluamos cómo las coordenadas construı́das por Vivaldi respetan la estructura de la red subyacente, y la factibilidad de utilizar estas coordenadas para distinguir peers dentro del mismo ISP. Dado que nuestro objetivo principal es aumentar el tráfico intra-ISP de los swarms BitTorrent, esa fue la métrica que utilizamos en la evaluación de nuestra modificación al protocolo. No obstante, también analizamos el comportamiento de Vivaldi en la implementación de BitTorrent, para poder cuantificar el impacto de utilizar sistemas de coordenadas a cuestas de una aplicación, frente a utilizarlos de manera autónoma. 11 4. Vivaldi Muchas aplicaciones de red necesitan medir o poder estimar la latencia entre los nodos utilizando la aplicación. En nuestro caso, esta información serı́a útil para guiar el comportamiento de los peers del swarm BitTorrent. La solución más simple es realizar la medición de latencia en cada momento en que se necesite. Sin embargo, esto puede resultar en un gasto innecesario o peor, inaceptable si la cantidad de nodos es grande o la medición es costosa. Otra posibilidad es que los nodos estimen la latencia entre sı́ de manera local, sin acceder a la red. Cada nodo deberá tener suficiente información para poder realizar la estimación, pudiendo obtenerla de la comunicación realizada por la aplicación, o intercambiándola explı́citamente con el resto de los nodos. Mientras este intercambio requiera menos ancho de banda que la medición directa, esta estrategia será una mejora. Por otro lado, una vez que los nodos poseen esta información, las estimaciones no requieren acceso a la red. Esta información podrı́a ser la “ubicación” de los nodos, de manera que la distancia entre las ubicaciones de dos nodos sea una buena estimación de la latencia entre ellos. Buscaremos entonces embeber 14 los nodos en un espacio métrico, asignando una coordenada a cada uno de ellos, de manera que la distancia entre las coordenadas de cualquier par de nodos sea una buena estimación de la latencia entre ellos. 4.1. El protocolo Vivaldi Vivaldi [7] es un protocolo desarrollado para atacar el problema de la estimación de latencia. Propone un mecanismo para que cada nodo pueda ajustar su propia coordenada, a medida que conoce las coordenadas de otros nodos y mide su latencia contra ellos; este mecanismo es independiente del espacio métrico elegido. La idea básica del protocolo es que con una cantidad de mediciones mucho menor a la cantidad total de nodos, cada nodo podrı́a obtener una coordenada que le permita estimar la latencia contra cualquier otro nodo, conociendo solamente la coordenada de ese nodo. Las latencias en Internet, sin embargo, suelen escapar a intentos de describirlas en función de geometrı́as o espacios métricos determinados. El ruteo de paquetes suele estar afectado por decisiones de negocios, y la conectividad en el núcleo de la red debe acomodar intereses económicos. Esto genera numerosas violaciones de la desigualdad triangular 15 : puede suceder que sea más rápido (en términos de latencia) pasar por un nodo intermedio para llegar de un nodo a otro, que recorrer el enlace que conecta esos dos nodos directamente. Dado que las métricas para estos espacios deben cumplir la desigualdad triangular, una inmersión 16 de nodos de Internet en un espacio métrico nunca será exacta, pues como mı́nimo los pares de nodos que rompen la desigualdad triangular no serán embebidos respetando la distancia entre sı́. El protocolo Vivaldi busca minimizar la suma del cuadrado de los errores entre pares de nodos, valor que que llamaremos E: XX E= (Lij − kxi − xj k)2 i j Lij es la latencia entre el nodo i y el nodo j. xi y xj son las coordenadas de los nodos i y j respectivamente, y entonces kxi −xj k es la distancia entre la coordenada del nodo i y la coordenada del nodo j. Esta distancia será la estimación de latencia, y por lo tanto Lij − kxi − xj k es el error de la estimación para el par de nodos i, j. 14 En este contexto, embeber un conjunto (por ejemplo, un conjunto de nodos) en un espacio significa incluir estos nodos en el espacio, no directamente sino asociando cada elemento del conjunto con un elemento del espacio. De esta manera los elementos del conjunto toman la estructura del espacio, ya que las operaciones del espacio se pueden aplicar a los elementos del conjunto utilizando los elementos del espacio asociados. 15 La desigualdad triangular afirma que en cualquier triángulo la longitud de uno de los lados no puede nunca superar a la suma de las longitudes de los otros dos. 16 Llamamos inmersión al proceso de embeber un conjunto en un espacio métrico. 12 4.2. Interpretación fı́sica El algoritmo Vivaldi simula el comportamiento de una malla de resortes. Imaginemos que tenemos puntos representando los nodos, los fijamos de manera que no se puedan mover, y los unimos entre sı́ con resortes. El resorte que utilizamos para unir dos puntos tiene una longitud en reposo (cuando no se lo está estirando o comprimiendo) igual a la latencia entre los nodos representados por los puntos. Después de conectar todos los resortes, liberamos los puntos. Es lógico pensar que el sistema no va a quedar estático: una vez que empezamos a conectar resortes, puede ser que para conectar algún resorte hayamos tenido que estirarlo o contraerlo. Este resorte va a hacer fuerza para volver a su posición de reposo, pero al hacer esto va a empujar o tirar del punto que representa al nodo y por lo tanto va a empujar o tirar de otros resortes, lo que va a generar una fuerza contraria. El estado de reposo de la malla será cuando cada resorte tire de manera que ningún punto se mueva: es el estado de mı́nima energı́a. En este estado, es de esperar que la longitud de cada resorte sea parecida a su longitud en reposo: la fuerza ejercida por el resorte es proporcional al desplazamiento desde la situación de reposo. Si el resorte estuviera muy estirado estarı́a ejerciendo mucha fuerza y tendrı́a que estar siendo contrarrestado por otros resortes ejerciendo también mucha fuerza. Este estado de mı́nima energı́a minimiza el error E. La ubicación de cada punto en el estado de reposo de la malla será la coordenada final del nodo. Dado que la longitud del resorte en ese caso será cercana a la longitud en reposo del resorte, es de esperar que la distancia entre coordenadas (la longitud del resorte en el estado de reposo de la malla) sea una buena estimación de la latencia (la longitud del resorte en reposo). La longitud del resorte cuando la malla está en reposo no es similar a la longitud del resorte en reposo: en el primer caso lo que está en reposo es la malla entera, y es posible que esto genere que el resorte esté ligeramente estirado o comprimido. De esta manera, cada resorte tira de los puntos a los que está sujeto con una fuerza proporcional a la diferencia D entre su longitud en reposo (la latencia, Lij ), y su longitud con la malla en reposo (la distancia, kxi − xj k): D = (Lij − kxi − xj k) Esa fuerza se ejerce en la dirección dada por el vector unidad ~u 17 correspondiente a la recta que pasa por xi y xj . La fuerza ejercida por el resorte entre xi y xj , Fij , será: Fij = D × ~u(xi − xj ) En cada nodo i, esa fuerza se combina con todas las otras fuerzas ejercidas por los demás resortes para obtener la fuerza Fi que afecta al nodo: X Fi = Fij j6=i En el caso centralizado (que sirve más que nada para ilustrar el mecanismo) un mismo proceso calcula todas las coordenadas conociendo todas las latencias. En este caso basta mover cada punto xi en la dirección de Fi , recomputar las fuerzas, y repetir hasta que el error de las coordenadas sea suficientemente bajo. Eligiendo correctamente la magnitud del desplazamiento que un nodo puede realizar en cada paso (como fracción t de la fuerza total Fi ), es posible controlar la velocidad de la convergencia. Intuitivamente, si en cada paso dejamos que un nodo pueda moverse mucho existe la posibilidad de que el sistema nunca converja, ya que los puntos siempre saltan sobre la ubicación de mı́nima energı́a. Por otro lado, si los nodos se mueven poco en cada paso la convergencia podrı́a ser muy lenta. Mostramos el caso centralizado en el algoritmo 1. La versión distribuida del protocolo consiste en que cada nodo simule su movimiento en la malla de resortes, un resorte por vez. Para simular este movimiento el nodo necesitará, aparte de su coordenada: 17 El vector unidad es un vector en la misma dirección que otro dado pero de módulo 1. Usaremos ~ u(x) para x referirnos al vector unidad correspondiente al vector x, ~ u(x) = kxk . 13 La latencia medida contra el nodo remoto La coordenada del nodo remoto Con la coordenada remota y su coordenada local el nodo puede calcular la distancia al nodo remoto. Con la información de latencia puede calcular el error, y por lo tanto saber cuánto debe desplazarse. La dirección del desplazamiento será dada por el vector diferencia entre las coordenadas. De esta manera, entonces, cada vez que el nodo realiza una medición de latencia contra otro nodo puede actualizar su coordenada simulando el movimiento del resorte que unirı́a a ambos. Esta medición puede ser explı́cita (se genera tráfico para realizar la medición) o implı́cita (se mide la latencia del tráfico normal que genera la aplicación). Dado que las latencias en una red pueden variar con el tiempo, en el caso distribuido el nodo no deja nunca de actualizar su coordenada, para poder reaccionar a los cambios en la latencia. Mostramos esta versión básica del caso distribuido en el algoritmo 2. Algoritmo 1 Algoritmo Vivaldi, versión centralizada {L es una matriz que contiene la latencia entre todo par de nodos} {x es un vector que contiene las coordenadas de cada nodo} while error(L, x) > tolerancia do for all i do for all j do e = Li,j − kxi − xj k F = F + e × ~u(xi − xj ) xi = xi + t × F end for end for end while Algoritmo 2 Algoritmo Vivaldi, versión distribuida {l es la latencia medida por el nodo i contra el nodo j} e = l − kxi − xj k xi = xi + t × e × ~u(xi − xj ) 4.3. Desplazamiento adaptativo Es necesario elegir correctamente la magnitud del desplazamiento t para tener buenas propiedades de convergencia. Sin embargo, con un desplazamiento pequeño la convergencia es lenta, pero con un desplazamiento grande podrı́amos tener oscilación. El problema es el hecho de que la magnitud del desplazamiento sea constante. Querrı́amos tener un desplazamiento grande al principio, para acelerar la convergencia, pero un desplazamiento pequeño al final, para encontrar el punto de mı́nimo error. El objetivo es obtener buenas coordenadas. Una coordenada es buena cuando su error es bajo. Al iniciar la aplicación la coordenada es mala, ya que se inicia de manera arbitraria (por ejemplo al azar, con módulo 1) y por lo tanto tiene mucho error. En esa situación va a ser aceptable desplazarse mucho, ya que se está buscando, a grandes rasgos, la zona en la cual el nodo debe ubicarse para tener poco error. Una vez encontrada esta zona, el error será menor, y entonces se pasará a refinar esa coordenada, desplazándose poco para no “saltar” sobre el punto óptimo. La magnitud del desplazamiento será lineal en función del error, y la dirección del desplazamiento será dada por la coordenada remota. La magnitud del desplazamiento también dependerá del error del nodo que informa la coordenada remota. Si ese nodo posee mucho error, desplazarse mucho confiando en esa coordenada es incorrecto. Ahora, si el nodo local también tiene mucho 14 error, no empeorará su error desplazándose mucho. De esta manera, el objetivo es desplazarse mucho cuando el error remoto es menor al error local, y desplazarse poco en el caso inverso. Para lograr esto, Vivaldi utiliza la siguiente fórmula para obtener el desplazamiento en función de los errores: t= el el + er De esta manera, si el (el error local) es mucho mayor que er (el error remoto) la expresión tiende a 1, y si er es mucho mayor que el la expresión tiende a 0. Para estimar su error cada nodo utiliza un promedio pesado entre la última medición y una estimación histórica. Mostramos la versión final del caso distribuido en el algoritmo 3. Algoritmo 3 Algoritmo de Vivaldi, versión distribuida con desplazamiento adaptativo {ei es el error de xi (la coordenada del nodo local i)} {ej es el error de xj (la coordenada del nodo remoto j)} {l es la latencia medida por el nodo i contra el nodo j} {es es el error relativo de la medición l} i t = ei e+e j l−kx −x k i j es = l ei = es × t + ei × (1 − t) xi = xi + t × es × ~u(xi − xj ) 4.4. Espacios El protocolo Vivaldi es, en principio, independiente del espacio que se quiera utilizar para embeber los nodos. La operatoria del protocolo solamente requiere que los elementos del espacio (las coordenadas de los nodos) puedan ser sumados y multiplicados por un escalar, y que el espacio tenga una noción de distancia. La elección del espacio no es un problema trivial. El objetivo es elegir un espacio que respete la topologı́a de Internet o de la red que conecta a los nodos de la aplicación. Si el espacio elegido no embebe correctamente la topologı́a de los nodos, la estimación de las coordenadas tendrá mucho error. Imaginemos que tenemos cuatro nodos equidistantes en latencia entre sı́. La manera lógica de ubicar estos nodos es en los vértices de un tetraedro. Si el espacio que elegimos para las coordenadas de Vivaldi fuera un plano bidimensional, estarı́amos simulando este tetraedro aplastado a dos dimensiones, y de esta manera encontrarı́amos una solución con mucho más error que si hubiéramos elegido un espacio tridimensional. Los nodos de Internet están localizados sobre la superficie de la tierra, lo cual podrı́a sugerir una geometrı́a euclidiana clásica o incluso una geometrı́a esférica. Sin embargo, eso requerirı́a que fuera posible la comunicación directa entre cualquier par de nodos, lo cual no sucede en la realidad. Internet tiene una estructura jerárquica, en la cual los proveedores pequeños compran tráfico a proveedores más grandes, que son los que mantienen el backbone de Internet. Dos nodos en distintos proveedores no se comunican directamente. Esto tiene como consecuencia que la topologı́a de los nodos, si bien están presentes en la superficie de la tierra, esté determinada en mucho mayor medida por la estructura del backbone y las decisiones comerciales de comprar tráfico a uno u otro proveedor. Por ejemplo, si los nodos en Latinoamérica tienen que pasar por Estados Unidos para llegar hasta Europa, es posible que sus distancias en la red no sean similares a las distancias geográficas, y entonces un espacio esférico embeba a las coordenadas con mucho error. En [7] se discuten varios espacios, pero el trabajo propone una modificación al clásico espacio euclidiano tridimensional en la cual la distancia entre dos puntos se mide desde esos puntos al plano xy, y luego entre los puntos en el plano xy. Dicho de otra manera, la transmisión de información entre los nodos de la red se da siempre en el plano; no hay comunicación directa entre nodos por 15 encima del plano. Esto representa la situación actual de Internet en la que la gran mayorı́a de los nodos está conectado solamente con su ISP, y recién desde ahı́ accede a todo el resto de los nodos de Internet. Por lo tanto, cada nodo cubre primero la distancia entre él y su ISP (la distancia entre su coordenada y el plano), luego cubre la distancia entre su ISP y el ISP del nodo remoto (la distancia en el plano), y finalmente cubre la distancia desde el ISP remoto y el nodo remoto (la distancia entre el plano y la coordenada remota). El backbone de Internet está suficientemente interconectado como para que la transmisión se pueda ver como en un plano. En [7] llaman a este espacio “vectores de altura” o 2D + H, ya que funciona como un plano euclidiano más la componente de altura H. Entonces, si un punto en el espacio euclidiano 3D está descripto por tres valores, la modificación conserva estos tres valores, pero su operatoria es distinta. En el espacio euclidiano 3D: (x1 , x2 , x3 ) − (y1 , y2 , y3 ) = (x1 − y1 , x2 − y2 , x3 − y3 ) k(x1 , x2 , x3 )k = q x21 + x22 + x23 k · (x1 , x2 , x3 ) = (k · x1 , k · x2 , k · x3 ) En el espacio vectores de altura de Vivaldi, 2D+H: (x1 , x2 , x3 ) − (y1 , y2 , y3 ) = (x1 − y1 , x2 − y2 , x3 + y3 ) k(x1 , x2 , x3 )k = q x21 + x22 + x3 k · (x1 , x2 , x3 ) = (k · x1 , k · x2 , k · x3 ) La componente H o “altura”, que es siempre no negativa, se suma al calcular el vector diferencia, y se suma de manera diferenciada al calcular la norma de cualquier vector. Esta es la manera de expresar matemáticamente la idea de que el tráfico entre dos nodos siempre tiene que salvar el link de acceso (por ejemplo, la conexión residencial de banda ancha) antes de llegar al backbone. De esta manera, la latencia de esta comunicación incluye recorrer las dos alturas, y luego salvar la distancia en el plano, que sı́ se comporta como un espacio euclidiano bidimensional (figura 3). Un detalle importante es que si en el espacio euclidiano 3D un nodo se encontraba en una posición en la cual estaba muy cerca de otros nodos, en todas direcciones, iba a ser empujado de todos lados por los resortes correspondientes a estos nodos. Sin embargo, al venir de todas direcciones, estas fuerzas se iban a cancelar, haciendo que el nodo no se moviera. Esto dejarı́a al nodo teniendo una coordenada con mucho error, ya que está demasiado cerca de los otros nodos. En el espacio vectores de altura el nodo siempre puede alejarse un poco más del plano euclidiano si se encuentra demasiado cerca de muchos otros nodos, y este alejamiento aumentará la distancia a todos los otros nodos, disminuyendo el error. 4.5. Modificaciones al protocolo Vivaldi En [11] se presentan tres modificaciones al protocolo Vivaldi original, con el objetivo de mejorar su comportamiento especı́ficamente en el caso en que la información del protocolo es enviada a cuestas del tráfico normal de la aplicación que lo utiliza. En ese trabajo se analiza en particular la implementación de Vivaldi en Azureus. Las modificaciones son: Coordenadas de cinco dimensiones Filtro de mediana 16 Distancia en el espacio euclidiano 3D Distancia en el espacio vectores de altura (1, 1, 5) 5 (4, 4, 3) 4 Z, H 3 2 1 0 5 4 0 3 1 2 X 2 3 4 Y 1 5 0 Figura 3: Cálculo de distancia en el espacio vectores de altura Ampliación del conjunto de vecinos Utilizar cinco dimensiones para las coordenadas intenta superar el problema de que tres componentes puede ser poco para capturar la información de latencias entre los nodos. Existen métodos que permiten calcular qué porcentaje de la información es capturada por cada dimensión en un sistema de coordenadas. Teniendo la matriz de distancias todos contra todos, se puede aplicar PCA (Principal Component Analysis)18 . Los análisis con PCA de matrices de latencia sugieren que se necesitan muchas dimensiones para capturar la mayor parte de la información. Sin embargo, coordenadas con pocas dimensiones han tenido buen comportamiento en distintos experimentos. En [11] proponen aumentar el espacio de vectores de altura a cinco dimensiones, manteniendo la quinta componente de ese nuevo espacio con el mismo comportamiento que la tercera componente del espacio vectores de altura original. Llamamos a este espacio, siguiendo nuestra nomenclatura, 4D + H: (x1 , x2 , x3 , x4 , x5 ) − (y1 , y2 , y3 , y4 , y5 ) = (x1 − y1 , x2 − y2 , x3 − y3 , x4 − y4 , x5 + y5 ) q k(x1 , x2 , x3 )k = x21 + x22 + x23 + x24 + x5 k · (x1 , x2 , x3 ) = (k · x1 , k · x2 , k · x3 , k · x4 , k · x5 ) El filtro de mediana responde a las situaciones en las cuales las mediciones de latencia son anómalas. Es normal que retrasos en algún punto de la red generen mediciones de latencia mucho mayores a las normales. Estos desvı́os son corregidos tomando siempre la mediana de las últimas mediciones para realizar la actualización de las coordenadas. En [11] eligen la mediana como estimador ya que es más resistente a valores anómalos que la media. La ampliación del conjunto de vecinos responde a la situación en la cual la comunicación de Vivaldi es enviada a cuestas del tráfico normal de una aplicación. Esto tiene como consecuencia que Vivaldi no tenga control sobre con qué nodos se comunica, ni a qué ritmo. Por lo tanto, puede 18 PCA es un cambio de coordenadas, una transformación ortogonal que expresa la matriz recibida de manera que cada componente de las nuevas coordenadas exprese la mayor cantidad de varianza posible. La matriz obtenida con PCA resulta tener la mayor varianza en la primera componente, y de manera descendiente en las siguientes. Además, se obtiene una medida de qué proporción de la varianza total está concentrada en cada componente. 17 suceder que la comunicación con el resto de los nodos sea poco uniforme o constante. Habrá mucha comunicación con algunos nodos y otros que se verán una sola vez. Es necesario realizar un mı́nimo de intercambios entre todos los nodos para que las coordenadas tengan buenas propiedades [7], pero esto no se puede garantizar en este caso. Para reducir este problema, en [11] proponen agrandar artificialmente el conjunto de vecinos contra los que un nodo actualiza su coordenada. En vez de que la información provista por un nodo remoto se utilice completamente para una sola actualización, el trabajo propone dividir esa actualización y escalarla de manera de poder realizarla de a pasos, combinada con otras. Esta modificación mantiene un conjunto de vecinos recientes, y cada actualización de coordenadas tiene en cuenta toda esa información. Para que esto no signifique desplazar al nodo más de lo normal, la fuerza Fij generada por un vecino j en el nodo i se normaliza (Fij? ) de la siguiente manera: aM − aj Fij? = Fij × P k aM − ak Donde ak indica la edad de la última medición de latencia contra el nodo k. La fuerza final con la que se desplaza el nodo es la suma de la fuerza generada por cada nodo en el conjunto de vecinos. aM es la edad del vecino del cual recibimos una actualización hace más tiempo. A partir de una cierta edad, la información del vecino se descarta. De esta manera, se escalan las fuerzas de acuerdo a cuan recientemente fueron actualizadas. La influencia de los nodos remotos es entonces extendida en el tiempo, aún si fueron contactados una sola vez, y en consecuencia se expande el conjunto de vecinos contra el cual se actualizan las coordenadas. 4.5.1. La modificación a Vivaldi propuesta en este trabajo En [7] se argumenta que el espacio de vectores de altura embebe correctamente la topologı́a actual de Internet porque la componente H captura la latencia del link de acceso de cada nodo. Esta latencia es uno de los problemas al utilizar sistemas de coordenadas como Vivaldi en una red que incluye enlaces de banda ancha residencial. Si la distancia entre dos nodos se calculara excluyendo la componente H, estarı́amos evitando la latencia del link de acceso (la LML) en la estimación. En el caso de dos nodos del mismo ISP, dado que la LML comprende casi toda la latencia entre ellos, obtendrı́amos una distancia casi nula. Para dos nodos en distintos ISPs obtendrı́amos una distancia proporcional a la latencia del enlace inter-ISP que une a ambos ISPs. De esta manera serı́a más fácil identificar peers dentro del mismo ISP, ya que los nodos estarı́an separados solamente por la latencia de los enlaces inter-ISP, y de esta manera los nodos en el mismo ISP estarı́an muy cerca unos de otros. Excluir la componente H del cálculo de distancia equivale a que la distancia entre dos nodos sea estrictamente la distancia entre sus proyecciones en el plano xy. Por esta razón llamaremos a esta modificación distancia en el plano. No podemos realizar este cálculo modificado al construir las coordenadas, pues si subestimamos la distancia calcularemos también un error incorrecto. Nuestra propuesta consiste entonces en excluir la componente H solamente para las estimaciones de latencia requeridas por la aplicación utilizando Vivaldi. Dicho de otra manera, las coordenadas se construyen normalmente pero cuando el programa utilizando Vivaldi pide una estimación de distancia la componente H no se tiene en cuenta. 18 5. BitTorrent BitTorrent [6] es un protocolo para distribuir archivos en Internet y en redes locales en el cual los nodos que bajan el archivo contribuyen al mismo tiempo a distribuirlo, subiendo partes del archivo a otros nodos que lo están bajando. De esta manera es posible que un nodo con poco ancho de banda distribuya un archivo a muchos otros, sin sufrir un incremento lineal en la demanda a medida que crece el número de nodos bajando el archivo. 5.1. El protocolo BitTorrent BitTorrent es un protocolo P2P en el que los nodos que están bajando el archivo, a los que llamaremos peers 19 , deben también subir partes de este archivo a otros peers para a su vez poder bajar de ellos. De esta manera el costo de ancho de banda de subida es distribuido entre todos los peers. El conjunto de peers bajando el archivo se denomina swarm. Algunos de esos peers tendrán el archivo completo; los llamaremos seeds. Un nodo expresa su interés en convertirse en peer y unirse al swarm obteniendo un archivo de metainformación con extensión .torrent, y abriéndolo en su cliente BitTorrent. Este archivo se distribuye generalmente por la Web. El archivo .torrent contiene la descripción del torrent, y contiene además la dirección del tracker. El tracker es un servidor encargado de mantener la información del swarm (quiénes están bajando el torrent en cada momento) y de proveer al nodo con el conjunto inicial de peers al cual se va a conectar para comenzar a bajar el archivo. El tracker elije aleatoriamente un subconjunto de peers para devolverle al nodo en cuestión. El archivo a bajar se divide en piezas de tamaño fijo para facilitar su intercambio entre los peers. Una vez que un peer terminó de bajar una pieza entera, ya puede empezar a ofrecerla a los demás peers. Ası́ es como las piezas y el archivo se replican una vez bajadas del nodo que tenı́a el archivo originalmente, que es el primer seed. 5.2. Comunicación entre los peers Los peers se comunican entre sı́ para intercambiar estado y piezas, y de esta manera poder completar la transferencia del archivo. En todo momento, cada nodo mantiene el estado de qué piezas posee. Cada vez que completa una pieza, avisa a todos los peers con los que está conectado, para que eventualmente puedan empezar a pedirle esa pieza. Para mostrar la interacción de los peers describiremos el comportamiento de un peer, al que normalmente nos referiremos como peer local. Como BitTorrent es una aplicación P2P, todos los peers se comportan de una manera similar. En algunas situaciones será necesario distinguir al peer local de los otros peers con los que está conectado. A éstos últimos los llamaremos peers remotos. Finalmente, cuando hablemos de las tasas de transferencia entre los peers lo haremos desde la perspectiva del peer local. De esta manera, la tasa de bajada, a secas, es la tasa de transferencia en sentido hacia el peer local; la tasa de subida, a secas, es la tasa de transferencia desde el peer local. Sin embargo, en algunos casos invertiremos el sentido de estos términos, pero siempre aclarando el sentido de la transferencia. Cuando un peer inicia la comunicación con otro, el primer paso es un intercambio de información o “handshake” que tiene como objetivo verificar que ambos peers estén bajando el mismo torrent y que ambos posean información correcta sobre el torrent. Luego del handshake los peers intercambian un mensaje opcional que indica qué piezas posee cada uno. De esta manera, un peer sabe al conectarse con otro si va a poder bajar piezas de él o no. Cada conexión de un peer con otro requiere cuatro bits de estado de cada lado: choking e interesado, para el peer local y para el peer remoto. Un nodo está interesado cuando el peer con el que está conectado posee piezas que él no posee. El choking se utiliza para controlar la tasa de transferencia e implementar la polı́tica que obliga a los peers a subir piezas para poder bajar. Será descripto en profundidad en la sección 5.3. 19 Al hablar de BitTorrent utilizaremos los términos peer y nodo indistintamente para referirnos a un participante. 19 En todo momento, entonces, cada peer sabe para cada peer remoto con el que está conectado: Si el peer local está interesado en piezas del peer remoto. Si el peer remoto está interesado en piezas del peer local. Si el peer local mantiene en estado choking al peer remoto. Si el peer remoto mantiene en estado choking al peer local. Las conexiones entre peers son simétricas (es decir, que no importa quién la haya iniciado, ambos pueden bajar piezas). La transmisión en cada sentido ocurre cuando el nodo receptor está interesado y el nodo proveedor no está choking. Por esta razón son necesarios los cuatro bits de estado: de a pares controlan la transferencia en cada sentido. Las conexiones se inician en estado no interesado y choking, de ambos lados. Las piezas en las que se dividió el archivo se parten a su vez en bloques de un tamaño apropiado para poder ser transmitidos de manera completa. Toda la comunicación se realiza utilizando TCP20 . De esta manera, el funcionamiento básico de un cliente de BitTorrent consiste en conectarse con los peers recibidos del tracker, obtener información sobre qué piezas tiene cada peer al que se conectó, y comenzar a pedir piezas de acuerdo a esto. Si bien la especificación original de BitTorrent no prevee ningún orden de bajada para las piezas, artı́culos subsecuentes [6] recomiendan utilizar el algoritmo rarest first. En este algoritmo el cliente debe elegir la pieza que esté menos repetida entre los peers que este nodo conoce. De esta manera se incentiva que las piezas se repliquen de manera uniforme, y entonces todos los nodos pueden subir a todos los nodos, aumentando la velocidad de bajada para todo el swarm. Hay una excepción a esta regla: la primera pieza que un peer baja se elije al azar. Dado que sin una pieza completa un peer no puede subirle a otros peers, es vital conseguir una pieza completa rápidamente, ya que sin nada para subir será complicado obtener buenas velocidades de bajada. Por esta razón se evita hacer rarest first para la primera pieza, ya que hacer esto implicarı́a que la primera pieza fuera una pieza poco repetida, la cual va a tardar obviamente más en bajar que cualquier otra, porque hay menos peers que la tienen. Como las piezas se transmiten vı́a TCP en subdivisiones (bloques), la prioridad siempre es completar una pieza antes de empezar a bajar una pieza nueva; primero se deben completar todos los bloques que componen una pieza antes de empezar a bajar los bloques de la siguiente. Cada peer comparte el archivo con granularidad de piezas, y por lo tanto si un nodo no bajó ninguna pieza completa no podrá ofrecer ninguna pieza a sus peers, y no podrá bajar de ellos. 5.2.1. Mensajes del protocolo BitTorrent Una vez establecida la conexión y realizado el handshake, la comunicación entre los peers consiste en un intercambio bidireccional de mensajes prefijados por su longitud. Cada mensaje es de uno de los siguientes tipos: choke. El mensaje choke indica al receptor que el emisor pasa a estar choking, y por lo tanto no responderá pedidos de bloques. unchoke. El mensaje unchoke indica al receptor que el emisor no está más choking, y por lo tanto responderá pedidos de bloques. interested. El mensaje interested indica al receptor que el emisor está interesado en bajar piezas que el receptor posee. 20 En la implementación original del protocolo. Una implementación nueva propone reemplazar TCP por UDP [27]. 20 not interested. el mensaje not interested indica al receptor que el emisor no está interesado en bajar ninguna pieza del receptor. Suele implicar que el emisor posee todas las piezas que el receptor dijo tener. have. El mensaje have indica que el emisor acaba de terminar de bajar una pieza. Posee un payload que consiste en un número entero. Ese entero es el ı́ndice (comenzando desde cero) de la pieza en cuestión. bitfield. El mensaje bitfield se manda solamente después del handshake. Indica las piezas que el emisor posee. Contiene un payload consistente en una secuencia de bytes, donde los bits de cada byte indican si el emisor posee esa pieza en particular o no. El bit más alto del primer byte corresponde a la pieza de ı́ndice cero. request. El mensaje request se utiliza para pedir bloques. Su payload consiste en tres enteros: el ı́ndice de la pieza que contiene el bloque a pedir, el offset donde comienza el bloque a pedir, y la longitud del bloque. piece. El mensaje piece contiene el bloque respuesta a los mensajes request. Su payload consiste en dos enteros y una secuencia de bytes. El primer entero indica la pieza de la cual es parte el bloque, el segundo entero indica el offset desde el cual comienza el bloque, y la secuencia de bytes es el bloque en sı́. cancel. El mensaje cancel se utiliza para cancelar pedidos realizados con mensajes request. Su payload es igual. 5.3. Mecanismo de choking El mecanismo de choking es la manera en la que BitTorrent regula el tráfico y mantiene condiciones igualitarias entre los peers del swarm: cuanto más subo a mis peers, más ellos me dejan bajar. Mandar choke a un peer remoto implica que el emisor del mensaje no va a responder mensajes request, efectivamente deteniendo la bajada del peer remoto. Recı́procamente, un peer solamente va a poder bajar de los peers remotos que no están choking. En todo momento, un nodo mantiene una cantidad fija de peers remotos en estado no choking. En las versiones actuales de BitTorrent esta cantidad es cuatro. Estos cuatro peers remotos son los que están subiendo con mayor tasa de transferencia al nodo en cuestión, sin importar si están interesados o no. Si algún peer remoto en estado no choking no expresa interés, a pesar de haber recibido el mensaje unchoke, entonces se elige otro peer remoto que esté interesado aunque su tasa de subida sea menor. Una vez que un peer termina de bajar el archivo, se convierte en seed y elige subir a quienes están bajando más de él, en vez de elegir a quienes están subiendo más a él. Los peers en estado no choking se recalculan cada 10 segundos, para evitar cambiar el estado de los peers demasiado rápido. La tasa de transferencia, en ambos sentidos, se recalcula cada 20 segundos. Además de estos cuatro peers, se elige un peer más al azar que se pasa a estado no choking de manera optimista. El objetivo de esto es examinar peers remotos de los cuales todavı́a no se ha bajado. Es posible que alguno de estos peers remotos pueda convertirse en un peer que sube mucho al peer local, pero que todavı́a el peer local no lo sepa porque no han intercambiado piezas. Este comportamiento optimista es importante para empezar las comunicaciones nuevas, ya que de otra manera un peer que nunca ha subido no tendrı́a posibilidades de empezar a bajar para luego poder subir. La implementación de BitTorrent, para reforzar este comportamiento, hace que las conexiones nuevas sean tres veces más probables de ser elegidas que las demás. Este peer remoto cambia cada 30 segundos. El algoritmo de choking implementado en BitTorrent intenta favorecer la reciprocidad. Los peers que más suben son los que más probabilidad tienen de recibir unchoke y poder bajar. Más aún, si dos peers están recibiendo pocas piezas de otros peers a los que están subiendo mucho, 21 entonces les conviene comenzar a intercambiar entre ellos; recibirán mejores tasas de subida del nuevo peer remoto que la tasa que estaban recibiendo antes. Algoritmo 4 Algoritmo de choking for all peer p do if p es uno de los cuatro peers con mejor tasa de subida ∧ p está choking then mandar unchoke a p else if p no es uno de los cuatro peers con mejor tasa de subida ∧ p no está choking then mandar choke a p end if end for mandar unchoke a q peer al azar en estado choking 5.4. Modo fin-de-juego Cuando un peer está terminando de bajar el archivo, es posible que los últimos bloques de las últimas piezas sean bajados de conexiones con poco ancho de banda, retrasando la finalización del archivo. Para evitar esto, cuando un peer ha realizado pedidos de todas las piezas que debe bajar, manda pedidos de todos los bloques que le faltan a todos los peers de los que está bajando. De esta manera se contribuye a que los últimos bloques no tarden tanto en aparecer. Dado que esto podrı́a generar mucho tráfico inútil, al recibir un bloque que habı́a sido pedido a todos se utiliza el mensaje cancel para cancelar el resto de los pedidos. Es la utilidad principal de este mensaje. 5.5. Un ejemplo de comunicación entre peers Un nodo inicia la comunicación TCP con un peer remoto. Recordar que las conexiones se inician por default en estado no interesado y choking. Una vez realizado el handshake, intercambian mensajes bitfield. El mensaje bitfield no es obligatorio si un peer no tiene ninguna pieza. Una vez que ambos peers saben que piezas tiene el otro, pueden expresar su interés. Si algún lado de la conexión estuviera interesado deberı́a mandar el mensaje interested. Es importante mantener actualizado el estado interesado, porque de esta manera un nodo puede saber qué peers iniciarı́an pedidos inmediatamente si fueran pasados a estado no choking. Suponiendo que algún lado de la conexión estuviera interesado, al recibir un unchoke deberı́a mandar mensajes request de los bloques de la pieza a bajar. Como describimos antes, el protocolo baja de a una pieza por vez, tratando de completar una pieza antes de iniciar la siguiente. Por lo tanto, los mensajes request serán enviados siguiendo este esquema, primero se pedirán todos los bloques de una misma pieza antes de empezar a pedir los bloques de la pieza siguiene. El otro lado de la conexión responderı́a con mensajes piece. Eventualmente algún lado de la conexión completará una pieza, no necesariamente por esa conexión. El peer que completó la pieza debe enviar al peer remoto el mensaje have indicando esto. El peer remoto podrı́a volverse interesado, si no lo estuviera, ya que no posee esa pieza en particular. En ese caso el peer remoto mandarı́a el mensaje interested. También podrı́a suceder que con esa pieza, el peer local ya no tuviera nada más que bajar del peer remoto, en cuyo caso mandarı́a el mensaje not interested. A medida que los peers intercambian piezas, las tasas de transferencia se modifican. Los peers intercambiarán también mensajes choke y unchoke mientras vayan cambiando el estado choking de sus conexiones, siguiendo las tasas de transferencia. 22 6. El simulador SSFNet SSFNet [25] es un simulador de red desarrollado en Java y montado sobre un simulador por eventos discretos llamado SSF (Scalable Simulator Framework). SSFNet funciona, a grandes rasgos, como una capa de abstracción entre las primitivas de simulación de SSF (eventos y canales) y las estructuras necesarias para simular redes (hosts, routers, enlaces, protocolos y transmisión de bits). Dado que SSF es un simulador por eventos discretos, SSFNet funciona modelando el envı́o de información en pasos discretos de tiempo. El objeto básico de la simulación es el paquete IP. En cada intervalo de tiempo el simulador transmite paquetes IP en los enlaces definidos por el usuario, realizando ruteo y ejecutando los protocolos provistos por el usuario. Estos enlaces se describen a nivel IP mediante su latencia y su tasa de transferencia máxima. Los modelos de SSFNet se configuran de manera autónoma: cada instancia de una clase de SSFNet se inicializa consultando una base de datos de configuraciones que puede estar presente localmente o disponible en la Web. Los archivos de configuración se escriben en DML, un lenguaje de descripción simple que mostraremos en la sección 6.5. Estos archivos se utilizan tanto para configurar el modelo completo como para instanciar la simulación, con la ayuda de la base de datos provista por SSF. Las clases principales utilizadas en SSFNet están organizadas en dos paquetes: SSF.OS y SSF.Net. Las clases de SSF.OS se utilizan para modelar cada host, incluyendo los componentes normalmente provistos a una aplicación por el sistema operativo, incluyendo los protocolos como IP y TPC o UDP. Las clases de SSF.Net se utilizan para modelar la red y su conectividad, incluyendo nodos, enlaces y sus caracterı́sticas. 6.1. La jerarquı́a de clases en SSF.OS El simulador provee tres clases que sirven como clases base para implementar un nuevo protocolo: ProtocolGraph, ProtocolSession y ProtocolMessage. La clase ProtocolGraph configura e inicializa instancias de ProtocolSession. Los objetos ProtocolSession procesan la apertura y cierre de conexiones individuales, por las cuales se transmiten instancias de ProtocolMessage. Podemos ver a los objetos ProtocolGraph como contenedores de todos los protocolos presentes en un host o en un router. Estos objetos crean los servicios de todos los protocolos al iniciar la simulación, y luego pueden localizarlos a pedido de otros protocolos o aplicaciones. La clase ProtocolSession es la clase base de la cual derivan todas las clases que representan protocolos de red en SSFNet. Para los protocolos provistos por SSFNet (por ejemplo TCP) se suelen tener dos clases que heredan de ProtocolSession: una que provee servicios para iniciar nuevas conexiones y demultiplexar todos los mensajes del protocolo que llegan al host, y otra que representa una conexión única entre dos hosts. Los objetos ProtocolSession son nodos en el objeto ProtocolGraph que, como su nombre lo indica, puede verse como un grafo dirigido acı́clico. Los ejes representan relaciones de “depende de”, donde por ejemplo el objeto ProtocolSession Socket va a depender del objeto ProtocolSession TCP. Normalmente las hojas de ese grafo serán los protocolos de aplicación, por ejemplo Vivaldi o BitTorrent en nuestro caso. Los objetos ProtocolSession son configurados automáticamente por el objeto ProtocolGraph utilizando DML. Finalmente, ProtocolMessage es la clase básica para modelar fragmentos de paquetes que serán eventualmente enviados (de manera simulada) por la red. Los objetos ProtocolMessage son el enlace básico entre el mundo de eventos y canales de SSF, y el mundo de nodos y conexiones de SSFNet. Los objetos ProtocolMessage son utilizados como payload por la clase PacketEvent, la clase responsable de crear el canal de comunicación SSF que representa al enlace fı́sico entre dos nodos. Un objeto ProtocolMessage consiste en una lista enlazada de headers. El header a la cabeza de la lista es el del paquete a trasmitir. La cola de la lista, una nueva lista enlazada de headers, consiste en el payload. Lo interesante de este diseño es que representa la situación de una red real en la que un frame Ethernet tiene un header y un payload, y ese payload a su vez tiene un header IP y un payload, y ese payload a su vez tiene un header TCP y un payload. Al eliminar la cabeza 23 de la lista y quedarnos con su cola, el siguiente elemento de la lista es el siguiente header, y la cola de la nueva lista es el nuevo payload. Esto podrı́a ser contraintuitivo, porque de esta manera la última lista es aquella que tiene el último header como header y la lista vacı́a como payload, y de esta manera no se podrı́a transmitir más información que aquella presente en los headers. Sorpresivamente, esto no es enteramente erróneo. SSFNet se ejecuta por defecto en una sola computadora, teniendo la posibilidad de que los objetos que representan nodos puedan compartir memoria, y por lo tanto puedan intercambiar mensajes simplemente intercambiando referencias a posiciones de memoria. SSFNet implementa un modelo de transmisión de datos zero copy en el cual lo único que se copia es la referencia a la información siendo transmitida. 6.2. Transmisión de información Para enviar información en SSFNet se tienen dos opciones: Intercambiar directamente objetos ProtocolMessage, que no pueden tener payload en bytes, y por lo tanto no generan más tráfico que el tamaño del header. Utilizar sockets. Si estamos interesados en realizar una simulación de un protocolo que no requiere transmisión de grandes volúmenes de información ni envı́o confiable, podemos intercambiar directamente objetos ProtocolMessage, lo que equivaldrı́a a encapsular nuestro protocolo directamente sobre IP. Basta crear una clase que herede de ProtocolMessage, e indicarle al servicio IP en el nodo que envı́e la instancia de esa clase. Los objetos ProtocolMessage representan un paquete IP, por lo tanto conocen su destino en la red. Los sockets, en cambio, permiten especificar una cantidad de bytes “virtuales” que ocupa el objeto que estamos mandando. De esta manera, SSFNet simula el envı́o de esa cantidad de bytes, pero el nodo del otro lado recibe la referencia al objeto, y por lo tanto no requiere preocuparse por cuestiones de serialización. Más especı́ficamente, los sockets proveen dos primitivas de envı́o y recepción de información: write(Object[] obj, int nbytes, Continuation caller) read(Object[] obj, int nbytes, Continuation caller) write(int num virtual bytes, Continuation caller) read(int num virtual bytes, Continuation caller) Las primeras dos primitivas se utilizan para intercambiar información real que los nodos necesitan para llevar adelante la aplicación, más una cantidad de bytes “virtual”. Esto equivaldrı́a al intercambio en la realidad de un stream de bytes con header. Las segundas dos primitivas se utilizan para intercambiar información puramente virtual, que equivaldrı́a al intercambio en la realidad de un stream de bytes (por ejemplo, la conexión de datos del protocolo FTP). Normalmente las primitivas de conexión de sockets (connect() y listen()) y de envı́o y recepción de mensaje en los sockets (read() y write()) son bloqueantes. SSFNet tuvo que buscar una manera de simular este comportamiento bloqueante sin que un nodo detenga la simulación del resto de los nodos. Esto se debe a que el mismo proceso del sistema operativo simula todos los nodos, por lo tanto una llamada bloqueante no solo detendrı́a la simulación, si no que no permitirı́a que el nodo receptor de esa llamada pueda atenderla, y de esta manera nunca se volverı́a de este bloqueo. La manera que el framework resolvió esto es con el uso de continuaciones. Conceptualmente, una continuación representa, como su nombre lo indica, la manera de continuar la ejecución. Cada llamada bloqueante recibe una continuación que indica cómo sigue el cómputo luego de que esa 24 llamada bloqueante termine. De esta manera, las llamadas se simulan bloqueantes, ya que un nodo siempre espera a que las primitivas terminen; pero el simulador puede continuar ejecutando eventos del resto de los nodos. Cuando el evento que desbloquea esa llamada ocurre, simplemente se utiliza la continuación para continuar (valga la redundancia) el cómputo. Más allá de ser una buena solución para resolver el problema, las continuaciones presentan problemas técnicos, sobre todo con el simulador programado en Java. Dado que en Java la única manera de tener algo similar a una clausura o a una función lambda es el uso de clases anónimas, las continuaciones están implementadas de esta manera. Esto restringe ligeramente la implementación, ya que la clase anónima puede acceder solamente a las variables de instancia de la clase que la engloba, no puede acceder a las variables locales de los métodos. La segunda herramienta importante que el simulador provee para implementar protocolos son los timers. Nuevamente, se busca que ningún nodo detenga la simulación, y por lo tanto en vez de dormir esperando un evento, el mecanismo para disparar eventos en el futuro que el simulador provee son los timers. Éstos están implementados nuevamente como clases anónimas, que poseen una sola función a ser llamada cuando el timer expire. 6.3. La jerarquı́a de clases en SSF.Net Las clases principales del paquete SSF.Net son: 1. Net 2. Host y Router 3. NIC 4. link La clase Net carga toda la configuración del modelo y controla su inicialización: hosts y routers con sus protocolos, y los enlaces conectándolos. La clase Host deriva de ProtocolGraph y por lo tanto es totalmente configurable, soportando cualquier objeto ProtocolGraph. Este objeto debe poseer como mı́nimo el protocolo IP, para poder realizar ruteo, y al menos una interfaz de red, para poder interactuar con el resto de la red. Los objetos de la clase Router son un caso especial de hosts con varias interfaces de red. La clase NIC deriva de ProtocolSession y es la clase más baja del modelo, interactuando directamente con SSF. Posee varias opciones de configuración para las caracterı́sticas fı́sicas del enlace, para poder soportar redes de variadas caracterı́sticas. Finalmente, la clase link modela un enlace de capa dos entre un conjunto de interfaces conectadas. Cualquier enlace con más de dos interfaces conectadas realizará ruteo de capa dos para los mensajes recibidos por ese enlace. 6.4. Direccionamiento Cada red, host, router e interfaz de red en SSFNet requiere un identificador que debe ser provisto por el usuario. Estos identificadores se combinan para generar nombres globales que pueden ser usados para distinguir cada objeto de la simulación. Este modo de direccionamiento se denomina NHI (Network Host Interface). Dado que las redes pueden anidarse, cada objeto de la simulación hereda el identificador del objeto que lo contiene, y agrega su identificador separado por dos puntos “:”. La red global no tiene identificador, de manera que el nodo con identificador 7 en la subred 2 de la red 5 tendrá identificador 5:2:7. A su vez, cada interfaz agrega su identificador entre paréntesis al identificador del nodo que la contiene, por lo tanto la interfaz 1 del nodo anterior tendrá identificador 5:2:7(1). Las interfaces de red que estén efectivamente conectadas recibirán una dirección IP asignada automáticamente por el simulador al calcular las tablas de ruteo. El direccionamiento NHI permite entonces al usuario trabajar con nombres estáticos para los nodos, sin tener que preocuparse por 25 el direccionamiento IP. Dado que es normal construir redes de manera anidada, es natural y más simple utilizar direccionamiento NHI al razonar sobre el modelo, y dejar que el simulador asigne direcciones IP. Por otro lado, estos nombres proveen información sobre la estructura de la red, cosa que puede ser útil al programar ciertos protocolos o, en nuestro caso, al analizar los resultados del simulador. 6.5. El lenguaje DML SSFNet incluye un lenguaje simple para describir las redes y configurar las aplicaciones que van a ejecutar en los nodos llamado DML (Domain Modeling Language). El lenguaje consiste en conjuntos de pares clave-valor, en los cuales la clave siempre es una cadena y el valor puede ser tanto una cadena como un nuevo conjunto de pares clave-valor. DML soporta una forma de herencia que permite que el valor correspondiente a una clave herede atributos de otro ya definido. Esta es la manera de crear las redes anidadas mencionadas anteriormente, y salva mucho tiempo en la construcción de redes grandes. Permite generar redes completamente configuradas especificando solamente su identificador, y luego combinarlas en redes más grandes, y repetir el proceso todas las veces que el usuario quiera. 26 7. Implementación de Vivaldi en SSFNet Uno de los objetivos de este trabajo es caracterizar el comportamiento de Vivaldi en una red con enlaces similares a las conexiones residenciales de banda ancha. La literatura que encontramos sobre Vivaldi y su comportamiento se concentra en simulaciones con matrices de latencia todos contra todos, o en experimentación sobre PlanetLab. El problema de la experimentación sobre PlanetLab es que los nodos de esta red suelen estar ubicados en universidades. La mayorı́a de las universidades funcionan como pequeños ISPs, comprando acceso directamente a uno o varios proveedores grande. Sin embargo, el link de acceso en una universidad puede cubrirse con tecnologı́a Ethernet, ya que las distancias no son largas como en el caso de un ISP normal. Estos enlaces tienen caracterı́sticas de latencia y ancho de banda totalmente distintas a las de las tecnologı́as de banda ancha residencial. Por lo tanto, al experimentar sobre PlanetLab se pueden obtener resultados que no necesariamente se trasladan a redes que incluyan muchas conexiones de banda ancha residencial, como puede ser la red de un swarm BitTorrent. En las conexiones residenciales de banda ancha el link de acceso (la “última milla”) constituye gran parte de la latencia total entre dos nodos. Si bien el espacio utilizado por Vivaldi respeta una topologı́a de red en la cual los nodos no pueden comunicarse directamente, los mismos autores de Vivaldi admiten que la LML alta de las conexiones de banda ancha residencial puede generar coordenadas con mucho error. En [11] se estudia la implementación de Vivaldi en Azureus, analizando el comportamiento de las coordenadas en swarms reales. Es el primer trabajo que describe en profundidad el comportamiento de Vivaldi en el caso en que la comunicación del protocolo se realiza a cuestas de la comunicación normal de una aplicación. Esta es la manera menos intrusiva de incorporar Vivaldi a una aplicación, por lo tanto es importante conocer cuánto empeoran las coordenadas generadas por Vivaldi en este caso, frente a un caso en el que el protocolo puede generar su propio tráfico. En ese trabajo se encuentran una serie de problemas con la implementación original de Vivaldi cuando es utilizada de esta manera, y se proponen maneras de remediarlos. Estas modificaciones se incluyen, de manera configurable, en nuestra implementación. El problema es que en la situación de [11] no se puede ejercer ningún control, ya que se estudian swarms reales de BitTorrent. Es una observación pasiva del comportamiento de los swarms, y por lo tanto algunas preguntas quedan sin respuesta. ¿Qué impacto tiene la LML en la latencia total? ¿Qué efecto tiene la LML en las distancias calculadas? ¿Cuánto afectan las conexiones residenciales a las coordenadas? No se tiene información acerca del tipo de conexiones utilizadas por los clientes. Por esta razón planteamos una implementación en un simulador. Conocer el comportamiento de Vivaldi en una situación de nodos con alta LML es vital para poder utilizarlo en BitTorrent, donde gran parte de los usuarios se conecta mediante redes de banda ancha residencial. Aunque las coordenadas se degraden por la alta LML, si el espacio de vectores de altura propuesto por Vivaldi tiene un buen comportamiento es de esperar que gran parte de la LML se concentre en la componente H. De esta manera, si la distancia entre dos nodos se mide como la distancia en el plano (evitando contar la componente H en ambos casos), se podrı́a evitar este problema. 7.1. Detalles de la implementación Realizamos una implementación del protocolo Vivaldi utilizando SSFNet. Dado que Vivaldi no requiere transmisión de grandes volúmenes de datos, decidimos incorporar toda la información requerida (coordenada y error) en un header Vivaldi, VivaldiHost, que hereda de ProtocolMessage. Los nodos Vivaldi entonces intercambiarán instancias de esta clase que, recordemos, es la manera básica de intercambiar paquetes en SSFNet. Intercambiar objetos ProtocolMessage equivale en la realidad a encapsular esta información directamente en paquetes IP. Dividimos la implementación en dos clases distintas que heredan ambas de ProtocolSession: Vivaldi y VivaldiHost. La clase Vivaldi es la implementación del algoritmo básico del protocolo: contiene la lógica para pedir la coordenada a otro host y para actualizar la coordenada local 27 con esta información. La clase VivaldiHost contiene la lógica necesaria para guiar estas actualizaciones: en nuestro caso, son actualizaciones cada un cierto perı́odo configurable de tiempo. En [7] analizan ciertos aspectos de implementación de Vivaldi que contribuyen a un menor error en las coordenadas. En particular, mencionan el problema de que si los nodos intercambian información de coordenadas solamente con otros nodos cercanos, las coordenadas se degradan entre nodos que estén lejos entre sı́. Proponen entonces garantizar que un pequeño porcentaje de los intercambios (un mı́nimo del 5 %) sean con nodos lejanos. En nuestra implementación, esto se resuelve utilizando información de las direcciones NHI. Cada nodo elige al azar el nodo remoto contra el que va a actualizar, pero antes de eso, en un gran porcentaje de los casos nos aseguramos que sea una dirección NHI con el mismo identificador de red, y en el porcentaje restante garantizamos que sea un identificador distinto. En una implementación real, esta información serı́a difı́cil o incluso imposible de conseguir. Hay dos caminos para solucionarlo: o bien podemos ignorarlo, que es lo que sucede cuando Vivaldi se utiliza a cuestas del tráfico de otra aplicación, o podemos elegir ese pequeño porcentaje de nodos lejanos entre los nodos contra los que ya medimos más latencia. La implementación tuvo tres objetivos principales. Como primer paso, querı́amos comprobar que las coordenadas generadas por Vivaldi respetaran la topologı́a de la red subyacente. Esto era un requisito básico para que la información de las coordenadas pudiera ser utilizada para guiar el intercambio de piezas en BitTorrent. Luego, querı́amos analizar el comportamiento del espacio de vectores de altura en el caso de las redes de banda ancha residenciales. En particular, buscábamos verificar que la componente H de las coordenadas en este espacio capturara razonablemente la latencia de la última milla. Finalmente, querı́amos caracterizar la factibilidad de usar las coordenadas como método para distinguir pares de nodos en el mismo ISP, eventualmente eliminando la componente H para evitar la influencia de la LML. 7.2. La red de prueba para la simulación de Vivaldi La red de prueba (figura 4) utilizada en la simulación está inspirada en la red del ISP Prima (Cablevisión/Multicanal). Consta de siete sistemas autónomos (AS)21 , seis de los cuales contienen clientes residenciales de banda ancha corriendo el protocolo Vivaldi. Dos ASs simulan los clientes locales de Prima (un AS para la red de Cablevisión y el otro para la red de Multicanal), unidos por un enlace de latencia baja (1 ms). Otros dos ASs simulan clientes nacionales de otros ISPs (Telecom y Telefónica), unidos a los ASs anteriores por enlaces de baja latencia (2 ms). Los últimos dos ASs simulan clientes en el extranjero, conectados al ISP que provee los enlaces internacionales a Prima. Estos enlaces internacionales tienen una latencia mayor (75 ms). El AS restante (AS 6) sirve de peering point22 a los ASs locales, y no tiene clientes. En total hay aproximadamente 3000 nodos corriendo Vivaldi, divididos en los seis ASs mencionados. La figura muestra un número que corresponde a cada AS, para poder referenciarlo luego en los resultados. Las herramientas que el simulador provee para construir redes permiten combinar redes pequeñas en redes más grandes. La manera más natural de utilizar esto es describir una red pequeña, generar varias instancias de esta red, cada una con un identificador distinto, y luego conectar estas instancias generando una red más grande. Para construir nuestra red de prueba primero armamos una red pequeña que representara a un conjunto de 40 clientes cablemódem y al CMTS que los conecta con la red del ISP (figura 5). La LML en esta red es de 10 ms, para un total de 20 ms de RTT cablemódem-CMTS. El simulador no permite especificar latencias asimétricas. Si bien la latencia de un enlace cablemódem es asimétrica (ver sección 2.3), el tráfico recorrerá siempre un enlace en sentido upstream (el enlace del nodo emisor) y otro enlace en sentido downstream (el enlace del nodo receptor). Por esta razón es válido representar la latencia de un enlace cablemódem 21 Un sistema autónomo es un conjunto de nodos IP bajo control de una o más instituciones declaradas, que presenta una polı́tica de ruteo bien definida hacia el resto de Internet. 22 Un acuerdo de peering entre ISPs consiste en no cobrarse por el tráfico intercambiado entre ellos. Suele ocurrir cuando dos ISPs intercambian suficiente tráfico en ambos sentidos como para que sea más barato y más simple no cobrar por el tráfico en vez de cobrarse uno a otro. El peering point es el punto de la red en el cual los ISPs bajo acuerdo de peering intercambian tráfico. 28 Router BGP representando a un AS sin nodos Router BGP representando a un AS con 480 nodos cablemódem 10 ms USA2 (AS 5) USA1 (AS 4) 75 ms 75 ms 75 ms 1 ms Cablevisión (AS 0) Prima (AS 6) 1 ms 1 ms 2 ms 2 ms Multicanal (AS 1) 2 ms 75 ms Telefónica (AS 3) Telecom (AS 2) Figura 4: La red de prueba para la simulación de Vivaldi como la mitad de su RTT, aunque en la realidad el RTT no se divida a la mitad entre el sentido upstream y el sentido downstream. Combinamos esta red replicándola cuatro veces y conectando las instancias con otro router. Los enlaces internos de un ISP tiene muy baja latencia en la vida real, por lo tanto estos enlaces tienen una latencia de 1 ms. Generamos de esta manera una red de 160 nodos (figura 6). Para terminar la red que representa a un AS, replicamos la red anterior otras cuatro veces y las unimos con un pequeño backbone que termina en un router BGP. De esta manera, contamos con un AS que tiene 480 nodos corriendo Vivaldi, como muestra la figura 7. Todas las latencias en los enlaces de la figura 7 son de 1 ms, y los rectángulos verdes muestran la red de 160 nodos replicada. Los ASs mencionados tienen esta estructura, y de esta manera con seis de estos ASs tenemos en total 2880 nodos. 10 nodos cablemódem ... 10 ms 10 nodos cablemódem ... 10 ms CMTS 10 ms 10 nodos cablemódem ... 10 ms 10 nodos cablemódem ... Figura 5: Red base para la construcción, con 40 nodos 29 Router representando un CMTS con 40 nodos cablemódem Router interno del ISP ejecutando OSPF 1 ms 1 ms 1 ms 1 ms Figura 6: Red de 160 nodos CMTS con 40 nodos cablemódem Router interno ejecutando OSPF Router BGP Figura 7: Red del sistema autónomo 30 8. Resultados de la simulación de Vivaldi La red de prueba contenı́a aproximadamente 3000 nodos distribuidos en seis ASs. En las pruebas ejecutamos el protocolo Vivaldi durante 10 minutos de tiempo virtual. Cada nodo actualiza su coordenada una vez por segundo, dando un total de 600 actualizaciones por nodo. Para evitar que las coordenadas entre nodos lejanos se degraden, un 10 % de las actualizaciones son entre nodos de distintos ASs, y las restantes entre nodos del mismo AS. La simulación no incluye tráfico extra, pero esto puede agregarse sin modificar el código de nuestra implementación. 8.1. Visualización de las coordenadas Primero verificamos si las coordenadas de los nodos respetaban la topologı́a de la red subyacente. En los gráficos vamos a representar cada nodo con un punto de color y forma determinados por el AS al que pertenece, por lo tanto dos puntos con el mismo color y forma representan nodos del mismo AS. En la figura 8 mostramos las coordenadas tanto en un gráfico 3D como en un gráfico 2D. Para el primer gráfico utilizamos la componente H como si fuera la tercera componente de un espacio euclidiano 3D normal, y para el espacio 2D excluimos la componente H del gráfico. La vista 2D es más útil para ver las agrupaciones de nodos, pero dado que la estimación de distancia incluye la componente H, hay que tener en cuenta que dos nodos que aparecen cerca en la vista 2D pueden estar más lejos de lo que parece si sus componentes H son grandes. La recı́proca también puede suceder, dos nodos que aparecen lejos en el plano pueden no estarlo tanto en comparación con otros si sus componentes H son pequeñas. De cualquier manera, mientras que la componente H capture mayormente la latencia generada por el link de acceso, si dos nodos están cercanos en el plano eso sugiere que es más probable que estén en el mismo AS, por lo tanto es útil tener la visualización 2D. En ambos casos, igualmente, se puede observar que las coordenadas de los nodos respetan bastante la topologı́a de la red. Se distinguen grupos claros de nodos pertenecientes al AS 0 y al AS 1 (los ASs de nuestro ISP), si bien algunos nodos del AS 0 aparecen separados de los demás. Los nodos pertenecientes a los ASs 2 y 3 (los ASs de los otros ISPs nacionales) se mezclan entre sı́, pero aparecen diferenciados del resto, y lo mismo sucede con los nodos pertenecientes a los ASs 4 y 5 (los ASs en el extranjero). Dado que el enlace que separa a los ASs 4 y 5 tiene mayor latencia (10 ms) que el enlace que separa a los ASs 2 y 3 (2 ms), los nodos de los ASs 4 y 5 se mezclan menos que los nodos de los ASs 2 y 3. Los ASs 4 y 5 están conectados al resto de la red por enlaces internacionales de alta latencia, y por lo tanto era de esperar que sus nodos quedaran bien separados del resto. El enlace que une a esos dos ASs directamente tiene mucha menos latencia que los enlaces internacionales y por lo tanto los nodos de ambos ASs se mezclan. Los enlaces que conectan a los ASs 2 y 3 entre sı́ y con los ASs 0 y 1 tienen una latencia baja (2 ms), menor a la latencia del enlace de banda ancha residencial; esto hace que la agrupación no sea tan clara, pero igualmente los nodos de los ASs 2 y 3 aparecen separados de los nodos de los ASs 0 y 1. En esta situación, si bien no todos los ASs están claramente separados, parece probable poder aprovechar la información de distancia para que los peers realicen elecciones guiadas y aumenten el tráfico intra-ISP. 8.2. Comportamiento de la componente H El siguiente paso fue analizar el comportamiento del espacio vectores de altura. La idea de la componente H de las coordenadas en el espacio de vectores de altura es que esta componente represente la fracción de la latencia total correspondiente al link de acceso, lo que nosotros para las redes residenciales de banda ancha llamamos Last Mile Latency o LML. Ejecutamos la simulación descripta arriba variando la LML entre cinco valores: 5 ms, 10 ms, 20 ms, 50 ms y 100 ms. En cablemódem el RTT total entre cablemódem y CMTS es, sin congestión, de alrededor de 10 ms. 5 ms por lo tanto corresponderı́a a un caso óptimo, ya que 5 ms de LML corresponden a 10 ms de RTT. El valor que utilizamos para las simulaciones de Vivaldi es de 10 31 200 35 30 25 20 15 10 5 0 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 150 100 50 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 0 -50 -150 -100 -50 X 0 50 200 150 100 50 0 Y -50 -100 -150 100 150 -200 -100 -150 -200 -150 (a) Vista 3D -100 -50 0 X 50 100 150 (b) Vista 2D Figura 8: Visualización de las coordenadas de los nodos ms de LML, o sea 20 ms de RTT. Bajo escenarios de mucha congestión el RTT puede escalar hasta 200 ms, representado por el caso de LML 100 ms. Tomamos estos valores de mediciones directas hechas en el ISP Cablevisión, junto con información de [18]. La figura 9 muestra la relación entre la componente H y la LML. Decidimos presentar los resultados de manera relativa para que los valores de los distintos casos de LML fueran comparables. Para cada uno de los casos graficamos el valor de la componente H de la coordenada de cada nodo como fracción de la LML en ese caso. Para una gran mayorı́a de los nodos, sin importar el valor de la LML, la componente H se mantiene en valores que no superan dos veces la LML. Esperábamos encontrar los valores de la componente H más cercanos a una vez la LML, pero hay una distribución bastante uniforme entre valores casi nulos y valores de dos veces la LML. De cualquier manera se distingue una correlación importante, con un coeficiente de correlación de 0,836680. Es interesante que los valores de la componente H se mantengan dentro del mismo rango en términos de la LML sin importar el valor absoluto de cada LML. Esto sugiere que la componente H refleja siempre una fracción grande de la LML sin importar su valor. Dicho de otra manera, una LML alta no degrada las coordenadas al punto que la componente H deje de capturar la LML. Estos resultados sugieren que es útil, para mejorar la capacidad de las coordenadas de distinguir peers del mismo ISP, calcular la distancia en el plano. La componente H captura una fracción considerable de la LML. Dos peers del mismo ISP tienen una latencia dominada casi totalmente por la LML, ya que la comunicación entre ellos no recorre enlaces inter-ISP. Si calculamos la distancia entre los peers obviando la componente H, dos peers del mismo ISP aparecerán muy cerca, ya que no estaremos teniendo en cuenta la mayor parte de la distancia que los separa. Esto ayuda a amortiguar el impacto de una LML alta en las coordenadas. 8.3. Distancias entre los nodos Para que las coordenadas puedan ser aprovechables por una aplicación necesitamos que la distancia entre dos nodos del mismo ISP sea significativamente menor que la distancia entre dos nodos cualesquiera. El cuadro 1 presenta el promedio de la distancia, total y en el plano, entre nodos a distintos niveles. La red de prueba está construida combinando redes pequeñas en redes más grandes. Asimismo, la dirección NHI de cada nodo refleja esta construcción, ya que cada inclusión de una red pequeña para construir una red más grande agrega el identificador de la red grande a la dirección NHI del nodo. Dado que la red de prueba se realizan tres pasos de inclusión, las direcciones NHI tienen cuatro identificadores. Todos los nodos, entonces, tendrán una dirección NHI de la forma: 32 4 3.5 Componente H / LML 3 2.5 2 1.5 1 0.5 0 0 20 40 60 80 100 LML Figura 9: Componente H contra LML ID red : ID subred : ID subsubred : ID nodo Dos nodos que comparten los tres identificadores de más a la izquierda pertenecen a la misma subsubred, por lo tanto representan nodos que en la realidad estarı́an conectados al mismo CMTS. Los nodos que comparten los dos identificadores de más a la izquierda pertenecen a la misma subred, por lo tanto corresponden a nodos que en la realidad estarı́an conectados a distintos CMTS que a su vez se conectan al mismo router. Por último, los nodos que comparten el identificador de más a la izquierda están en el mismo AS. En la primera columna del cuadro se promedian las distancias entre todo par de nodos que comparten 3 identificadores, en la segunda columna se promedian las distancias entre todo par de nodos que comparten 3 o 2 identificadores, y ası́ sucesivamente. Es de esperar que, a medida que nos movemos para la derecha, la distancia promedio aumente, ya que estamos promediando la distancia incluyendo pares de nodos más lejanos. En cada caso se incluye tanto el promedio entre las distancias totales como el promedio entre las distancias en el plano. En todos los casos pasan dos cosas claras: La diferencia entre promediar la distancia total o la distancia en el plano es casi constante, sin importar el conjunto de nodos que estemos tomando. Esto es esperable ya que la LML representa la latencia del primer y último salto entre dos nodos, y estos saltos deben ser realizados en todos los casos. Lo sorprendente es que el valor sea tan similar en cada columna. Esto sugiere que la componente H es afectada más por la estructura de la red que por la distancia total entre los nodos. El valor de esta diferencia, además, se acerca al doble de la LML. Esto también es esperable, ya que para cualquier comunicación entre nodos la LML se debe recorrer dos veces. Esto es más evidencia de que la componente H captura buena parte de la LML, y por lo tanto es 33 Misma subsubred Misma subred Mismo AS 2D+H 2D Diferencia 11.68 20.67 8.98 15.27 24.26 24.36 8.98 15.38 148.24 8.98 139.26 10 10 10 2D+H 2D Diferencia 20.31 38.23 17.93 22.05 39.98 17.93 22.09 40.01 17.93 149.28 167.21 17.93 20 20 20 2D+H 2D Diferencia 35.40 72.64 37.24 40.17 77.41 37.24 39.58 76.82 37.24 165.99 203.23 37.24 50 50 50 2D+H 2D Diferencia 80.66 177.95 97.29 83.82 181.11 97.29 83.36 180.65 97.29 217.76 315.05 97.29 100 100 100 2D+H 2D Diferencia 161.10 357.50 196.39 180.13 376.53 196.39 182.02 378.41 196.39 295.91 492.30 196.39 LML (ms) Caso 5 5 5 Global 8.98 Cuadro 1: Distancias promedio en Vivaldi variando la LML buena idea calcular la distancia en el plano para intentar obtener pares de peers en el mismo ISP. Creemos que estos resultados muestran el buen comportamiento de las coordenadas de Vivaldi en esta red de prueba. 8.4. Distancia como indicador de proximidad Para seguir, quisimos ver si nodos cercanos en distancia tienen mayor probabilidad de estar en el mismo ISP. El comportamiento de las coordenadas en la red de prueba sugerı́a que esto debı́a ser ası́. En el cuadro 1 se puede ver que el promedio de las distancias entre nodos de un mismo AS es bastante menor que el promedio de las distancias entre todos los nodos. Para el caso LML 10 ms (que es el que usamos para las simulaciones de BitTorrent), la distancia promedio entre nodos del mismo AS, como porcentaje de la distancia promedio entre todos los nodos, es (40,01/167,21) × 100 = 23,93 %. Para el caso LML 100 ms (el peor caso) el porcentaje es (378,41/492,30) × 100 = 76,87 %. La distancia promedio entre los nodos de un mismo AS es un 24 % de la distancia promedio entre todos los nodos. Esto sugiere que en promedio los nodos de un mismo AS están mucho más cerca que un par de nodos cualesquiera, y por lo tanto podemos esperar que la distancia sea una buena manera de elegir un nodo del mismo ISP. Se puede observar también como se degradan las coordenadas a medida que aumenta la LML. En el caso 100 ms la distancia promedio entre nodos de un mismo AS es más de un 75 % de la distancia promedio entre dos nodos cualesquiera, lo cual hace mucho menos probable que elegir un nodo cercano implique elegir un nodo en el mismo ISP. Calculando la distancia en el plano, con LML de 10 ms, la distancia promedio intra-AS como porcentaje de la distancia promedio global es (22,09/149,28) ∗ 100 = 14,80 %, mientras que al calcular la distancia total el porcentaje era 24 %. Con LML 100 ms, el porcentaje es (182,02/295,91) ∗ 100 = 61,51 %, y calculando la distancia total el porcentaje era 77 %. Sin embargo, 62 % sigue siendo varias veces superior al porcentaje del caso 10 ms (15 %), por lo tanto parece cierto que el aumento de la LML degrada las coordenadas, si bien excluir la componente H 34 LML (ms) 10 100 Distancia total ( %) Distancia en el plano ( %) 6.61 23.00 6.26 20.67 Cuadro 2: Porcentajes de falsos positivos nos permite mitigar un poco esa degradación, y por sobre todo mejorar significativamente el caso de LML 10 ms. No obstante la diferencia entre las distancias promedio, también es importante que no haya muchos falsos positivos. Llamamos falso positivo a un par nodos de distintos ASs que calculan una distancia entre ellos menor que el promedio de distancias entre nodos del mismo AS (intraAS). Esto puede suceder si la distribución de distancias entre nodos de distintos ASs (inter-AS) está muy alejada de la media: hay muchos pares de nodos inter-AS que calculan una distancia baja, pero muchos más que calculan una distancia muy alta. Si muchos pares de nodos inter-AS son falsos positivos, entonces sucederá que el algoritmo upload appeal eligirá incorrectamente nodos cercanos que no están en el mismo AS. Es necesario entonces conocer la distribución de las distancias, y no solamente su promedio. En la figuras 10 y 11 mostramos los histogramas de distancias, para el caso 10 y 100 ms, calculando tanto la distancia total como la distancia en el plano. Además, marcamos en todos los gráficos el promedio de distancias intra-AS. Por otro lado, en el cuadro 2 mostramos el porcentaje de falsos positivos en ambos casos, y para ambos cálculos de distancia. En el caso 10 ms, calculando la distancia total, la distribución de las distancias intra-AS es marcadamente asimétrica, con un pico aproximadamente en el valor 40. Al contrario, la distribución de distancias inter-AS es más simétrica, con varios picos, el más grande después del valor 200. Podemos ver que las distancias intra-AS son marcadamente menores que las distancias inter-AS. Solamente un pequeño porcentaje de estas últimas queda por debajo del promedio de distancias intra-AS, causando un 6.61 % de falsos positivos. Calculando la distancia en el plano la situación se mantiene, pero los histogramas se desplazan a la izquierda. Esto es esperable, ya que al calcular la distancia en el plano todas las distancias son menores. Sigue habiendo solamente un pequeño porcentaje de distancias entre nodos de distintos ASs que quedan por debajo del promedio de distancias entre nodos del mismo AS. El porcentaje de falsos positivos se reduce ligeramente, a 6.26 %. Pasando al caso 100 ms, calculando la distancia total, notamos como el valor alto de LML afecta notablemente la distribución de las distancias. El histograma de distancias intra-AS es más ancho, y esperablemente está corrido hacia la derecha, hacia valores mayores de distancia. El histograma de distancias inter-AS es todavı́a más ancho, alcanzando valores de distancia mucho mayores. Como era de esperar, en este caso la superposición es mucho mayor, y el porcentaje de falsos positivos aumenta a 23 %. Sin embargo, teniendo en cuenta que 100 ms de LML es un caso de congestión extrema, un 23 % de falsos positivos no es un resultado malo. Calculando la distancia en el plano, para el caso 100 ms, la situación mejora ligeramente. Ambos histogramas se mueven notoriamente hacia la izquierda, pues estamos restando 200 ms de latencia. Sin embargo, la superposición se mantiene similar, y consecuentemente el porcentaje de falsos positivos sólo disminuye ligeramente, a 20 %. En los casos de LML razonable (10 ms) las distancias se comportan como esperábamos, diferenciando claramente nodos en el mismo AS, con pocos falsos positivos. Esto sugiere que el algoritmo upload appeal podrá utilizar la estimación de latencia para elegir peers en el mismo ISP. Con una LML mayor el porcentaje de falsos positivos aumenta, pero es sorprendente que no sea un número mucho mayor teniendo en cuenta que la LML es mayor que cualquier enlace inter-ISP. 35 0.35 0.35 Mismo AS Distinto AS Promedio mismo AS 0.3 0.25 Frecuencia relativa 0.25 Frecuencia relativa Mismo AS Distinto AS Promedio mismo AS 0.3 0.2 0.15 0.2 0.15 0.1 0.1 0.05 0.05 0 0 0 50 100 150 200 250 Distancia 300 350 400 450 0 (a) Distancia total 50 100 150 200 250 Distancia 300 350 400 450 (b) Distancia en el plano Figura 10: Histogramas de distancias, caso 10 ms 0.05 0.05 Mismo AS Distinto AS Promedio mismo AS Mismo AS Distinto AS Promedio mismo AS 0.04 Frecuencia relativa Frecuencia relativa 0.04 0.03 0.02 0.01 0.03 0.02 0.01 0 0 0 200 400 600 Distancia 800 1000 1200 0 (a) Distancia total 200 400 600 Distancia 800 (b) Distancia en el plano Figura 11: Histogramas de distancias, caso 100 ms 36 1000 1200 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 100 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 25 0 20 H Y 15 10 5 -100 0 100 0 -100 Y -100 0 X 100 -200 -200 200 -100 0 100 200 X (a) 3D (b) 2D Figura 12: Visualización de las coordenadas de los nodos, LML 5 ms 200 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 45 40 35 30 25 20 15 10 5 0 100 0 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 -100 200 100 0 -200 -100 X -100 0 Y -200 -200 100 -200 -100 0 100 X (a) 3D (b) 2D Figura 13: Visualización de las coordenadas de los nodos, LML 10 ms 8.5. Comportamiento de las coordenadas frente a variaciones de la LML Presentamos, para terminar, los gráficos de las coordenadas de los nodos a medida que aumenta la LML. Las figuras 12 a 16 muestran las coordenadas de los nodos en casos de LML 5, 10, 20, 50 y 100 ms. Se puede observar como los grupos de nodos correspondientes a los ASs van perdiendo forma a medida que la LML aumenta. Los casos de 5 y 10 ms tienen grupos diferenciados para los ASs 0 y 1, un grupo para los ASs 2 y 3, y otro grupo para los ASs 4 y 5. Los casos de 20 y 50 ms mantienen estos grupos, pero la distancia entre los grupos se reduce, mostrando como el aumento en la LML empieza a dominar por sobre los enlaces inter-ISP. Finalmente, en el caso 100 ms ya no se distinguen grupos, pues en este caso la LML es mayor que cualquier enlace inter-ISP. Estos resultados son consistentes con la situación de aumento de la distancia promedio intraAS contra la distancia promedio total. A medida que aumenta la LML la distancia contra un nodo del mismo ISP no es mucho menor que la distancia promedio contra un nodo cualquiera, y de la misma manera no se distinguen agrupamientos en los gráficos. 8.6. Análisis Podemos ver entonces que, en los experimentos realizados: Con LML bajas y medias Vivaldi embebe los nodos respetando la topologı́a de la red. Se distinguen en la visualización de las coordenadas los distintos grupos de nodos correspondientes 37 0 Y H 60 50 40 30 20 10 0 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 100 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 -100 100 0 -200 -100 Y -100 0 100 X 200 -200 -100 (a) 3D 0 X 100 200 (b) 2D Figura 14: Visualización de las coordenadas de los nodos, LML 20 ms AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 200 160 140 120 100 80 60 40 20 0 100 0 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 -100 200 100 0 -300 -200 -100 0 X -100 100 200 300 -200 Y -200 400 -300 -200 -100 0 100 200 300 400 X (a) 3D (b) 2D Figura 15: Visualización de las coordenadas de los nodos, LML 50 ms 400 350 300 250 200 150 100 50 0 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 300 200 100 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 0 -100 -500-400 -300-200 -100 0 100 200 300 400 X 500 400 300 200 100 0 Y -100 -200 -300 -200 -300 -500 (a) 3D -400 -300 -200 -100 0 X 100 200 (b) 2D Figura 16: Visualización de las coordenadas de los nodos, LML 100 ms 38 300 400 500 a cada AS. La correlación entre LML y coordenada H es alta. Esto permite calcular la distancia entre nodos obviando la componente H y de esta manera obviar la LML en la estimación de latencia, sin necesitar medirla directamente. En el caso de LML 10 ms, la distancia promedio contra otro nodo del mismo AS es solamente un 24 % de la distancia promedio global. Calculando la distancia en el plano este porcentaje se reduce a un 15 %, confirmando el buen comportamiento del espacio de vectores de altura en la red de prueba. Por otro lado, el porcentaje de falsos positivos es bajo, no superando el 7 %. Esto sugiere que elegir un nodo que esté cerca es una buena manera de elegir un nodo dentro del mismo ISP. A medida que la LML aumenta, las coordenadas se degradan. Sin embargo, es necesario un incremento enorme en la LML para que las coordenadas se vuelvan inútiles. El único caso que no muestra realmente ninguna agrupación es el caso de LML 100 ms, que es un caso muy malo de RTT cablemódem-CMTS, causado por una situación de enorme congestión. No obstante, incluso en este caso el porcentaje de falsos positivos no supera el 24 %. Un detalle importante a mencionar es que nuestra red de prueba incluye enlaces inter-ISP de alta latencia, ya que estamos simulando enlaces entre ISPs de Argentina y sus proveedores de tráfico en EEUU. Posiblemente las coordenadas se degraden más rápidamente en un ISP en EEUU si todos los peers están en EEUU, ya que las latencias entre ISPs allı́ son menores, y entonces un aumento de la LML repercute más. Por otro lado, para un swarm global, es claro que la situación es más similar a la de nuestra red, lo cual haria válidos a nuestros escenarios. 39 9. Implementación de BitTorrent en SSFNet Nuestro objetivo principal es aumentar el tráfico intra-ISP de un swarm BitTorrent utilizando información de coordenadas. Es necesario decidir la manera de utilizar esta información en BitTorrent. En [8] no se especifica ninguna manera de separación de peers en ISPs. Ese trabajo se enfoca en decidir si, teniendo esa información disponible de algún oráculo, ésta se puede utilizar para aumentar el tráfico intra-ISP. El problema es que dado que se supone un oráculo, se puede disponer de información perfecta acerca de la agrupación de peers en ISPs. Por lo tanto, los algoritmos presentados en el trabajo consisten básicamente en hacer que el total de conexiones de cada nodo incluya una fracción fija de conexiones contra peers del mismo ISP. Esto es posible de hacer ya que se dispone de toda la información necesaria. En ese trabajo analizan distintas maneras de garantizar que esta elección guiada no repercuta en las buenas propiedades estructurales de los grafos aleatorios generados por la elección de peers hecha por el tracker [6], ası́ como también maneras de garantizar que no disminuya la tasa de transferencia total mientras se aumenta el tráfico intra-ISP. Nuestra solución se diferencia de [8] en que mantenemos la elección aleatoria de peers del tracker pero modificamos el algoritmo de choking para guiar la transferencia entre peers. La información provista por las coordenadas no es perfecta como en ese caso, y por lo tanto optamos por un enfoque distinto. 9.1. BitTorrent y la estimación de latencia El protocolo BitTorrent requiere actualizar periódicamente los peers en estado no choking. Esta elección se realiza teniendo en cuenta los peers remotos que tienen la mejor tasa de transferencia hacia el peer local. Si esta elección tuviera en cuenta la proximidad de los peers podrı́amos limitar el tráfico inter-ISP. Sin embargo, una elección guiada únicamente por la cercanı́a de los peers afectarı́a la velocidad de bajada, ya que no necesariamente los peers cercanos son los que suben más al peer local. Con este objetivo reemplazamos la tasa de subida del peer remoto por otro número que balancea la tasa de subida con la proximidad del peer remoto. Queremos que el algoritmo de choking preferiera peers que están cerca por sobre los que están más lejos mientras sus tasas de subida sean similares. De esta manera esperamos no perder velocidad final de bajada. Implementar esta polı́tica directamente es complicado. ¿Cuándo son suficientemente similares las tasas de subida como para desempatar con la cercanı́a? Una implementación directa implicarı́a también más procesamiento que simplemente elegir los cuatro peers remotos con mejor tasa de subida hacia el peer local. Por lo tanto, lo que hicimos fue actualizar, junto con la tasa de subida del peer remoto, otro valor que llamamos el interés de subida o upload appeal (a): u2 d Donde u es la tasa de subida del peer remoto y d es la distancia. Este número representa cuánto le interesa al peer local subirle a ese peer remoto, y por lo tanto es creciente en la tasa de subida del peer remoto pero decreciente en la distancia contra el peer remoto. La idea detrás de este valor es que la tasa de subida sea un orden de magnitud más importante que la distancia, y por esta razón la distancia termine importando solamente en caso de que los valores de tasa de subida sean similares. Por ejemplo, si un peer remoto está subiendo al peer local con una tasa que es el doble de la de otro peer remoto, este último tendrá que estar cuatro veces más cerca para lograr ser preferido por sobre el primero. a= 9.2. BitTorrent en SSFNet La comunicación en BitTorrent se realiza sobre protocolo TCP. En SSFNet tenemos disponibles las primitivas clásicas para leer y escribir en un socket TCP (read() y write()), y estas trabajan de una manera cómoda: podemos simplemente enviar y recibir objetos de Java, pero simular la transmisión de una cantidad arbitraria de bytes. 40 Algoritmo 5 Algoritmo de choking modificado for all peer p do if p es uno de los cuatro peers con mejor interés de subida ∧ p está choking then mandar unchoke a p else if p no es uno de los cuatro peers con mejor interés de subida ∧ p no está choking then mandar choke a p end if end for mandar unchoke a q peer al azar en estado choking Tenemos una clase que hereda de ProtocolSession representando el cliente BitTorrent que corre en un nodo. Está será la única clase que herede de ProtocolSession, ya que la simulación está planteada de manera de que no sea necesario tener un tracker. El propósito del tracker es proveer al cliente BitTorrent de una lista de peers con la cual conectarse. En el contexto de la simulación conocemos los peers que existen en ella, ya que conocemos la estructura de la red y podemos identificar a los peers con direcciones NHI. Simularemos entonces la elección aleatoria del tracker eligiendo de manera aleatoria las direcciones NHI con las que el peer se conectará. La simulación se enfoca en recrear los patrones de tráfico encontrados en BitTorrent, y la ausencia de un tracker autónomo no afecta las caracterı́sticas del tráfico. Las primitivas de los sockets TCP son bloqueantes, y por lo tanto requieren continuaciones. El mayor problema que generó la ausencia de primitivas no bloqueantes fue que tuvimos que armar una estructura de entrada/salida asincrónica por sobre las continuaciones. Dado que un peer en todo momento está conectado con varios otros peers, es necesario poder enviar y recibir información en varios sockets al mismo tiempo, y si una lectura en un socket se bloquea, esto será imposible. Cada conexión es bastante independiente de las demás. La única sincronización necesaria es no pedir el mismo bloque en más de una conexión, y esto solamente por una cuestión de eficiencia. Por esta razón creamos una clase que representa una conexión particular entre dos peers, y entonces cada objeto BitTorrent mantiene una colección de objetos de esta clase. Estos objetos manejan los detalles de bajo nivel de la comunicación (escribir un mensaje en el socket), mientras que el objeto BitTorrent se ocupa de la parte de alto nivel (pedido de bloques y mecanismo de choking). Otro de los factores a tener en cuenta en el diseño fue que, teniendo objetos distintos para cada comunicación con un peer, se vuelve necesario desacoplar el envı́o de un mensaje de la intención de enviarlo. Dicho de otra manera, puede suceder que el objeto BitTorrent tenga que enviar por varias conexiones un mensaje que indique que se acaba de completar una pieza (un mensaje have). Cada conexión tiene que tener la posibilidad de “encolar” este mensaje para mandarlo luego, aunque en ese momento esté haciendo otra cosa. Para resolver esto los objetos que representan a una conexión poseen una cola de mensajes. Uno a uno, estos objetos enviarán los mensajes que hayan sido encolados; si no hay mensajes a enviar se detendrán un tiempo configurable, utilizando timers. Dado que el estado interesado y choking se mantiene por conexión, estos objetos guardarán también esa información. Por último, estos objetos también mantienen el estado de las piezas que el peer del otro lado de la conexión tiene. Una vez que es configurado e inicializado, cada nodo posee la siguiente información: Cantidad de piezas en el archivo a bajar Tamaño de la pieza Tamaño del bloque Posibles nuevos peers En caso de ser un seed, el nodo comenzará a escuchar por conexiones entrantes, pero no comenzará a bajar el archivo. El porcentaje de seeds en un swarm real varı́a mucho, dependiendo 41 del tipo y tamaño del archivo a compartir, la popularidad del torrent y el tiempo transcurrido desde su creación. Es normal que muchos torrents tengan pocos seeds, pero torrents populares pueden tener incluso más seeds que peers con el archivo incompleto. En la simulación el porcentaje de seeds es por defecto un 10 % del total de peers en el swarm. En caso de no ser un seed, el nodo comenzará a escuchar conexiones entrantes y además comenzará a iniciar conexiones. Las conexiones en BitTorrent son simétricas, por lo tanto una vez que la conexión está creada, no interesa quién la creo, y por lo tanto todas las conexiones se mantienen en una misma estructura de datos y son equivalentes para el objeto BitTorrent: intentará bajar piezas en todas ellas, y podrá pasarlas a estado no choking a todas. Si esto no fuera manejado correctamente, el cliente podrı́a estar pasando un seed a estado no choking; algo inútil, pues los seeds no están bajando el archivo, y por lo tanto no pedirán piezas. Decidimos que en nuestra implementación los peers mantengan siempre su estado interesado actualizado. De esta manera, el peer local pasa a estado no choking los cuatro peers remotos interesados que tengan mejor tasa de subida o interés de subida. Un seed, que nunca está interesado, no será pasado a estado no choking mientras haya peers interesados. La espera de conexiones nuevas está resuelta con continuaciones, ya que listen() es una primitiva bloqueante. Cada vez que se completa un listen() se llama a un método auxiliar que maneja la creación de la conexión, y luego se vuelve a bloquear esperando un nuevo listen(). El inicio de conexiones nuevas debe ser resuelto de la misma manera ya que connect() es también una primitiva bloqueante. La posibilidad de iniciar una conexión nueva está determinada por la cantidad de conexiones existentes: los nodos poseen un número máximo de conexiones que pueden tener abiertas, y por lo tanto abren conexiones nuevas mientras no hayan llegado a este número. Esto es un comportamiento normal en los clientes de BitTorrent reales. Para simular más fielmente la realidad, los peers que no son seeds inician la bajada en distintos momentos. Cada uno empieza a bajar el archivo después de esperar un tiempo aleatorio siguiendo una distribución ley de potencia23 . Esto hace que la mayorı́a de los peers esperen poco tiempo, pero que también haya algunos peers que esperen más. Al pasar este tiempo el cliente empieza a conectarse con peers y a encolar pedidos de bloques. Aquı́ se sigue el mecanismo de elegir la primera pieza al azar y luego elegir utilizando rarest first, siempre intentando completar primero una pieza antes de comenzar una nueva. Para poder resolver el rarest first, toda la información contenida en los mensajes bitfield y have recibidos es compilada en un arreglo que contiene la cuenta global de repeticiones de cada pieza. Sin embargo, dado que no todos los peers tienen todas las piezas, la elección en cada conexión es la pieza menos replicada entre las que el peer remoto tiene en el momento. Una vez pedido un bloque en cada conexión no choking se procede a configurar un timer que reinicie este proceso después de un cierto delay configurable. Esta es la manera de resolver lo que en una aplicación normal serı́a un sleep() o un bloqueo (en select()) hasta tener alguna entrada en algún socket. Cada vez que se recibe un bloque en respuesta de algún pedido se actualiza la información de bloques y piezas. Cada vez que se completa una pieza, el objeto BitTorrent encola un mensaje have en todas las conexiones. Para evitar mandar mensajes have superfluos, no se avisa de piezas completas a nodos que ya las tienen, pues no le servirı́a de ninguna manera saberlo, ya que no van a intentar bajarla. La información de bloques y piezas es utilizada por la rutina que decide qué bloque encolar en cada conexión. Eventualmente el nodo terminará de bajar el archivo y, por lo tanto, dejará de conectarse con nuevos peers y pasará a modo seed. La única diferencia, recordemos, es que los seeds eligen a los cuatro peers que más están bajando de ellos para pasar a modo no choking. Nuevamente, para respetar mejor el comportamiento real de los peers, una vez que un peer se convierte en seed configura un timer para después de que el timer expire cerrar todas sus conexiones. Este tiempo también sigue una distribución ley de potencia. Este comportamiento de retrasar el inicio de la bajada y no cerrar las conexiones apenas 23 En una distribución ley de potencia la densidad de probabilidad se concentra en los valores cercanos al cero, dando un gráfico asimétrico con cola a la derecha. 42 terminada la bajada contribuye a que el comportamiento de los peers se asemeje más a la realidad, en la cual al publicarse un archivo .torrent inicialmente se agregan muchos peers al swarm, y luego cada vez se van agregando menos [6]. Luego de un tiempo, los peers comienzan a terminar el archivo, y la mayorı́a de ellos es seed por un tiempo bastante corto, pero algunos siguen siendo seeds más tiempo [6]. 9.3. Implementación de Vivaldi a cuestas de BitTorrent Usamos la información de distancia para modificar el algoritmo de choking y, siempre que dos peers remotos estén subiendo al peer local con una tasa de subida similar, desempatamos con el peer que estimemos más cercano (ver sección 9.1). Falta, entonces, explicar cómo sobrecargamos la información de coordenadas en los mensajes de BitTorrent. Nuestra implementación original agregaba la coordenada y el error actual en todos los mensajes intercambiados entre los nodos. Esto incluı́a los mensajes request y piece. Estos mensajes comprenden una enorme mayorı́a de los mensajes totales intercambiados. En las pruebas preliminares, sin embargo, notamos que las coordenadas se degeneraban mucho, ya que los nodos debı́an actualizar su coordenada contra el mismo nodo remoto muchas veces por minuto. Por lo tanto, decidimos agregar la coordenada y el error actual de cada nodo en cada mensaje de BitTorrent intercambiado excepto en los mensajes request y piece. La idea detrás de esto es intercambiar mensajes de una manera más independiente que con los cinco peers que están en estado no choking. El resto de los mensajes, choke, unchoke, interested, not interested, have y bitfield se intercambian a un ritmo más o menos similar entre todos los nodos, y por lo tanto proveen una base más estable para la información de coordenadas. De esta manera, cada vez que una conexión de un nodo recibe alguno de estos mensajes, provee esta información al nodo para que actualice la coordenada local. 9.4. Implementación de las modificaciones a Vivaldi Uno de los objetivos de este trabajo es analizar modificaciones al protocolo Vivaldi que tienen como propósito mejorar su comportamiento en el caso de su utilización a cuestas de BitTorrent. Incluimos una modificación propuesta por nosotros, el cálculo de la distancia en el plano, y tres modificaciones propuestas en [11], el filtro de latencia, las coordenadas de cinco dimensiones, y la ampliación del conjunto de vecinos. Las tres primeras modificaciones se pueden realizar de manera muy simple. La operatoria provista por nuestra implementación de coordenadas en el espacio de vectores de altura incluye funcionalidad tanto para calcular la distancia en el plano como para utilizar coordenadas de cinco dimensiones. Por otro lado, la propuesta en [11] para el filtro de mediana consiste en recordar una cantidad fija de las últimas mediciones, por lo tanto una lista de mediciones de latencia basta para poder utilizar esta mejora en la experimentación. La ampliación del conjunto de vecinos requiere una implementación más intrusiva. Para empezar, es necesario recordar este conjunto. Al recibir una nueva medición de latencia se la debe agregar al conjunto de vecinos, reemplazando eventualmente una medición más vieja contra el mismo vecino. Se debe actualizar la edad de las mediciones, eliminando las que sean demasiado viejas, y recalcular la fuerza total realizando nuevamente el escalamiento del desplazamiento generado por cada vecino. 9.5. La red de prueba para SSFNet La red de prueba utilizada en la simulación de BitTorrent es similar a la utilizada para las pruebas de Vivaldi. Sin embargo, dado que el procesamiento requerido para BitTorrent es mayor, la cantidad de nodos se redujo a 20 por AS para un total de 120 nodos. La estructura de la red es similar, pero redujimos la cantidad de nodos por CMTS de 40 a 5. Si bien puede parecer un número bajo, la mayorı́a de los torrents que uno puede encontrar normalmente en Internet no pasan esa cantidad de peers en un momento dado. Como nuestro 43 Router BGP representando a un AS sin nodos Router BGP representando a un AS con 20 nodos cablemódem 10 ms USA2 (AS 5) USA1 (AS 4) 75 ms 75 ms 75 ms 1 ms Cablevisión (AS 0) Prima (AS 6) 1 ms 1 ms 2 ms 2 ms Multicanal (AS 1) 2 ms 75 ms Telecom (AS 2) Telefónica (AS 3) Figura 17: La red de prueba para la simulación de BitTorrent interés es simular tráfico de BitTorrent por un perı́odo acotado de tiempo, 120 peers totales parece una cantidad suficiente. Al haber reducido la cantidad de nodos por CMTS tampoco necesitábamos anidar redes en tantos niveles, y por lo tanto en la simulación de BitTorrent los nodos poseen una dirección NHI con dos identificadores, el identificador de la izquierda es del AS y el de la derecha es del nodo dentro del AS. El único inconveniente que presentó el simulador en este caso fue que el bitrate de las conexiones entre CM y CMTS debe ser especificado de manera simétrica, al igual que la latencia. Si bien en el caso de la latencia esto no es un problema, ya que un paquete siempre recorre ambos sentidos de la conexión, la asimetrı́a en el ancho de banda de las conexiones residenciales sı́ afecta el funcionamiento de BitTorrent: una conexión residencial contribuye poco ancho de banda de subida comparado con el que serı́a capaz de absorber para bajar. Normalmente, los algoritmos de choking tienen como consecuencia que un usuario residencial tiene tasas de bajada no mucho mayores a su tasa de subida. Sin embargo, en un torrent con muchos seeds o muchos usuarios con conexiones simétricas, la tasa de bajada puede ser mucho mayor a la tasa de subida. Nuestra solución a este problema, con el objetivo de mantener la representatividad de los resultados, fue que el bitrate de los enlaces fuera suficientemente bajo como para que la mitad de esa tasa fuera similar a la tasa de subida de una conexión de banda ancha residencial. 44 100 90 80 70 60 50 40 30 20 10 0 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 200 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 100 200 100 200 X 100 Y 300 400 100 200 300 400 X (a) 3D (b) 2D Figura 18: Visualización de las coordenadas calculadas por Vivaldi a cuestas de BitTorrent, caso normal 10. Resultados de la simulación de BitTorrent La experimentación realizada consistió en simular un swarm de BitTorrent de 120 peers bajando un archivo de 64 MB durante una hora. 64 MB es un tamaño razonable para obtener patrones de tráfico caracterı́sticos de BitTorrent. Archivos más grandes solamente alargan la simulación sin cambiar el comportamiento del tráfico [8]. El swarm tiene, al inicio, 12 seeds. Los peers comienzan a bajar el archivo en algún momento al azar durante los primeros 10 minutos de la simulación, siguiendo una distribución ley de potencia. Cuando un peer termina de bajar el archivo se convierte en seed y comparte el archivo durante un tiempo al azar que sigue nuevamente una distribución ley de potencia, con un máximo de una hora. Los seeds originales comparten el archivo durante toda la simulación. En el caso normal la elección de peers a pasar a estado no choking se basa únicamente en la tasa de subida que el peer remoto mantiene con el peer normal. En el caso interés de subida, utilizamos justamente el algoritmo interés de subida, en el cual el peer local elige a los peers remotos que le están subiendo más, pero desempata eligiendo los que están más cerca. Incluimos también una ejecución del protocolo Vivaldi de manera autónoma (sin correr a cuestas de BitTorrent) en la misma red para poder comparar las coordenadas obtenidas con Vivaldi a cuestas de BitTorrent. Como primer paso querı́amos ver las caracterı́sticas de las coordenadas calculadas por Vivaldi cuando la información de coordenadas y error se intercambia a cuestas de los mensajes normales de BitTorrent. En las figuras 18, 19 y 20 mostramos las coordenadas de los tres casos. Podemos ver que no hay una diferencia marcada entre los dos casos en los que Vivaldi se implementa a cuestas de BitTorrent. Esto es esperable ya que como no incluimos información de coordenadas en los mensajes BitTorrent request y piece, la calidad de las coordenadas está determinada por el conjunto de peers remotos con los que cada peer local está conectado. Este conjunto no varı́a al utilizar el algoritmo interés de subida. En comparación, las coordenadas calculadas cuando Vivaldi se ejecuta de manera autónoma resultan mejores, agrupando mucho mejor a los peers en ASs. Solamente en este último caso se distinguen claramente los distintos ASs de la red de prueba. Sospechamos que estos resultados se deben a que en el caso autónomo no hay restricciones para la comunicación entre los nodos, mientras que al funcionar a cuestas de BitTorrent los nodos intercambian coordenadas solamente si están conectados entre sı́. Esto lleva a que las coordenadas tengan poco error entre los nodos que están conectados entre sı́, pero más error a nivel global. Como hicimos para Vivaldi en la implementación autónoma, analizamos también en este caso las distancias promedio entre pares de nodos. En la red de prueba para BitTorrent la dirección NHI de los nodos tiene dos componentes, y por lo tanto comparamos directamente el promedio de las distancias entre pares de nodos del mismo AS contra el promedio de las distancias entre todos 45 100 90 80 70 60 50 40 30 20 10 0 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 0 Y H AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 0 -100 Y 0 100 X 200 -100 -100 -100 0 100 200 X (a) 3D (b) 2D Figura 19: Visualización de las coordenadas calculadas por Vivaldi a cuestas de BitTorrent, caso interés de subida AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 AS 0 AS 1 AS 2 AS 3 AS 4 AS 5 25 0 20 15 Y H 10 5 0 0 -300 Y -200 -100 X 0 100 -300 (a) 3D -200 -100 X 0 (b) 2D Figura 20: Visualización de las coordenadas calculadas por Vivaldi autónomo 46 100 Caso Mismo AS Global Porcentaje BitTorrent, normal, distancia en el plano BitTorrent, normal 64.16 106.47 65.26 107.57 98.31 % 98.98 % BitTorrent, interés de subida, distancia en el plano BitTorrent, interés de subida 62.22 103.59 64.72 106.09 96.14 % 97.65 % Vivaldi autónomo, distancia en el plano Vivaldi autónomo 10.15 40.10 127.99 157.95 7.93 % 25.39 % Cuadro 3: Distancias promedio en BitTorrent. los pares de nodos. Presentamos estos resultados en el cuadro 3. Comprobamos, de manera numérica, la diferencia entre las coordenadas calculadas de manera autónoma y las coordenadas calculadas a cuestas de los mensajes de BitTorrent. La poca agrupación que se ve en los gráficos de las figuras 18 y 19 se corresponde con porcentajes altos de distancia promedio intra-AS contra distancia promedio total. En este caso dos peers del mismo AS están en promedio a una distancia que es un 98 % de la distancia promedio entre todos los peers, lo cual hace más difı́cil distinguir nodos en los distintos ASs, como se comprueba en los gráficos. Como contraparte, la enorme agrupación que podemos ver en la figura 20 se corresponde con un porcentaje bajo para el promedio de distancias intra-ISP frente al promedio de distancias global. El promedio de las distancias entre peers del mismo AS es solamente un 25 % del promedio de las distancias entre cualquier par de nodos. Nuevamente, sospechamos que lo que sucede es que al utilizar Vivaldi a cuestas de BitTorrent las coordenadas logran poco error solamente para los nodos que intercambian activamente información. Al calcular el promedio entre todos los pares de nodos, tanto dentro del mismo AS o a nivel global, incluimos estimaciones entre pares de nodos que no se han comunicado. Nuestro principal objetivo, de cualquier manera, fue analizar las caracterı́sticas del tráfico al usar nuestro algoritmo de interés de subida para verificar si se obtiene un aumento en el tráfico intra-ISP sin empeorar las velocidades de bajada de los nodos. La simulación nos permite contar la cantidad de piezas que se intercambian dentro del swarm, y cuántas de ellas no salen de un mismo AS o ISP. De esta manera, en el cuadro 4 presentamos tanto los porcentajes de piezas totales que se intercambian entre nodos del mismo AS ası́ como entre nodos del mismo ISP. Recordemos que uno de los ISPs que modelamos está constituido por dos ASs y por lo tanto necesitamos hacer la distinción entre AS e ISP. Mostramos además cuanto mejoramos en cada caso: Diferencia = Interés de subida − Normal Podemos ver en el cuadro que utilizando el algoritmo de interés de subida ganamos casi cinco puntos porcentuales de piezas que dejan de salir del ISP. Para comprobar que no estemos perdiendo velocidad de bajada, en el cuadro 5 comparamos la cantidad total de piezas que se intercambian en ambos casos, y podemos ver que no hay diferencia significativa. El swarm intercambia en total aproximadamente 230000 piezas de 32 KB. Ese 5 % de piezas que dejan de salir del ISP con el uso de interés de subida representan: 229619 ∗ 4,86 % ∗ 32 KB ≈ 348 MB Aproximadamente 348 MB que dejan de salir del ISP, para un solo swarm de un solo torrent de 64 MB durante una hora. Esto equivale que cinco copias y media más del archivo se intercambien sin que el tráfico salga de los ISPs. 47 Caso Normal ( %) Interés de subida ( %) Diferencia ( %) 18.50 25.36 23.06 30.22 4.55 4.86 Dentro del mismo AS Dentro del mismo ISP Cuadro 4: Porcentaje de piezas intercambiadas dentro del mismo AS e ISP Caso Piezas totales intercambiadas por el swarm Normal Interés de subida 229311 229619 Cuadro 5: Cantidad total de piezas intercambiadas 10.1. Experimentación con las modificaciones a Vivaldi La experimentación con las modificaciones es similar a la anterior. En cada caso tenemos un swarm de 120 peers totales, con 12 seeds, ejecutando el protocolo BitTorrent durante una hora. Medimos la cantidad de piezas totales que se intercambian, y el porcentaje de éstas que se intercambian dentro del mismo AS (con seis ASs en total) y las que se intercambian dentro del mismo ISP (ya que nuestra red incluye un ISP con dos ASs). En el caso normal los nodos que se pasan a estado no choking son elegidos con el algoritmo de choking original de BitTorrent. En los restantes ocho casos los nodos que se pasan a estado no choking son elegidos con nuestro algoritmo de interés de subida. Lo que varı́a en estos ocho casos es cómo se calculan las coordenadas, y cómo se calcula la distancia entre los nodos: Calcular la distancia entre los nodos excluyendo la componente H, lo que llamamos la distancia en el plano. Utilizar el espacio de vectores de altura con cinco dimensiones, 4D+H. Utilizar el filtro de mediana para el cálculo de coordenadas. Esto genera ocho posibles combinaciones de modificaciones: Caso 2D+H: las coordenadas se calculan en el espacio de vectores de altura con tres dimensiones y la distancia se calcula tomando todas las componentes de las coordenadas. Caso 2D: el cálculo de distancia excluye la componente H. Caso 4D+H: las coordenadas se calculan en el espacio de vectores de altura con cinco dimensiones. Caso filtro de mediana: las coordenadas se calculan utilizando el filtro de mediana. Caso 4D: las coordenadas se calculan en el espacio de vectores de altura con cinco dimensiones pero el cálculo de distancia excluye la componente H. Caso 2D con filtro de mediana: las coordenadas se calculan en el espacio de vectores de altura con tres dimensiones, utilizando filtro de mediana, pero el cálculo de distancia excluye la componente H. Caso 4D+H con filtro de mediana: las coordenadas se calculan en el espacio de vectores de altura con cinco dimensiones utilizando filtro de mediana. 48 Caso 4D con filtro de mediana: las coordenadas se calculan utilizando el espacio de vectores de altura con cinco dimensiones, utilizando filtro de mediana, pero el cálculo de distancia excluye la componente H. Para cada caso calculamos el porcentaje de piezas que no salen del mismo AS o no salen del mismo ISP, que presentamos en el cuadro 6. Comparamos con el caso normal, midiendo la diferencia: Diferencia = Caso con modificaciones − Caso normal En cada caso, además, sabemos el total de piezas intercambiadas por el swarm, y por lo tanto calculamos la cantidad de MB que dejan de salir de los ISPs. Esto es tráfico inter-ISP que se evita, y podemos cuantificar directamente. Por otro lado, realizamos el análisis de distancias promedio, que presentamos en el cuadro 7. En este caso tenemos solamente dos columnas, el promedio de las distancias entre pares de nodos dentro del mismo AS y el promedio de las distancias entre todos los nodos. El cuadro incluye, para cada caso, las distancias promedio totales y las distancias promedio en el plano. Este cálculo de distancias en el plano es independiente del caso particular que se esté considerando, ya que las distancias en el plano se pueden calcular siempre que se tengan las coordenadas. Estas distancias se utilizan en el algoritmo de choking modificado solamente en los casos 2D, 4D y 4D con filtro de mediana, pues son los casos que utilizan la modificación de distancia en el plano. Mostrar la distancia en el plano en este cuadro nos permite ver si la modificación de coordenadas de cinco dimensiones contribuye a que la componente H capture mejor la LML. Guiar el intercambio de piezas teniendo en cuenta la distancia contribuye a aumentar el porcentaje de piezas que se intercambian dentro del mismo ISP. En el mejor de los casos, un 33 % de las piezas no salen de los ISPs, frente a un 25 % en el caso normal. Esto significa más de 547 MB (o 8 copias y media del archivo) que dejan de salir de los ISPs, para un swarm de un archivo de 64 MB durante una hora. Dentro de las distintas combinaciones el mayor incremento se da al calcular la distancia excluyendo la componente H y utilizar el filtro de mediana. Sin embargo, en todos los casos las combinaciones son mejores que las modificaciones por separado. La única excepción es calcular la distancia en el plano que, incluso como única modificación, ofrece resultados comparables a los casos de modificaciones combinadas. Esto es más evidencia de que calcular la distancia en el plano contribuye a identificar más exactamente peers en ISPs. El filtro de mediana también resulta una modificación útil, ya que en todos los casos es mejor incluir el filtro de mediana que no incluirlo. Esto no sucede con el espacio de cinco dimensiones, ya que incluirlo mejora los resultados en un sólo caso de cuatro totales. Por otro lado, comparando ambos cuadros vemos una alta correlación entre los métodos que logran una diferencia entre la distancia promedio intra-AS contra la distancia promedio global, y su resultado en términos de piezas intercambiadas dentro del ISP. Es decir, confirmamos la idea de que si las coordenadas son útiles para distinguir peers, entonces serán bien aprovechadas por la implementación de BitTorrent. Para finalizar, no encontramos evidencia de que el espacio de vectores de altura de cinco dimensiones favorezca el comportamiento de la componente H. Analizando los casos comparables (2D+H contra 4D+H, filtro de mediana contra 4D+H con filtro de mediana, y 2D con filtro de mediana contra 4D con filtro de mediana) el promedio de distancias totales se mantiene igual o varı́a poco entre los casos, pero el promedio de distancias en el plano siempre aumenta. 10.1.1. Experimentación con la ampliación del conjunto de vecinos No logramos obtener resultados satisfactorios con la implementación de ampliar el conjunto de vecinos. Las coordenadas se degeneraban al punto de ser inusables. Las componentes de las coordenadas son números reales y por lo tanto se representan en la computadora utilizando punto 49 Caso Dentro del mismo AS Dentro del mismo ISP Normal 18.50 % 25.36 % 2D+H Diferencia MB 23.06 % 4.55 % 326.83 30.22 % 4.86 % 348.43 2D Diferencia MB 25.02 % 6.55 % 469.46 32.42 % 7.06 % 506.33 4D+H Diferencia MB 23.20 % 4.70 % 337.16 30.08 % 4.72 % 338.71 Filtro de mediana Diferencia MB 23.34 % 4.83 % 346.44 30.89 % 5.53 % 396.45 4D Diferencia MB 24.53 % 6.03 % 432.25 32.41 % 7.05 % 505.09 2D con filtro de mediana Diferencia MB 25.35 % 6.84 % 489.83 33.01 % 7.65 % 547.43 4D+H con filtro de mediana Diferencia MB 24.95 % 6.45 % 461.57 32.43 % 7.07 % 506.10 4D con filtro de mediana Diferencia MB 24.95 % 6.44 % 461.28 32.64 % 7.27 % 520.72 Cuadro 6: Porcentaje de piezas intercambiadas dentro del mismo AS e ISP, con las modificaciones 50 Distancia promedio entre nodos del mismo AS (ms) Distancia promedio entre todos los nodos (ms) Porcentaje respecto del total Normal, distancia en el plano Normal 64.16 106.47 65.26 107.57 98.31 98.98 2D+H, distancia en el plano 2D+H 62.22 103.59 64.72 106.09 96.14 97.65 2D, distancia en el plano 2D 63.86 106.60 66.02 108.76 96.73 98.02 4D+H, distancia en el plano 4D+H 71.44 108.87 73.42 110.85 97.30 98.21 Filtro de mediana, distancia en el plano Filtro de mediana 65.52 95.53 74.66 104.67 87.76 91.27 4D, distancia en el plano 4D 73.38 106.65 75.51 108.77 97.19 98.05 2D con filtro de mediana, distancia en el plano 2D con filtro de mediana 66.73 99.93 72.98 106.18 91.44 94.11 4D+H con filtro de mediana, distancia en el plano 4D+H con filtro de mediana 79.89 94.17 90.69 104.98 88.08 89.71 4D con filtro de mediana, distancia en el plano 4D con filtro de mediana 81.71 98.76 89.18 106.23 91.63 92.97 Caso Cuadro 7: Distancias promedio en BitTorrent con modificaciones 51 flotante; en todas las simulaciones utilizando esta modificación sucedió que las coordenadas tarde o temprano tenı́an todas componentes con valor Not-a-Number 24 . Resultó que esta modificación estaba causando que las actualizaciones de coordenadas de los nodos aumentaran constantemente la componente H, incluso en los casos en los que la distancia era mayor a la latencia. Al aumentar la componente H aumenta la distancia entre dos nodos, ya que la componente H es siempre positiva y en el cálculo de distancia la componente H se suma. En la siguiente actualización, el nodo se encontraba más lejos de lo que se habı́a calculado en la actualización anterior. La distancia era todavı́a mayor a la latencia, el error era mayor que en la actualización anterior, e incluso ası́ el desplazamiento volvı́a a aumentar la componente H. ¿Por qué no pasa esto en la ejecución normal? En la ejecución normal cada medición resulta en una actualización. Esta medición tiene una componente H positiva. El desplazamiento calculado también tendrá una componente H positiva, ya que la operatoria de vectores de altura ası́ lo requiere, pero antes de ser sumado a la coordenada actual, el desplazamiento es escalado con un factor que depende de la diferencia entre el RTT y la distancia. Este factor sı́ puede ser negativo, en caso de que la distancia sea mayor que el RTT. De esta manera, si la distancia es mayor que el RTT, el desplazamiento disminuirá el valor de las componentes de la coordenada, de manera de reducir la distancia, y acercarla al RTT. Al utilizar escalamiento de vecinos los desplazamientos se promedian de manera ponderada, y luego se suman a la coordenada. Creemos que lo que sucede es que al promediarse, las componentes negativas de algunos desplazamientos se ven compensadas por otras componentes positivas, y de esta manera el desplazamiento promedio final que se suma tiene todas componentes positivas, y de esta manera podrı́a estar aumentando la distancia de un nodo (si se aumenta la componente H) en un caso en el que deberı́a haberse disminuı́do. El sistema de coordenadas, al encontrar cada vez los nodos más alejados entre sı́, y de esta manera con más y más error entre distancia y RTT, degeneraba en una situación en la que las componentes X e Y se movı́an hacia el origen, intentando compensar el aumento de distancia generado por la suma siempre positiva en la componente H. Eventualmente la componente H se hacı́a infinito25 . Luego, al intentar operar con estos infinitos aparecı́an los NaNs que degeneraban las coordenadas, ya que todas las distancias eran NaNs y por lo tanto el upload appeal también era NaN y la elección de peers se volvı́a inútil. Revisamos la operatoria de Vivaldi presentada en [7] y la modificación de ampliar el conjunto de vecinos presentada en [11] y no encontramos nada que pudiera sugerir este comportamiento. Suponemos que el hecho de que en ese trabajo las coordenadas no se utilizaran para guiar la elección de peers hizo que no encontraran este comportamiento. 24 Not-a-Number (NaN) es un valor especial en el esquema de punto flotante que representa el resultado de una operación indefinida. 25 El esquema de punto flotante también incluye valores especiales para representar el infinito. 52 11. Conclusiones Este trabajo tenı́a dos objetivos principales: caracterizar el comportamiento de una implementación de coordenadas virtuales en una red con enlaces de banda ancha residencial y utilizar la información provista por el sistema de coordenadas para aumentar el tráfico intra-ISP de un swarm BitTorrent. En nuestra opinión los aportes de este trabajo son: La aplicación de un sistema de coordenadas virtuales para guiar el tráfico de un swarm BitTorrent. Una implementación del protocolo Vivaldi en un simulador que permite construir redes de cualquier caracterı́stica, incluyendo una modificación que tiene como objetivo reducir el impacto de la latencia del link de acceso. Un análisis detallado del comportamiento de Vivaldi en una red con enlaces de banda ancha residencial, haciendo énfasis en cómo la latencia de estos enlaces afecta la calidad de las coordenadas. Una implementación de BitTorrent en el mismo simulador, que permite ver el comportamiento de un swarm de cualquier cantidad de peers bajando un archivo de cualquier tamaño. Una modificación al algoritmo de choking de BitTorrent que pasa el porcentaje de tráfico intercambiado entre nodos de un mismo ISP del 25 % al 33 %, sin afectar las tasas de transferencia ni los tiempos de bajada, y que funciona de manera completamente distribuida. Un análisis detallado de las modificaciones propuestas para utilizar Vivaldi a cuestas del tráfico de otra aplicación. Realizamos una implementación de Vivaldi en el simulador SSFNet, que soporta construir redes con enlaces de banda ancha residencial. Evaluamos el sistema de coordenadas en una red inspirada en la red de un ISP de banda ancha en Argentina. El simulador nos permitió generar escenarios de LML alta, caracterı́stica saliente de las redes de banda ancha residenciales. Las coordenadas obtenidas por Vivaldi en la red de prueba del simulador resultaron buenas, agrupando correctamente los nodos que pertenecı́an al mismo AS. La distancia promedio entre dos nodos del mismo AS fue aproximadamente un cuarto de la distancia promedio entre cualquier par de nodos, mientras que solamente un 7 % de los pares de nodos en distintos ASs calcularon entre ellos una distancia menor que el promedio de distancias intra-AS. Por lo tanto, fue factible utilizar la latencia estimada por las coordenadas para que los nodos de BitTorrent eligieran otros peers de su mismo ISP. Logramos además caracterizar el comportamiento de Vivaldi en escenarios de LML alta, mostrando que existen maneras de salvar la degradación de las coordenadas en estas situaciones, como realizar el cálculo de distancia entre dos nodos sin tener en cuenta la componente H de sus coordenadas. Realizamos una implementación completa de BitTorrent en el mismo simulador. La implementación permite elegir tanto la cantidad de peers del swarm como el tamaño del archivo a compartir. Incluimos todos los mecanismos básicos de BitTorrent: las distintas estrategias de elección de piezas, el algoritmo de choking y los mensajes de control. Debido a que realizamos la implementación de Vivaldi a cuestas del tráfico de BitTorrent incorporamos las modificaciones propuestas en [11] para contrarrestar la degradación de Vivaldi en esta situación. Modificamos el algoritmo de choking de BitTorrent para que decidiera empates entre dos peers remotos con la misma tasa de subida eligiendo al nodo más cercano. Utilizando esta implementación pasamos de un 25 % de piezas que no salen del respectivo ISP a un 33 %. Esto significa un 30 % de mejora o más de 500 MB de tráfico que deja de salir de los ISPs para un swarm de BitTorrent de 120 peers compartiendo un archivo de 64 MB durante una hora. Calcular la distancia excluyendo la componente H contribuye a aumentar el tráfico intra-ISP, lo cual sugiere que la componente H del espacio de vectores de altura captura la latencia generada por el link de acceso. Utilizar 53 un filtro de mediana para las mediciones de latencia también contribuye a aumentar el tráfico intra-ISP, ya que evita que mediciones espurias de latencia agreguen error a las coordenadas. Concluimos que es factible el uso de sistemas de coordenadas virtuales para que el tráfico de las aplicaciones P2P sea más ameno para los ISPs. Las coordenadas construidas por Vivaldi son útiles para obtener información acerca de la ubicación relativa de los nodos, aún perdiendo calidad al ser utilizadas a cuestas del tráfico de otra aplicación y sufriendo las latencias de las conexiones de banda ancha residencial. En lı́nea con los resultados de [21] creemos que el enfoque distribuı́do para el problema del tráfico generado por las aplicaciones P2P tiene mejores perspectivas al ser más fácil de implementar y tener mayores posibilidades de escalar. 54 12. Trabajo futuro Las coordenadas en nuestra red de prueba se degradaron notablemente al utilizar Vivaldi a cuestas de los mensajes de BitTorrent. ¿Son tan importantes los requerimientos de conectividad mencionados en [7] para la exactitud de las coordenadas? ¿Es factible realizar modificaciones a un sistema de coordenadas existente o es necesario idear otro sistema que tenga en cuenta una operatoria a cuestas desde el comienzo? Creemos que vale la pena considerar un sistema de estimación de latencia para ser utilizado directamente en una aplicación aprovechando el tráfico generado por ésta. De manera complementaria, también serı́a importante analizar si la operatoria de Vivaldi a cuestas de otra aplicación se justifica cuando las coordenadas generadas por Vivaldi de manera autónoma tienen mucho menos error. Existe la posibilidad de que el tráfico extra generado por Vivaldi de manera autónoma sea compensado por el aumento del tráfico intra-ISP logrado al tener coordenadas más exactas. Por otro lado, el espacio de vectores de altura propuesto para Vivaldi es más que nada una modificación ad-hoc que muestra un buen comportamiento en la práctica. ¿Podemos encontrar espacios que embeban mejor la estructura de Internet? Una posibilidad son las geometrı́as hiperbólicas, mencionadas ya en [7]. Estas geometrı́as tienen caracterı́sticas que las hacen apropiadas para la estructura de Internet [28]. Nuestra implementación del protocolo BitTorrent envı́a mensajes bitfield como primer mensaje en cualquier conexión, y en ambos sentidos. Si estos mensajes tuvieran suficiente información de coordenadas como para poder realizar una estimación de latencia al inicio de la conexión, el peer local podrı́a evitar conexiones nuevas de peers remotos lejanos. Elegir o rechazar peers antes de iniciar el intercambio de piezas no tendrı́a un efecto directo sobre la tasa de transferencia, más allá de poder llevar al peer local a rechazar peers remotos que podrı́an tener mucho ancho de banda de subida. Lo que sı́ serı́a un problema es que esta elección lleve al peer local a perder piezas que solamente están presentes en peers remotos lejanos. Esto podrı́a resultar en que el swarm se fragmente en grupos de nodos cercanos conectados entre sı́, ninguno de los cuales posee todas las piezas del archivo a bajar. Las soluciones que utilizan oráculos [8, 10] consideran este problema, pero las estrategias para evitarlo no parecen aplicarse bien al caso de los sistemas de coordenadas. Creemos que vale la pena analizar mecanismos para, de la misma manera que balanceamos la tasa de subida de un peer remoto con su distancia, balancear las piezas que un peer remoto posee y la distancia a la que se encuentra. Por último, existen tanto otros sistemas de coordenadas, como GNP [22]; otros métodos de estimación de latencia que directamente no utilizan coordenadas virtuales, como Meridian [12]; y otros métodos de identificación de nodos en ISPs, como WHOIS. El funcionamiento de Vivaldi lo hace ideal para utilizar en un swarm BitTorrent, pero si otros mecanismos de estimación de latencia tuvieran más exactitud, podrı́a ser útil considerar modificaciones más generales a BitTorrent para poder acomodarlos. Tanto GNP como Meridian requerirı́an más estructura en el swarm BitTorrent. Sin embargo, esta estructura no vendrı́a acompañada de servidores centrales como en el caso de P4P, y mantendrı́a el funcionamiento distribuido del swarm. Incluso bases de datos administrativas, como WHOIS, podrı́an complementarse bien con el enfoque de cercanı́a utilizado en este trabajo, combinando información de la red en forma de latencia, e información administrativa en forma de consultas a WHOIS. 55 Referencias [1] “Internet Study 2007,” ipoque, Tech. Rep., November 2007. [2] J. Saltzer, D. Reed, and D. Clark, “End-to-end Arguments in System Design,” ACM Transactions in Computer Systems, vol. 2, no. 4, pp. 277–288, November 1984. [3] K. Cho, K. Fukuda, H. Esaki, and A. Kato, “The Impact and Implications of the Growth in Residential User-to-User Traffic,” in Proceedings of SIGCOMM ’06, 2006. [4] N. Anderson and E. Bangeman, “Comcast loses P2P religion, goes agnostic on throttling,” September 2008. [Online]. Available: http://arstechnica.com/news.ars/post/20080919comcast-loses-p2p-religion-goes-agnostic-on-throttling.html [5] N. Anderson, “BitTorrent has new plan to shape up P2P behavior,” December 2008. [Online]. Available: http://arstechnica.com/news.ars/post/20081209-bittorrent-hasnew-plan-to-shape-up-p2p-behavior.html [6] B. Cohen, “Incentives Build Robustness in BitTorrent,” 2003. [7] F. Dabek, R. Cox, F. Kaashoek, and R. Morris, “Vivaldi: A Decentralized Network Coordinate System,” in Proceedings of IEEE SIGCOMM 2004, 2004. [8] R. Bindal, P. Cao, W. Chan, J. Medved, G. Suwala, T. Bates, and A. Zhang, “Improving Traffic Locality in BitTorrent via Biased Neighbor Selection,” in Proceedings of the 26th IEEE international Conference on Distributed Computing Systems, ICDCS, 2006. [9] M. Adler, R. Kumar, K. W. Ross, D. Rubenstein, T. Suel, and D. D. Yao, “Optimal Peer Selection for P2P Downloading and Streaming,” in Proceedings of IEEE INFOCOM 2005, March 2005. [10] H. Xie, Y. R. Yang, A. Krishnamurthy, Y. Liu, and A. Silberschatz, “P4P: Provider Portal for P2P Applications,” in Proceedings of SIGCOMM 2008, 2008. [11] P. Gardner, J. Ledlie, and M. Seltzer, “Network Coordinates in the Wild,” in Proceedings of NSDI ’07, April 2007. [12] B. Wong, A. Slivkins, and E. G. Sirer, “Meridian: A Lightweight Network Location Service Without Virtual Coordinates,” SIGCOMM Computer Communications Review, October 2005. [13] S. Androutsellis-Theotokis and D. Spinellis, “A Survey of Peer-to-Peer Content Distribution Technologies,” ACM Computing Surveys, vol. 36, no. 4, pp. 335–371, 2004 December. [14] H. Balakrishnan, M. F. Kaashoek, D. Karger, R. Morris, and I. Stoica, “Looking Up Data in P2P Systems,” Communications of the ACM, vol. 46, no. 2, pp. 43–48, February 2003. [15] “Twitter.” [Online]. Available: www.twitter.com [16] “YouTube.” [Online]. Available: www.youtube.com [17] N. Anderson, “Forecast: Legal P2P uses growing 10x faster than illegal ones,” October 2008. [Online]. Available: http://arstechnica.com/news.ars/post/20081022-forecast-legal-p2p-usesgrowing-10x-faster-than-illegal-ones.html [18] M. Dischinger, K. P. Gummadi, A. Haeberlen, and S. Saroiu, “Characterizing Residential Broadband Networks,” in Proceedings of the 7th ACM SIGCOMM Conference on Internet Measurement, IMC ’07, October 2007. 56 [19] R. Paul, “Verizon embraces P4P, a more efficient peer-to-peer tech,” March 2008. [Online]. Available: http://arstechnica.com/news.ars/post/20080314-verizon-embraces-p4pa-more-efficient-peer-to-peer-tech.html [20] N. Anderson, “Comcastic P4P trial shows 80 % speed boost for P2P downloads,” November 2008. [Online]. Available: http://arstechnica.com/news.ars/post/20081103-comcastic-p4ptrial-shows-80-speed-boost-for-p2p-downloads.html [21] D. R. Choffnes and F. E. Bustamante, “Taming the Torrent: A practical approach to reducing cross-ISP traffic in peer-to-peer systems,” in Proceedings of ACM SIGCOMM 2008, August 2008. [22] T. S. E. Ng and H. Zhang, “Predicting Internet Network Distance with Coordinates-Based Approaches,” CMU, Tech. Rep., 2002. [23] L. Peterson, T. Anderson, D. Culler, and T. Roscoe, “A Blueprint for Introducing Disruptive Technology into the Internet,” in Proceedings of the 1st ACM Workshop on Hot Topics in Networks (HotNets-I), October 2002. [24] D. Towsley, “The Internet is Flat: a Brief History of Networking in the Next Ten Years,” in Proceedings of PODC ’08, 2008. [25] “SSFNet.” [Online]. Available: www.ssfnet.org [26] V. Aggarwal, A. Feldmann, and C. Scheideler, “Can ISPs and P2P Users Cooperate for Improved Performance?” ACM SIGCOMM Computer Communication Review, vol. 37, no. 3, 2007 July. [27] “uTP (UDP torrenting).” http://forum.utorrent.com/viewtopic.php?id=49813 [Online]. Available: [28] Y. Shavitt and T. Tankel, “Overlay Construction and Distance Estimation,” in Proceedings of IEEE INFOCOM 2004, 2004. 57