# Resumen

El sistema de comunicaciones de Decentraland, o simplemente *comms*, es el protocolo de mensajería en tiempo real que gestiona la interacción entre jugadores en un realm.

Algunas de estas interacciones son iniciadas por los jugadores, otras son manejadas automáticamente por los clientes en segundo plano. Algunos ejemplos:

* Chat de texto y voz
* Actualizaciones de posición a medida que los jugadores se mueven
* Actualizaciones del avatar cuando los jugadores cambian su apariencia

{% hint style="info" %}
Puedes ver el protocolo de comms en acción y experimentar con él usando el [Comms Station](https://decentraland.github.io/comms-station/).
{% endhint %}

Dado que la mayor parte de esta funcionalidad requiere difundir mensajes a todos los jugadores cercanos, se agrupan automáticamente en clústeres basados en la proximidad llamados *islands*. Cada jugador es asignado a una sola island a la vez, la cual cambia a medida que viajan por el mundo y se mueven en relación con otros.

El servicio del realm que gestiona y asigna jugadores a islands se llama *Archipelago*. Se encarga de crear islands según se necesiten, mantener su población en un número razonable y reasignar dinámicamente a los jugadores en respuesta a sus movimientos.

{% @mermaid/diagram content="flowchart LR
subgraph Realm
Players\["Players<br/>⭐⭐⭐⭐⭐⭐⭐⭐⭐"]
Archipelago\["Archipelago"]

```
    subgraph Islands
        Island1["Island 1<br/>⭐⭐⭐⭐"]
        Island2["Island 2<br/>⭐⭐⚪⚪"]
        IslandN["Island n<br/>⭐⭐⭐⚪"]
    end
    
    Players --> Archipelago
    Archipelago --> Island1
    Archipelago --> Island2
    Archipelago --> IslandN
end" %}
```

Cuando se asigna a una island, a los clientes se les proporciona un URI específico de la island para conectarse al backend real que retransmitirá mensajes entre ellos. Esta conexión dura hasta que Archipelago reasigna al cliente a una island diferente.

Esto significa que, además del [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) protocolo, los clientes deben implementar una serie de *transports*, cada uno envolviendo uno de los backends soportados en una interfaz unificada.

### Ciclo de vida del cliente <a href="#lifecycle" id="lifecycle"></a>

El ciclo de vida de un cliente de comms puede resumirse en unos pocos pasos:

1. **Seleccionar un realm**: obtener un URI para el [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) servicio.
2. **Unirse a Archipelago**: abrir una conexión persistente con el servicio.
3. **Obtener una (re)asignación de island**: reportar la posición actual y obtener un URI específico de la island.
4. **Conectar un transport**: abrir una segunda conexión con el backend específico de la island.
5. **Repetir**: continuar con los pasos 3 y 4, reportando periódicamente nuevas posiciones.

Cuando el cliente termina su sesión, simplemente se desconecta del servicio Archipelago. Será eliminado automáticamente de su island actual.

{% @mermaid/diagram content="sequenceDiagram
participant Archipelago
participant Client
participant IslandBackend as Island Backend

```
Note over Client: Connect to Archipelago
Client->>Archipelago: Authenticate
Archipelago->>Client: Accept

Note over Client: Report position
Client->>Archipelago: Report position
Archipelago->>Client: Assign island

Note over Client: Connect to island
Client->>IslandBackend: Connect transport
Client->>IslandBackend: Authenticate
IslandBackend->>Client: Accept

Note over Client,IslandBackend: Exchange messages
Client->>IslandBackend: Player messages…
IslandBackend->>Client: Player messages…

Note over Client: Update position
Client->>Archipelago: Update position
Archipelago->>Client: Reassign island

Note over Client: Disconnect from old island
Client->>IslandBackend: Disconnect transport

Note over Archipelago,IslandBackend: Repeat cycle" %}
```

### Conexiones

Las conexiones de comms son principalmente basadas en WebSocket, aunque algunos transports pueden usar otras estrategias.

Ve a la [Transports](https://github.com/decentraland/docs/blob/main/contributor/communications/transports/README.md) o [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) secciones para aprender más, o una página de transport específica para detalles sobre el mismo.

### Autenticación

Las conexiones a comms se autentican haciendo que los clientes firmen un desafío proporcionado por el servidor, usando el esquema descrito en el [auth chain](https://github.com/decentraland/docs/blob/main/contributor/auth/authchain/README.md) sección.

Dirígete a la [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) página o consulta un transport específico para aprender más sobre los flujos de autenticación.

### Islas

Las islands son grupos de jugadores altamente dinámicos que pueden transmitir mensajes entre sí, creadas y mantenidas por [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) en respuesta a sus movimientos en el mundo.

No existe un área predefinida ni un punto central para una island. No son características geográficas estables, solo asociaciones temporales de jugadores cercanos. Si se puede decir que una island cubre una región, es solo porque sus miembros están actualmente dispersos en esa zona.

Puede no haber islands en una región sin jugadores, y varias islands superpuestas en áreas densamente pobladas, donde asignar a todos al mismo grupo haría imposible la difusión en tiempo real.

Cada servidor en la red de Decentraland puede configurar la población máxima de una island y la distancia a la que los jugadores se consideran cercanos. Por defecto, las islands pueden albergar hasta 100 jugadores dentro de 100 metros entre sí.

El flujo para ser asignado a una island y unirse a ella se detalla en el [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) sección.

### Mensajes

Los mensajes en el protocolo de comms son blobs binarios serializados usando [protocol buffers](https://github.com/protocolbuffers/protobuf), envueltos en una [El](https://github.com/decentraland/docs/blob/main/contributor/communications/messages/README.md#Packet) estructura.

{% hint style="info" %}
Cuando usamos la palabra *message* en el contexto de comms, siempre nos estaremos refiriendo al protocolo de mensajes binario, no a los mensajes de chat intercambiados entre jugadores.
{% endhint %}

Hay varios tipos de mensajes diferentes, para una variedad de flujos de interacción en tiempo real. Dirígete a la [messages](https://github.com/decentraland/docs/blob/main/contributor/communications/messages/README.md) sección para aprender más.
