Já aprendemos no artigo introdutório que o Urbit possui uma arquitetura onde galáxias e estrelas são responsáveis pela descoberta por pares. Neste artigo vamos entender melhor como a rede Urbit se comunica.
O que é Ames?
Ames é o nome de rede da Urbit. É responsável por enviar e receber mensagens pela rede, que são direcionadas de e para as naves. As naves incluem galáxias, estrelas, planetas e luas, cada uma com funções e responsabilidades diferentes.
Ames lida com todas as tarefas de comunicação de rede, como criptografia, descriptografia, roteamento e controle de congestionamento. Ele também determina como direcionar os pacotes de entrada para a nave ou aplicativo correto.
A rede Ames se comunica através do Arvo, o sistema operacional Urbit, usando um mecanismo de passagem ou movimentação (instruções) de e para naves. A transferência real de bytes em um pacote Ames através de uma rede é tratada pelo tempo de execução do sistema operacional Urbit.
O tempo de execução de um sistema operacional (SO) é essencialmente o mecanismo que executa e gerencia aplicativos. É responsável pela alocação de recursos, agendamento de tarefas, entrada/saída e outras tarefas de gerenciamento do sistema. No Urbit, o Arvo é o sistema operacional e possui um runtime que se comunica com o mundo externo (sistemas operacionais ou internet). No contexto deste texto, o tempo de execução é responsável pelo transporte real dos pacotes pela rede.
Ames também tem a capacidade de enviar pacotes para endereços específicos. Isso pode ser feito enviando pacotes para um identificador (átomo opaco) ou para o endereço Urbit de uma galáxia. Vamos explicar o que esses termos significam.
Urbit usa um esquema de endereçamento hierárquico, onde as galáxias são identidades de primeira linha (como a raiz de uma árvore). Cada galáxia pode ter 256 estrelas, cada estrela pode ter 65.536 planetas e os planetas podem ter luas. Quando Ames envia pacotes para um endereço de galáxia, é como enviar uma correspondência para uma caixa postal: os pacotes são enviados para esse endereço e, em seguida, a galáxia os encaminha para a estrela, planeta ou lua corretos. O destino final do pacote é codificado dentro do próprio pacote, e cada nível (galáxia, estrela, etc.) ajuda a rotear o pacote para o destino correto.
Um átomo é um inteiro sem sinal, o que significa que pode representar qualquer número inteiro não negativo. O sistema não sabe inerentemente o que esses números representam (por exemplo, se um determinado átomo representa um ID de usuário, um carimbo de data/hora ou algo totalmente diferente). “Opaco” aqui sugere que o átomo não transmite informações significativas por conta própria; é simplesmente um identificador exclusivo. Ames, o protocolo da rede, usa esse identificador para enviar pacotes para endereços específicos.
Lembre-se de que o Ames não envia o pacote diretamente ao destino. Em vez disso, ele entrega o pacote para o tempo de execução Urbit, e o tempo de execução usa as informações fornecidas por Ames (como o endereço da galáxia ou o átomo opaco) para rotear o pacote para a nave certa (galáxia, estrela, planeta ou lua) na rede.
Em essência, Ames empacota os dados e os rotula com o endereço correto (o átomo opaco ou o endereço da galáxia). O tempo de execução do Urbit lida com a entrega real do pacote para o endereço especificado na Internet. Isso é análogo a empacotar uma caixa (os dados), escrever o endereço correto nela (o átomo opaco ou o endereço da galáxia) e, em seguida, entregá-la a um serviço de entrega (o tempo de execução do Urbit) que garante que chegue ao local correto.
O processo de comunicação da mensagem
Quando se trata de comunicação de mensagens, o seguinte processo é usado:
Uma nave local (a fonte) passa uma solicitação de mensagem, chamada %plea, para Ames. O Ames então transmite esta mensagem pela rede para o Ames da nave de destino, que passa a mensagem ao seu destino.
Uma vez que a nave de destino processa o %plea, ele envia de volta um pacote de confirmação, um “ack“. Isso pode ser positivo (se a solicitação foi processada com sucesso) ou negativo (se a solicitação falhou), caso em que é chamado de “nack“.
Se a nave de origem receber um ACK positivo ou uma combinação de um ACK e explicação, ele completa o processo de solicitação de mensagem.
Uma nave local também pode enviar mensagens de resposta, chamadas %boon, em resposta a um %plea. Ames transmite um %boon pela rede para o Ames da nave de destino, que o entrega ao destino.
Caso uma mensagem %boon seja perdida durante a transferência, Ames envia uma mensagem %lost para a nave local, indicando que o %boon foi perdido.
Segurança
Quando se trata de garantir a segurança, a Ames criptografa todas as mensagens usando uma técnica conhecida como criptografia de chave simétrica. No caso de uma quebra de continuidade (uma interrupção na integridade do sistema), o Ames remove todos os estados de mensagens relacionados ao par afetado.
Cada endereço Ames é um átomo de 128 bits (identificador exclusivo) que representa a identidade de um usuário, vinculado a uma chave pública para comunicação segura. Ames é capaz de entregar mensagens de tamanho arbitrário, divididas em pacotes menores adequados para transmissão (fragmentos de tamanho MTU). Toda a comunicação no Ames é criptografada de ponta a ponta, garantindo uma comunicação ponto a ponto segura.
Pacotes de dados
Os dados reais transmitidos pela rede Ames são tratados em pacotes. Cada pacote tem um formato específico, incluindo um cabeçalho e um corpo, com vários campos de dados. Ames divide as mensagens em pacotes menores se excederem um determinado tamanho. Para garantir que os pacotes sejam recebidos em ordem e nenhum seja perdido, a Ames emprega técnicas semelhantes ao Transmission Control Protocol (TCP), retransmitindo os pacotes, se necessário.
Finalmente, Ames usa um sistema de confirmações (acks) e confirmações negativas (nacks) para confirmar o recebimento bem-sucedido ou falha de pacotes ou mensagens. Os reconhecimentos desempenham um papel crucial para garantir uma comunicação suave entre os diferentes navios na rede.
Agora vamos entrar em mais detalhes.
Packet Relaying e Peer Discovery: trata-se de como as naves (usuários no Urbit) se encontram (peer discovery) e enviam mensagens (packet relaying). Inicialmente, quando duas naves desejam se comunicar, elas podem conhecer apenas o @p (Urbit ID) uma da outra, mas precisam do endereço IP e da porta da outra nave para uma conexão direta. Um intermediário (geralmente uma galáxia) que conhece o IP e a porta da nave receptora facilita a comunicação inicial. Com o tempo, o papel da galáxia na descoberta de pares será delegado às estrelas por seus planetas patrocinados. A retransmissão de pacotes é necessária quando duas naves não podem se comunicar diretamente, geralmente devido a NAT ou firewalls. No caso das luas, a nave-mãe é responsável pela retransmissão de pacotes e descoberta de pares.
No contexto da rede Ames, a retransmissão de pacotes refere-se ao processo em que um terceiro (geralmente uma galáxia) encaminha mensagens entre duas naves (usuários). Isso é particularmente necessário quando a comunicação direta entre as duas naves não é possível devido a obstáculos como NAT ou firewalls. A nave de retransmissão, ciente dos endereços IP e números de porta de ambos as naves de comunicação, atua como um intermediário, pegando o pacote do remetente, ajustando alguns detalhes (como marcar o pacote como retransmitido, atualizando a soma de verificação, etc.) e, em seguida, enviando-o junto ao receptor. Isso garante que as mensagens possam ser transmitidas mesmo em situações em que a comunicação direta ponto a ponto não pode ser estabelecida.
The Serf and the King: Estes são os dois principais componentes da funcionalidade do Urbit. O Serf (servo) é o tempo de execução do Nock (Nock é a linguagem funcional de baixo nível na qual o Urbit é construído). Ele gerencia o estado atual do Arvo (o Urbit OS) e atualiza o estado processando instruções. O King (rei) lida com instantâneos do estado Arvo e gerencia entradas e saídas com Unix. O Serf só se comunica com o King, enquanto o King se comunica tanto com o Serf quanto com o Unix.
Unix é um sistema operacional. Tem sido amplamente utilizado em vários domínios, incluindo servidores, estações de trabalho, mainframes e sistemas embarcados. Também tem sido a base para muitos outros sistemas operacionais, como Linux e macOS. Quando dizemos “O rei se comunica com o Unix” isso significa “O rei se comunica com o sistema operacional da máquina onde o Urbit está instalado”.
Submódulo Ames I/O: Este é um componente do King que é responsável por gerenciar a comunicação dos pacotes Ames. Ele agrupa pacotes Ames de saída em pacotes UDP, desempacota pacotes UDP recebidos em pacotes Ames e mantém uma fila de pacotes recebidos.
Na computação, E/S significa entrada/saída, que se refere a qualquer operação, programa ou dispositivo que transfere dados de ou para um computador. Dentro da arquitetura do Urbit, o submódulo I/O do King é responsável por lidar com todas as operações de rede relacionadas ao Ames. Ele prepara os pacotes Ames de saída para serem enviados pela rede e processa os pacotes de rede recebidos em pacotes Ames que podem ser entendidos pelo sistema Urbit.
UDP significa User Datagram Protocol, que é um dos principais protocolos de comunicação usados na Internet. Ao contrário do TCP (Transmission Control Protocol), outro protocolo comum, o UDP é sem conexão, o que significa que não requer uma conexão persistente entre dois pontos para transferência de dados. Isso torna o UDP adequado para situações em que a velocidade é preferível à confiabilidade, pois não precisa executar as verificações e balanços que o TCP faz para garantir que todos os pacotes cheguem e estejam em ordem. Ames usa UDP como protocolo subjacente para sua comunicação de rede. O submódulo de E/S envolve pacotes Ames de saída como pacotes UDP para transmissão e desembrulha pacotes UDP recebidos em pacotes Ames para processamento.
Rede Permanente
No protocolo Ames, assume-se que nenhum nó perde estado involuntariamente, o que é chamado de “rede permanente”. Isso difere dos protocolos clássicos da Internet, como TCP/IP, que perdem o estado quando reinicializados porque o estado da sessão está na RAM volátil. Em Ames, os nós mantêm um número de sequência compartilhado permanente, permitindo a entrega de mensagens exatamente uma vez. Geralmente, isso não é possível com protocolos de Internet clássicos, que oferecem garantias de entrega de mensagens no máximo uma vez ou pelo menos uma vez.
Ou seja: na internet tradicional, quando dois computadores estão enviando dados um para o outro, uma falha no processo exige que o envio seja reiniciado. No Urbit, como tudo acontece permanentemente, o que já foi transmitido é sempre mantido e uma perda de conexão com posterior restabelecimento resulta em uma continuação do processo de onde parou.
Danos cerebrais fatais: A desvantagem da rede permanente é que, se um nó for danificado e perder seus números de sessão persistentes, ele efetivamente perderá sua capacidade de se comunicar e não poderá ser facilmente recuperado ou recriado.
Latência de persistência: outro custo da rede permanente é a adição de latência de persistência ao tempo de ida e volta da rede. É o tempo que leva para que os dados sejam armazenados permanentemente, somando-se ao tempo total que uma mensagem leva para ser enviada e confirmada.
Aplicativos permanentes: no Urbit, há várias conversas persistentes acontecendo, pois o sistema operacional não é uma base de código monolítica. Tanto os módulos do kernel quanto os aplicativos de nível de usuário devem seguir as mesmas regras de permanência. Não há uma maneira correta de remover e reinstalar um aplicativo. Você só pode atualizar o aplicativo.
Reconhecimento de ponta a ponta: o Ames usa reconhecimentos de ponta a ponta para simplificar o tratamento de erros e o reconhecimento em diferentes camadas. Existem duas camadas de reconhecimento: mensagens e fragmentos. Uma confirmação implica recebimento, decodificação e processamento bem-sucedidos de uma mensagem.
Para resumir, o protocolo Ames da Urbit oferece alguns recursos exclusivos em comparação com os protocolos tradicionais da Internet, girando principalmente em torno do conceito de ‘rede permanente’. Isso permite uma comunicação mais confiável entre nós, tratamento de erros simplificado e atualizações de aplicativos perfeitas. No entanto, esses recursos vêm com compensações de maior complexidade em termos de latência de persistência e danos irrevogáveis a um nó em determinados cenários.