# data[].attributes.body
Tecnologías de Internet
MAESTRÍA EN SISTEMAS COMPUTACIONALES
SEMESTRES AGOSTO 2022 – ENERO 2023
Actividad: Arquitectura de red: Peer to Peer
AUTORA: Romero Velazco Fátima Adriana
PROFESORA: Dra. Patricia Elizabeth Figueroa Millán

# data[].attributes.body
Alta complejidad: Las arquitecturas P2P tiene una complejidad muy alta para desarrollarse, ya que tenemos que crear aplicaciones que funcionen como cliente y servidor, al mismo tiempo que tenemos que garantizar que las búsquedas de los recursos sean eficientes.

Control: A menos que tengamos un servidor central para administrar los recursos que se buscan y los usuarios que se conectan a la red, es muy fácil perder el control sobre el contenido que se puede compartir en la red.

Seguridad: Esta es una de las características menos implementadas en este tipo de arquitecturas, para evitar la intercepción de las comunicaciones, nodos maliciosos, contenido falso o adulterado o la propagación de virus o programas maliciosos.

Tráfico: En redes no optimizadas como las no estructuradas, podemos saturar la red con una gran cantidad de tráfico para propagar las peticiones a los nodos adyacentes.

# data[].attributes.body
Alta escalabilidad: Las redes P2P permiten escalar fácilmente, pues a mayor número de nodos, más recursos hay disponibles y la carga de trabajo se divide entre todos los participantes.

Tolerancia a fallas: Tener los recursos distribuidos por varios nodos permite que los recursos estén disponibles sin importar si algunos de los nodos se caen.

Descentralización: Los sistemas P2P puros tiene una autonomía completa, por lo que pueden funcionar si un servidor central que organice toda la red.

Privacidad: Debido al sistema de búsqueda por inundación o tablas hash, es posible tener un alto nivel de privacidad, pues no es tan fácil saber que nodo fue el que realizo la petición inicial.

Equilibrio de carga: En una arquitectura P2P, todos los nodos de la red tienen el mismo rol y responsabilidades, por lo que toda la carga de trabajo se equilibra entre todos los nodos de la red.

# data[].attributes.body
https://reactiveprogramming.io/figures/p2p-hibrida.png

# data[].attributes.body
Un ejemplo claro de esta arquitectura es Napster, un programa muy famoso para descargar música en formato MP3. En este sentido, el servidor central de Napster no es quien almacena la información, sino que solo tiene el registro de todos los nodos conectados a la red y que archivos tiene cada nodo para compartir, de esta forma, cuando lanzamos una búsqueda, el servidor central de Napster sabe que nodos tiene ese archivo y nos dirige para que comencemos a descargar el archivo directamente sobre el nodo que tiene el archivo sin necesidad de un intermediario, de esta forma, Napster nunca tiene los archivos, pero sabe quién sí.

# data[].attributes.body
La diferencia fundamental que tiene esta arquitectura con el Cliente-Servidor es que, este servidor no es el que proporciona los recursos, sino que solo sirve de enlace para conectar con otros nodos.

# data[].attributes.body
La arquitectura P2P híbrida o también conocida como Centralizada se caracteriza por tener un servidor central que sirve de enlace entre los nodos de la red, de tal forma que cualquier solitud para consumir los recursos de otros nodos deberán pasar primero por este servidor.

# data[].attributes.body
https://reactiveprogramming.io/figures/p2p-pura-estructurada.png

# data[].attributes.body
Debido a que la tabla hash es distribuida, no existe físicamente un solo servidor, sino que está distribuida entre todos los nodos de la red, y cada nodo guarda un fragmento del índice total de los recursos compartidos.

# data[].attributes.body
Esta tabla hash mantiene un registro de todos los recursos disponibles en la red en un formato Clave-Valor (Key-Value), donde la clave es un hash del recurso y el valor corresponde a la ubicación (nodo) donde se encuentra el recurso, de esta forma, solo es necesario buscar el clave hash del recurso en la tabla para conocer su ubicación.

# data[].attributes.body
La arquitectura P2P estructurada es una variante de la P2P no estructurada, por lo que mucho de la teoría planteada anteriormente aplica exactamente igual, sin embargo, la arquitectura P2P estructurada cambia la forma de buscar los recursos. En lugar de usar el método por inundación, busca los recursos basados en Tablas Hash Distribuidas (DHT por sus siglas en inglés).

# data[].attributes.body
Como podemos ver en la imagen, pueden existir muchas sub-redes donde un par conoce a algunos vecinos y otras sub-redes conocen a otros vecinos diferentes, y a pesar de que todos son partes de la red P2P no todos los pares se conocen entre sí, por lo que un par solo podrá localizar y buscar recursos sobre los vecinos que conozco, lo que provoca que sea imposible llegar a los pares que no conocemos.

# data[].attributes.body
https://reactiveprogramming.io/figures/p2p-vecinos.png

# data[].attributes.body
En esta arquitectura un par solo se puede comunicar con los pares que conozca, es decir, que conoce la ubicación exacta. Ha estos pares conocidos se le conoce como vecinos, por lo que cada par puede tener un número de vecinos diferentes:

# data[].attributes.body
Este tipo de arquitectura conforman una red totalmente descentralizada, donde no existe un servidor central ni roles donde algún nodo de la red tenga más privilegios o responsabilidades, todos los pares actúan como cliente y servidor al mismo tiempo, estableciendo una comunicación simétrica entre sí.

# data[].attributes.body
Es importante conocer las diferentes formas de implementarlo. A pesar de que la arquitectura P2P busca la descentralización y que mencionamos que no es necesario un servidor central, existen variantes que lo requieren, por lo que la arquitectura P2P puede variar en función del objetivo que estamos buscando resolver. Para esto, podemos clasificar una arquitectura P2P basado en su grado de centralización:

# data[].attributes.body
En una arquitectura Cliente-Servidor entre más usuario conectados existan, más carga se acumula sobre el servidor, mientras que en una arquitectura P2P, entre más computadoras conectadas existan en la red, más poder de procesamiento se agrega, lo que lo vuelve una red con una increíble capacidad de escalamiento.

# data[].attributes.body
La arquitectura P2P es como si uniéramos el Cliente y el Servidor en una sola aplicación, lo que permite conectarse a otras computadoras de la red para consumir los recursos expuestos por los otros nodos de la red, funciona como un Servidor, lo que permita que otros nodos se conecten a nuestro software para leer los recursos que nosotros exponemos.

# data[].attributes.body
https://reactiveprogramming.io/figures/p2p.png

# data[].attributes.body
La arquitectura P2P es para muchos solo una variante de la arquitectura Cliente-Servidor, tiene una diferencia importante que hace que la podamos clasificar como un estilo arquitectónico independiente, y es que la arquitectura Cliente-Servidor tiene como punto medular la centralización, mientras la arquitectura P2P busca la descentralización.

# data[].attributes.body
Arquitectura Peer To Peer (P2P). (s. f.). https://reactiveprogramming.io/blog/es/estilos-arquitectonicos/p2p

# data[].attributes.body
El estilo arquitectónico Red entre iguales (Peer-to-peer, P2P) es una red de computadoras donde todos los dispositivos conectados a la red actúan como cliente y servidor al mismo tiempo.