# P2PSP

P2PSP (Peer to Peer Straightforward Protocol) es un protocolo de comunicación de la capa de aplicación para el streaming de contenido multimedia sobre Internet, es decir, donde los usuarios reproducen el stream de forma sincronizada. Esto puede ser usado para construir una variedad de servicios de transmisión en vivo que va desde pequeñas reuniones hasta grandes sistemas de IPTV. A diferencia del tradicional CS (Cliente-Servidor) y CDN (Content Delivery Network) basados en streaming de vídeo, P2P contribuye con su ancho de banda de subida al sistema. Por esta razón, en general, los sistemas P2P son mucho más escalables que las arquitecturas basadas en el modelo cliente-servidor.
Se centra en dos aspectos centrales:
* A pequeña escala, todos los peers se comunican entre sí, todos con todos, utilizando mensajes punto a punto (unicast).
* Los peers deben ser tan solidarios con el resto de peers como éstos lo son con él, o de lo contrario, no podrán formar parte de la red P2P. Dicha solidaridad se expresa en términos de ancho de banda, y por tanto, esto significa que, para que un peer forme parte de la red, debe de enviar a esta, en promedio durante cada cierto intervalo de tiempo, tanto como recibe de ella.
El P2PSP ha sido especialmente definido para realizar streaming de secuencias en directo. De esta manera, se puede transmitir a través de una red de comunicaciones basada en la conmutación de paquetes un evento que se está produciendo en ese momento, de la misma manera que se puede eventos ya creados o grabados.

## Características principales

* Independencia del contenido.
* Arquitectura modular. El número de módulos depende de los requisitos finales.
* El módulo más básico es muy simple, lo que permite que pueda ser ejecutado en sistemas poco potentes.
* Si multicast está disponible, el P2PSP puede usarlo.
* Los peer pueden estar en redes privadas, incluso detrás de NAT simétricos.
* El protocolo es totalmente compatible con multiresolución y las técnicas de stream adaptativo.
* Es compatible con el modelo cliente-servidor, convirtiéndose en un modelo híbrido.

## Entidades

Existen los siguientes tipos de entidades:
* Source (O): Se encarga de producir el stream que es transmitido sobre la red P2PSP. Normalmente es un servidor de streaming usando el protocolo HTTP, por ejemplo, Icecast. El Source controla el bit rate de la transmisión en la red.
* Player(L): Se encargan de solicitar y consumir (decodificar y reproducir) el stream. Normalmente, varios players pueden recibir el stream desde el source, en paralelo, si hay suficiente ancho de banda disponible.
* Splitter (S): Esta entidad recibe el stream desde el Source, lo divide en trozos del mismo tamaño y los envía a los peers.
* Peer (P): Recibe los trozos desde el Splitter y desde otros peers, los vuelve a juntar para crear el stream original y lo envía al player. Algunos trozos son también enviados a otros peers.

## Diseño modular

El protocolo está dividido en varios módulos, cada uno de ellos está definido por un conjunto de reglas que proveen funcionalidades distintas. Sólo es obligatorio un módulo (DBS) para crear un clúster P2PSP. El resto son opcionales, y en general, no hay dependencia entre ellos, por tanto, cualquier combinación de módulos es posible.

### IP Multicast Set (IMS) of rules

Este módulo implementa el comportamiento más básico del protocolo que puede ser usado cuando está disponible IP multicast. Puede ser útil en redes LAN donde este modo de transmisión funciona.

### Data Broadcasting Set (DBS) of rules

Este módulo ha sido diseñado para ser eficiente en la transmisión de un stream de datos desde un nodo fuente al resto de peers de la red.

### Full-cone Nat Set (FNS) of rules

El módulo DBS no permite la comunicación entre los peer que están tras un NAT de tipo full-cone porque los peers inicialmente crean una entrada en sus NATs sólo para el TCP (recordemos que la lista de los peers se transmite utilizando este protocolo) y el stream se transmite mediante el protocolo UDP. Para crear una entrada en el NAT asociada con el protocolo UDP, usando el mismo punto final que utiliza la conexión TCP, el peer envía al Splitter el mensaje [Hello] utilizando UDP justo después de cerrar la conexión TCP con el splitter.

### Lost chunks Recovery Set (LRS) of rules

Existe la posibilidad de que un chunk enviado desde el splitter se pierda en la ruta hacia el peer destino. También puede ocurrir que un peer abandone el team sin avisar al resto de peers. En ambos casos, uno o más chunks no serán recibidos por el resto de peers, lo que significaría una pérdida en la calidad del servicio. Para minimizar el problema, el LRS cuenta con una técnica de recuperación que consiste en reenvíar desde el splitter el bloque que se perdió a todos los peer.

### Adaptative Chunk-rate Set (ACS) of rules

El módulo DBS obliga a todos los peers a utilizar el mismo ancho de banda de subida. Este módulo relaja esta regla permitiendo que peers con un mayor ancho de banda puedan ayudar en sus tareas a otros peers con un ancho de banda reducido.

### End-point Masquerading Set (EMS) of rules

Este módulo se encarga de manejar las situaciones en las que dos o más peers están detrás de un NAT que realiza enmascaramiento IP.

### NAT Traversal Set (NTS) of rules

El filtrado NAT es cada vez más frecuente. Este módulo define una funcionalidad extra para manejar peers que están detrás de NAT de tipo restricted-cone o simétricos.

### Multi-Channel Set (MCS) of rules

En escenarios donde hay suficiente ancho de banda disponible, los peers pueden decidir subscribirse a más de un stream (canal) al mismo tiempo. Un peer que implementa este módulo puede comunicarse con varios teams al mismo tiempo.

### Data Integrity Set (DIS) of rules

En algunos casos, la red necesita protegerse de peers maliciosos que podrían envenenar el stream, hacer un ataque de denegación de servicio, etc. Estos peers serán identificados y expulsados del team gracias a este módulo.

### Data Privacy Set (DPS) of rules

Contiene una colección de reglas que aseguran que el stream transmitido es reproducido solo por peers legítimos. Puede ser útil para implementar, por ejemplo, servicios de pago por visión.

### Peer-list Compression Set (PCS) of rules

La lista de peers puede ser comprimida para minimizar el tiempo de transmisión.