• No se han encontrado resultados

CAPÍTULO 1 SISTEMAS PEER-TO-PEER (P2P)

1.4 Tipos de Redes P2P

1.4.2 Sistemas P2P Puros Estructurados

Las redes P2P puras estructuradas superan las dificultades relacionadas con la búsqueda de recursos, mencionadas en la sección anterior, manteniendo el índice de los recursos compartidos en tablas de hash distribuidas (DHT por sus siglas en

inglés) haciendo que cada par se haga responsable de mantener actualizada una porción del índice total de los recursos compartidos. Chord [30], CAN, Tapestry

[28], Pastry [27] y Kademlia [31] son ejemplos de esta categoría de sistemas P2P.

En estas redes se utilizan funciones de hash para asignar valores a cada

recurso y siguen un protocolo para determinar cuál será el par responsable de mantener la información de la locación del recurso. De igual manera, utilizando la misma función de hash, cuando un par desea buscar un recurso puede determinar

1.4 TIPOS DE REDES P2P 31

cuál es el nodo de la red que posee la información de su localización.

Una DHT es una tabla de hash utilizada para guardar la localización de todos

los recursos compartidos en la red. Por localización del recurso entiéndase la dirección del nodo que lo contiene. Esta tabla no reside físicamente en ningún punto particular de la red sino que se encuentra distribuida entre todos los nodos del sistema P2P. Los nodos se comportan como pares con idénticos roles en el sistema. Todos poseen la responsabilidad de mantener una porción de la tabla de

hash y resolver las consultas de otros pares en relación a los datos contenidos en

dicha porción.

Una tabla de hash guarda pares de la forma (clave, valor). Aquí la clave se

corresponde con un recurso y el valor con su localización. Los recursos en el sistema se identifican a partir de su clave obtenida por medio de una función de

hash que es única en todo el sistema. Sea h dicha función y r un recurso dado, la

expresión h(r) denota la clave asociada al recurso r. Sea T la tabla de hash

distribuida del sistema. T almacena pares de la forma (h(r), d(r)) siendo d(r) la

dirección del nodo que contiene al recurso r.

El espacio de las claves en una tabla de hash está asociado al conjunto de

posiciones de la tabla, es decir que una clave representa un índice de la tabla. Si la tabla T contiene el par (h(r), d(r)) es común referirse a ello expresando que T

contiene el valor d(r) en la posición h(r).

Cuando un nodo ingresa a la red se incorpora a una estructura en forma de anillo, asumiendo la tarea de mantener una porción de la tabla T, es decir un

conjunto de valores para un determinado espacio de claves, de acuerdo a su ubicación relativa en la estructura. El anillo está formado por los nodos ordenados de acuerdo al número ID de cada uno.

El ID de cada nodo es un entero de k bits elegido de manera aleatoria. Para

32 SISTEMAS PEER-TO-PEER (P2P)

k= 64. El valor de k también representa el tamaño en bits de las claves que genera

la función hash del sistema. Debido a que el espacio de claves —índices de la

tabla T— y los números ID de los nodos se definen en el mismo rango:

0, 1, …, 2k1 es posible particionar fácilmente la tabla

T entre los nodos del

anillo. Cada nodo se hace cargo de mantener el espacio de claves de la tabla mayores al ID de su nodo antecesor y menores o iguales a su propio ID.

Por simplicidad supóngase k= 6 . El espacio de claves de la tabla T es

0, 1, …, 63. Los ID de los nodos también se definen en el rango 0, 1, …, 63. Supóngase que en la red se encuentran participando los nodos 5, 23, 33, 40 y 50

—ver Figura 1-4—. El espacio de claves de la tabla T se distribuye entre los

nodos de la siguiente forma: al nodo 5 se asignan las claves 51, …, 63, 0, …, 5; al nodo 23 las claves 6, …, 23; al nodo 33 las claves 24, …, 33; al nodo 40 las claves 34, …, 40 y al nodo 50 las claves 41, …, 50.

Figura 1-4 Estructura de anillo de una red P2P basada en DHT. Distribución de la tabla de hash entre los nodos integrantes para un espacio de 26 claves. ID: 5 ID: 23 ID: 33 ID: 40 ID: 50

1.4 TIPOS DE REDES P2P 33

Supóngase que se desea guardar en la tabla T la información de localización

para el recurso r. Se procede de la siguiente forma: i) se aplica la función de hash

sobre r para obtener la clave h(r) del recurso; ii) se localiza el nodo responsable

del espacio de claves al que pertenece h(r) y iii) se envía a dicho nodo el par

(h(r), d(r)) para su almacenamiento. Para la búsqueda de un recurso el

procedimiento es similar, salvo que en el punto iii) se recibe d(r), es decir la

dirección del nodo que posee el recurso buscado r.

Supóngase un esquema simplificado en donde los integrantes del anillo mantienen una única referencia al nodo sucesor en la estructura. La localización del nodo que contiene información sobre la clave buscada puede realizarse fácilmente de manera colaborativa. El nodo que recibe una petición de búsqueda con una clave h(r) que no pertenece a su espacio de claves asignado, simplemente

