# Visão Geral

O sistema de comunicações da Decentraland, ou simplesmente *comms*, é o protocolo de mensagens em tempo real que gerencia a interação entre jogadores em um realm.

Algumas dessas interações são iniciadas pelos jogadores, outras são gerenciadas automaticamente pelos clients nos bastidores. Alguns exemplos:

* Chat de texto e voz
* Atualizações de posição conforme os jogadores se movem
* Atualizações de avatar quando os jogadores mudam sua aparência

{% hint style="info" %}
Você pode ver o protocolo de comms em ação e experimentá-lo usando o código aberto [Comms Station](https://decentraland.github.io/comms-station/).
{% endhint %}

Como a maior parte dessa funcionalidade requer o broadcast de mensagens para todos os jogadores próximos, elas são automaticamente agrupadas em clusters baseados na proximidade chamados *islands*. Cada jogador é atribuído a uma única island por vez, que muda à medida que ele viaja pelo world e se move em relação aos outros.

O serviço de realm que gerencia e atribui jogadores às islands é chamado *Archipelago*. Ele se encarrega de criar islands conforme necessário, manter sua população em um número razoável e reatribuir dinamicamente os jogadores em resposta aos seus movimentos.

{% @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" %}
```

Quando atribuído a uma island, os clients recebem um URI específico da island para se conectar ao backend real que irá retransmitir mensagens entre eles. Essa conexão dura até que o Archipelago reatribua o client para uma island diferente.

Isso significa que, além do [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) protocol *transports*, cada um empacotando um dos backends suportados em uma interface unificada.

### Ciclo de vida do client <a href="#lifecycle" id="lifecycle"></a>

O ciclo de vida de um comms client pode ser resumido em alguns passos:

1. **Selecionar um realm**: obter um URI para o [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) service.
2. **Ingressar no Archipelago**: abrir uma conexão persistente com o service.
3. **Obter uma (re)atribuição de island**: reportar a posição atual e obter um URI específico da island.
4. **Conectar um transport**: abrir uma segunda conexão com o backend específico da island.
5. **Repetir**: continuar passando pelos passos 3 e 4, reportando periodicamente novas posições.

Quando o client encerra sua sessão, ele simplesmente se desconecta do serviço Archipelago. Ele será removido automaticamente de sua island atual.

{% @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" %}
```

### Conexões

As conexões de comms são principalmente baseadas em websockets, embora alguns transports possam usar outras estratégias.

Vá para a [Transports](https://github.com/decentraland/docs/blob/main/contributor/communications/transports/README.md) ou [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) seções para saber mais, ou uma página de transport específica para detalhes sobre ele.

### Autenticação

As conexões com comms são autenticadas fazendo com que os clients assinem um desafio fornecido pelo server, usando o esquema descrito em [auth\_chain](https://github.com/decentraland/docs/blob/main/contributor/auth/authchain/README.md) seção.

Vá para a [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) página ou veja um transport específico para saber mais sobre os fluxos de autenticação.

### Ilhas

Islands são grupos altamente dinâmicos de jogadores que podem transmitir mensagens entre si, criados e mantidos pelo [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) em resposta aos seus movimentos no world.

Não há uma área predefinida ou ponto central para uma island. Elas não são características geográficas estáveis, apenas associações temporárias de jogadores próximos. Se for possível dizer que uma island cobre uma região, é apenas porque seus membros estão atualmente espalhados nessa zona.

Pode haver zero islands em uma região sem jogadores, e várias islands sobrepostas em áreas densamente povoadas, onde atribuir todos ao mesmo grupo tornaria o broadcast em tempo real impossível.

Cada server na rede Decentraland pode configurar a população máxima da island e a distância na qual os jogadores são considerados próximos. Por padrão, islands podem hospedar até 100 players dentro de 100 metros uns dos outros.

O fluxo para ser atribuído a uma island e ingressar nela está detalhado em [Archipelago](https://github.com/decentraland/docs/blob/main/contributor/communications/archipelago/README.md) seção.

### Mensagens

As mensagens no protocol de comms são blobs binários serializados usando [protocol buffers](https://github.com/protocolbuffers/protobuf) , envolvidos em uma [Pacote](https://github.com/decentraland/docs/blob/main/contributor/communications/messages/README.md#Packet) estrutura.

{% hint style="info" %}
Ao usar a palavra *message* no contexto de comms, estaremos sempre nos referindo ao protocolo de mensagens binárias, não às mensagens de chat trocadas entre jogadores.
{% endhint %}

Existem vários tipos diferentes de mensagem, para uma variedade de fluxos de interação em tempo real. Vá para a [mensagens](https://github.com/decentraland/docs/blob/main/contributor/communications/messages/README.md) seção para saber mais.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/contributor/contributor-pt/communications/overview.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
