Pergunta

Eu tenho que escrever um sistema de multicast confiável, totalmente ordenada a partir do zero em Python. Eu não pode usar quaisquer bibliotecas externas. Eu estou autorizado a usar um sequenciador central.

Parece haver duas abordagens imediatas:

  1. escrever um sistema eficiente, anexar um ID único para cada mensagem Multicasted, tendo os números de seqüência sequenciador multicast para o ID de mensagem de que recebe, e envio de e para trás ACK e de NACK.
  2. escrever um sistema de inundações ineficiente, onde cada multicaster simplesmente re-envia cada mensagem que recebe uma vez (a menos que ele foi enviado por que multicaster particular.)

Eu estou autorizado a usar a segunda opção, e estou inclinado a fazê-lo.

Atualmente estou multicast mensagens UDP (que parece ser a única opção), mas isso significa que algumas mensagens podem se perder. Isso significa que tenho de ser capaz de identificar cada mensagem enviada UDP, para que ele possa ser de acordo com # 2 enviou-re. Devo realmente gerar números exclusivos (por exemplo, usando o endereço do remetente e um contador) e embalá-los em cada mensagem enviada UDP? Como eu iria fazer isso? E como faço para receber uma única mensagem UDP em Python, e não um fluxo de dados (ou seja socket.recv)?

Foi útil?

Solução

A abordagem inundações podem causar uma situação ruim ficar pior. Se as mensagens são descartados devido à alta carga de rede, tendo cada nó reenviar todas as mensagens só vai piorar a situação.

A melhor abordagem a adoptar depende da natureza dos dados que você está enviando. Por exemplo:

  1. Dados Multimídia: há novas tentativas, um caiu pacote é um quadro caiu, que não importará quando o próximo quadro chega lá de qualquer maneira
  2. .
  3. Dados período fixo: nó Destinatário mantém um temporizador que é redefinir cada vez que uma atualização é recebida. Se o tempo expirar, ele solicita a atualização faltando no nó mestre. Tentativas pode ser unicast para o nó requerente.

Se nenhuma destas situações se aplica (cada pacote tem de ser recebido por cada nó, eo momento de pacote é imprevisível, para que os destinatários não podem detectar pacotes por conta própria não atendidas), em seguida, suas opções incluem:

  1. ACK explícita de cada nó para cada pacote. tentativas de remetente (unicast) qualquer pacote que não está ACKed.
  2. abordagem grade baseada em TCP
  3. , onde cada nó é manualmente repete recebeu pacotes para nós vizinhos, contando com TCP mecanismos para garantir a entrega.

Você poderia contar com destinatários percebendo um pacote perdido após a recepção de um com um número de seqüência mais tarde, mas isso requer o remetente para manter o pacote ao redor até que pelo menos um pacote adicional foi enviada. Exigindo ACKs positivos é mais confiável (e provável).

Outras dicas

A abordagem que você tomar vai depender muito sobre a natureza dos dados que você está enviando, a escala da sua rede e da quantidade de dados que você está enviando. Em particular, vai depender do número de alvos cada um dos seus nós está ligado.

Se você está esperando isso para escala para um grande número de alvos para cada nó e uma grande quantidade de dados, então você pode muito bem descobrir que a sobrecarga de adicionar um ACK / NAK para cada pacote é suficiente para limitar negativamente o seu rendimento , especialmente quando você adicionar retransmissões na mistura.

Como Frank Szczerba disse dados multimídia tem a vantagem de ser capaz de se recuperar de pacotes perdidos. Se você tem algum controle sobre os dados que você está enviando você deve tentar projetar as cargas de modo que você minimizar a susceptibilidade a pacotes perdidos.

Se os dados que você está enviando não pode tolerar pacotes descartados e você está tentando escala para alta utilização da sua rede, então talvez udp não é o melhor protocolo para uso. Implementando uma série de proxies TCP (onde cada nó retransmissões, unicast, para todos os outros nós conectados - semelhantes a sua ideia de inundação). Seria um mecanismo mais confiável

Com tudo isso dito, você já pensou em usar verdadeira multicast para esta aplicação?


Apenas viu a tag "dever de casa" ... estas sugestões podem não ser apropriado para um problema lição de casa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top