reenvía la petición al nodo siguiente en el anillo. Así, en algún momento la petición alcanzará al nodo indicado que responderá con el valor d(r) almacenado o

bien informará que el recurso buscado no existe en el sistema.

En el esquema simplificado del párrafo anterior puede ocurrir que una petición de búsqueda deba visitar todos los nodos de la red. Esta situación se resuelve agregando más referencias a otros nodos de la red. Así los nodos mantienen una tabla con punteros a k sucesores —k es el número de bits de los

números ID—. Para abarcar gran parte del anillo la distancia a estos nodos sucesores se incrementa exponencialmente —el nodo cuyo ID es i, guarda las

referencias a los nodos cuyos ID son (i+20) mod (2k), (i+21) mod (2k),

(i+22) mod (2k), …, (i+2k-1) mod (2k)—.

La Figura 1-5 muestra un ejemplo donde se visualiza cómo se forma la tabla de sucesores para el nodo 8 y cuántos saltos debe realizar una petición de búsqueda para la clave 54 hasta alcanzar el nodo 56 responsable de mantener la información para la clave buscada.

34 SISTEMAS PEER-TO-PEER (P2P)

Figura 1-5 (a) Tabla de sucesores para el nodo 8. (b) Camino de petición para la clave 54 iniciada en el nodo 8

Cuando se busca un recurso r, hay que decidir cuál de los k nodos apuntados

en la tabla se debe elegir para el siguiente salto. Para ello se selecciona aquel nodo cuyo ID tenga la menor distancia al valor h(r). Puede probarse que la cantidad de

saltos necesarios para resolver la búsqueda pertenece a O(log N) siendo N la

cantidad de nodos de la red.

Para mantener la estructura funcionando los nodos deben seguir un determinado protocolo cuando desean unirse o dejar la red. El primer paso para el ingreso al sistema es buscar el sucesor del nuevo nodo de acuerdo a su ID utilizando el mismo protocolo usado para dirigir las peticiones de búsqueda ya descripto. El nuevo nodo debe insertarse entre el sucesor hallado y el antecesor. Para ello recibe el espacio de claves asignado desde su sucesor —todas las claves que el sucesor posee menores o iguales al ID del nuevo nodo—. Para garantizar el

1.4 TIPOS DE REDES P2P 35

correcto funcionamiento no se cambian los punteros hasta que se hayan copiado todas las claves que le corresponden al nuevo nodo.

La salida voluntaria de un nodo del sistema también implica una carga de trabajo a realizar. El nodo que deja la red transfiere todas sus claves al nodo sucesor y notifica a su predecesor que deja la red para que este último reconstruya su tabla de sucesores. Sin embargo, en ocasiones un nodo se cae y el protocolo de salida nunca se lleva a cabo. En este caso el predecesor del nodo caído deberá iniciar un proceso de actualización para volver a establecer el anillo.

Si las tablas de sucesores de los nodos no están actualizadas el sistema puede seguir funcionando pero pierde eficiencia. Para mantener las tablas de sucesores actualizadas es necesario realizar tareas de mantenimiento. Chord utiliza un

protocolo de estabilización que cada nodo corre periódicamente en segundo plano para actualizar su tabla de sucesores.

La ventaja de los sistemas P2P puros estructurados se hace evidente cuando la disponibilidad del recurso buscado es reducida, ya que aún en el caso de existir una sola instancia del mismo en algún rincón de la red, será encontrado rápidamente con escasa cantidad de tráfico generado. Sin embargo, para mantener ese alto grado de eficiencia, el sistema debe encontrarse estable y actualizado. Si por el contrario existen muchas instancias del recurso buscado, esta ventaja en relación a otros tipos de redes P2P mucho más simples y fáciles de mantener, como los sistemas puros no estructurados, se hace mucho menos notoria.

Por otro lado, la transitoriedad de los nodos, tan característica de las redes P2P actuales, que entran y salen de la red con mucha frecuencia en períodos cortos de tiempo, ocasionan una importante carga de trabajo asociada al mantenimiento de las tablas de sucesores y al espacio de claves asignado a cada nodo.

36 SISTEMAS PEER-TO-PEER (P2P)

imposibilidad de realizar consultas complejas sobre los recursos indizados. Obsérvese que la tabla de hash T no almacena el valor r sino su clave h(r). Una

clave de hash no da por sí misma ningún tipo de información relevante, sólo se

utiliza para comparar con otra clave de hash. Considérese el ejemplo de un

sistema P2P utilizado para compartir archivos. Lo usual en este caso es que r sea

igual al nombre del archivo. Sin embargo h(r) es un número de k bits a partir del

cual no es posible volver a obtener r. Por lo tanto aún teniendo acceso al conjunto

de claves almacenado no es posible conocer los nombres de los archivos que dieron origen a estas claves. Por lo tanto, estos sistemas sólo admiten consultas simples por el nombre completo del archivo, excluyendo otras más interesantes como podría ser la búsqueda de archivos cuyos nombres contengan una determinada cadena de caracteres.

Dado los inconvenientes mencionados en los párrafos anteriores no es difícil entender por qué estos tipos de redes nacidas en entornos académicos nunca alcanzaron la popularidad que sí lograron otros sistemas más simples.