Pular para o conteúdo

Visão geral do design do protocolo de rede

Por volta de 4 min

Os Protocolos de Controle de Transmissão (TCP) e os Protocolos da Internet (IP) formam um conjunto de protocolos universalmente implantado na rede. O TCP/IP permite um canal de comunicação bidirecional confiável entre sistemas na internet.

A entrega ordenada dos protocolos de comunicação de nós do Cardano é garantida pelo protocolo TCP/IP.

Os sistemas operacionais limitam o número de conexões simultâneas. Por padrão, o Linux, por exemplo, pode abrir 1.024 conexões por processo, enquanto o macOS limita esse número para 256. Para evitar o uso excessivo de recursos e permitir meios confiáveis de estabelecimento de conexão, o Cardano usa um multiplexador.

Gerenciamento de conexão

A camada de rede lida com uma série de tarefas específicas além da troca de informações de bloco e transação exigidas pelo protocolo Ouroboros.

Geralmente, a implementação de gerenciamento de conexão inclui o desempenho das seguintes tarefas:

  • abrir um soquete e/ou adquirir recursos do sistema operacional
  • negociar a versão do protocolo com o mini-protocolo de handshake
  • iniciar a thread que executa o multiplexador (que pode ser instruído a iniciar/parar vários mini-protocolos)
  • descobrir e classificar exceções lançadas por mini-protocolos ou pelo próprio multiplexador
  • encerrar a conexão em caso de erro
  • lidar com uma solicitação de desligamento do par
  • desligar as threads que executam mini-protocolos
  • fechar um soquete

Multiplexação

A camada de multiplexação atua como um cruzamento central entre mini-protocolos e o canal de rede. Ela executa vários mini-protocolosopen in new window em paralelo em um único canal ‒ conexão TCP, por exemplo.

A Figura 1 reflete como os dados fluem entre dois nós, cada um executando três mini-protocolos usando um multiplexador (MUX) e um demultiplexador (DEMUX).

gerenciador-de-conexão

Figura 1. Fluxo de dados entre os nós através de multiplexação

Os dados transmitidos entre os nós passam pelo MUX/DEMUX dos nós. Existe um emparelhamento fixo de instâncias de mini-protocolo, o que significa que cada instância se comunica apenas com sua instância dual (um lado iniciador e um lado respondente).

A implementação do mini-protocolo também lida com a serialização e deserialização de suas mensagens. Mini-protocolos escrevem pedaços de bytes no MUX e leem pedaços de bytes do DEMUX. O MUX lê os dados dos mini-protocolos, divide-os em segmentos, adiciona um cabeçalho de segmento e transmite os segmentos ao DEMUX de seu par. O DEMUX usa os cabeçalhos dos segmentos para remontar fluxos de bytes para os mini-protocolos do seu lado. O próprio protocolo de multiplexação (consulte a nota abaixo) é completamente agnóstico em relação à estrutura dos dados multiplexados.

Nota: Este não é um uso genérico, mas especializado, de multiplexação. Os mini-protocolos individuais têm restrições estritas sobre mensagens não confirmadas que podem estar em trânsito. O design evita as condições em que o uso de multiplexação TCP geral sobre TCP cria desempenho caótico.

Segmentos de dados do protocolo de multiplexação

Os segmentos de dados de multiplexação incluem os seguintes detalhes:

  • Tempo de transmissão ‒ um carimbo de data/hora baseado nos 32 bits inferiores do relógio monótono do remetente, com uma resolução de um microssegundo.
  • ID do mini-protocolo ‒ o ID único do mini-protocolo.
  • Comprimento da carga útil ‒ o tamanho da carga útil do segmento em bytes. O comprimento máximo da carga útil suportado pelo formato de fio de multiplexação é 216 − 1. Observe que uma instância do protocolo pode escolher um limite menor para o tamanho dos segmentos que transmite.
  • Modo ‒ o bit único M (o modo) é usado para distinguir as instâncias duais de um mini-protocolo. O modo é definido como 0 em segmentos do iniciador (o lado que inicialmente tem agência), e é definido como 1 em segmentos do respondente.

