# Protocolo Gossip

El Protocolo Gossip es un protocolo de comunicación de datos utilizado en sistemas distribuidos, funciona de manera parecida a la expansión del contagio de una enfermedad o de un rumor, de persona a persona, ya que básicamente trabaja esparciendo un mensaje de nodo en nodo, hasta que consigue distribuirse por toda la red.

## Origen

El origen de este protocolo está relacionado con los algoritmos de replicación epidémica descrito por Demers Alan, Greene Dan, Hauser Carl, Irish Wes, Larson John, Shenker Scott, Sturgis Howard, Swinehart Danm y Terry Doug en su estudio “Epidemic Algorithms for Replicated Database Maintenance” de 1987.

## Funcionamiento

Un protocolo gossip es simple a nivel teórico y de programar. Cada cierto tiempo elige aleatoriamente uno o varios nodos de un grupo y comparte la información con ellos. Los que la reciben hacen exactamente lo mismo. A cada una de esas rondas en las que se envía la información se la denomina ciclo.
Por tanto, la forma en que esta propuesta trabaja suele ser la siguiente:
* Un nodo elige de forma aleatoria otros nodos a los que enviar la información
* El proceso de intercambio de información tiene lugar
* Los nodos procesan la información recibida
* Los pasos son repetidos hasta que la información se haya distribuido por toda la red.
Los análisis de estos algoritmos se centran fundamentalmente en el diseño de las mejores estrategias a la hora de seleccionar nodos con los que compartir la información. Para ello, se han desarrollado modelos matemáticos para demostrar la eficiencia de las diferentes estrategias. Usualmente, en estos sistemas la información se consigue transmitir a todos los nodos en O(log(N)) ciclos, donde N es el número de nodos en la red.

## Ventajas y desventajas
### Ventajas

* Escalabilidad: Los protocolos de Gossip son altamente escalables. Esto gracias a que es posible distribuir la información con un nivel de rendimiento muy eficiente. En estos protocolos los nodos distribuyen una cantidad de mensajes fija a los nodos con los que están emparentados.
* Robustez: Todos los nodos operan de forma igual y no ejercen una función especial ni diferente uno de otro. Por lo que si se presenta algún fallo en uno o varios nodos, ésta no afectará ni interrumpirá la funcionalidad de los demás nodos en la red para la distribución de la información.
* Tolerancia a fallos: Como los nodos tienen la capacidad de compartir y distribuir la información con varios nodos de la red de pares, estos protocolos tienen la capacidad de operar de forma correcta. Inclusive en situaciones difíciles en las que se afecte la conectividad de algunos nodos. Si un determinado nodo se desconecta por alguna razón, la información será distribuida de igual forma por los demás nodos que ya han recibido el mensaje.
* Descentralización: La información se distribuye de forma completamente descentralizada y autónoma.

### Desventajas

* No muy eficientes: Puede ocurrir que un mismo mensaje sea enviado varias veces a un mismo nodo. Por ejemplo, el nodo N1 en un primer ciclo elige aleatoriamente N2 para enviar la información. En un ciclo posterior puede ocurrir que vuelva elegirlo como destinatario de la información. Esto lleva a un alto consumo de ancho de banda por información redundante.
* Dificultad para encontrar fallos: La aleatoriedad propia de estos protocolos puede dificultar el trabajo para reproducir ciertos errores y encontrar posibles fallos que surjan en tiempo de ejecución.
* No son escalables en ciertas situaciones: Por ejemplo el aumento de ratio de eventos puede consumir toda la capacidad de transporte de información de los diferentes canales de transmisión. Esto llevaría a un funcionamiento erróneo del protocolo. El punto de saturación dependerá de diferentes factores tales como el ratio en el que los eventos entran en el sistema, el tamaño de los mismos o el tamaño de los mensajes.