Protocolos de comunicação de nós do Cardano

O Cardano usa protocolos de comunicação entre processos (IPC) para permitir a troca de blocos e transações entre nós, e permitir que aplicativos locais interajam com o blockchain via nó.

Visão geral do IPC de nó para nó

O protocolo Nó para Nó (NtN) transfere transações entre nós completos. NtN inclui três mini-protocolos (chain-sync, block-fetch e tx-submission), que são multiplexados sobre um único canal TCP usando um pacote de rede-mux.

O diagrama a seguir representa o fluxo operacional do NtN:

Nó para Nó

NtN segue uma estratégia baseada em solicitação, onde o nó iniciador consulta novas transações e o nó respondente responde com as transações, se houver. Este protocolo se adapta perfeitamente a um ambiente sem confiança onde ambos os lados precisam ser protegidos contra ataques de consumo de recursos do outro lado.

Explicação dos mini-protocolos NtN

Uma breve explicação dos mini-protocolos NtN:

  • chain-sync: um protocolo que permite que um nó reconstrua uma cadeia de um nó upstream
  • block-fetch: um protocolo que permite que um nó baixe corpos de blocos de vários pares
  • tx-submission: um protocolo que permite a submissão de transações. A implementação deste protocolo é baseada em um framework genérico de mini protocolo, com uma peculiaridade: os papéis do iniciador e do respondente são invertidos. O Servidor é o iniciador que solicita novas transações, e o Cliente é o respondente que responde com as transações. Essa inversão de papéis foi projetada assim por motivos técnicos.

Para garantir um serviço de rede ideal, a equipe também implementou um protocolo adicional:

  • keep-alive: um protocolo que garante uma conexão contínua entre nós e minimiza falhas de desempenho.

Visão geral do IPC de nó para cliente

Nó para Cliente (NtC) é uma conexão entre um nó completo e um cliente que consome dados, mas não participa do protocolo Ouroboros (uma carteira, por exemplo).

O objetivo do protocolo NtC IPC é permitir que aplicativos locais interajam com o blockchain via nó. Isso inclui aplicativos como backends de carteira ou exploradores de blockchain. O protocolo NtC permite que esses aplicativos acessem os dados brutos da cadeia e consultem o estado atual do ledger, e também fornece a capacidade de enviar novas transações para o sistema.

O protocolo NtC usa o mesmo design que o protocolo Nó para Nó (NtN), mas com um conjunto diferente de mini-protocolos, e usando pipes locais em vez de conexões TCP. Como tal, é uma interface relativamente de baixo nível e estreita que expõe apenas o que o nó pode fornecer nativamente. Por exemplo, o nó fornece acesso a todos os dados brutos da cadeia, mas não fornece uma maneira de consultar dados na cadeia. A tarefa de fornecer serviços de dados e APIs de nível superior mais convenientes é delegada a clientes dedicados, como cardano-db-sync e o backend da carteira.

Mini-protocolos NtC

O protocolo NtC consiste em três mini-protocolos:

  • chain-sync - usado para seguir a cadeia e obter blocos
  • local-tx-submission - usado para enviar transações
  • local-state-query - usado para consultar o estado do ledger

A versão NtC do chain-sync usa blocos completos, em vez de apenas cabeçalhos de blocos. É por isso que não é necessário um protocolo separado de block-fetch. O protocolo local-tx-submission é como o protocolo de envio de tx NtN, mas mais simples, e retorna os detalhes das falhas de validação de transações. O protocolo local-state-query fornece acesso a consultas ao estado atual do ledger, que contém muitos dados interessantes que não são refletidos diretamente na cadeia em si.

Como NtC funciona

No NtC, o nó executa o lado produtor do protocolo chain-sync apenas, e o cliente executa apenas o lado consumidor.

Esta tabela mostra quais mini-protocolos estão habilitados para a comunicação NtC:

Nó para Cliente

Última atualização:
Contribuidores: cauechianca