Frage

Ich habe ein zuverlässiges, völlig geordnete Multicast-System von Grunde auf in Python zu schreiben. Ich kann keine externen Bibliotheken. Ich darf eine zentrale Ablaufsteuerung verwenden.

Es scheint zwei unmittelbare Ansätze zu sein:

  1. schreiben ein effizientes System, eine eindeutige ID für jede Multicast-Nachricht anhängen, mit den Sequenzer Multicast-Sequenznummern für die Nachrichten-ID der sie empfängt, und hin und her ACKs und NACK des senden.
  2. ein ineffizientes Flutungssystem schreiben, wobei jede Multicaster einfach jede erneut sendet Nachricht, die er einmal erhält (es sei denn, es von diesem bestimmten Multicaster gesendet wurde.)

ich darf die zweite Option verwenden, und bin geneigt, dies zu tun.

Ich bin Sammels zur Zeit UDP-Nachrichten (die einzige Möglichkeit zu sein scheint), aber das bedeutet, dass einige Nachrichten möglicherweise verloren gehen. Das bedeutet, dass ich in der Lage sein, eindeutig zu jeder gesendeten UDP-Nachricht zu identifizieren, so dass sie erneut gesendet werden, können entsprechend # 2. Soll ich wirklich erzeugen eindeutige Nummern (z die Absenderadresse verwenden und einen Zähler) und sie in jede Packung und jede UDP-Nachricht gesendet? Wie würde ich mich über das zu tun? Und wie kann ich eine einzelne UDP-Nachricht in Python zu erhalten, und nicht einen Strom von Daten (das heißt socket.recv)?

War es hilfreich?

Lösung

Der Ansatz Überschwemmungen kann eine schlechte Situation verursacht schlimmer. Wenn Nachrichten aufgrund hoher Netzlast abgeworfen werden, wird jede Nachricht jeden Knoten resend, die nur die Situation noch schlimmer machen.

Der beste Ansatz ab, die Sie von der Art der Daten zu nehmen senden. Zum Beispiel:

  1. Daten Multimedia: keine Wiederholungen, ein verworfenes Paket ist ein Dropped Frame, das wird keine Rolle, wenn der nächste Frame es trotzdem bekommt
  2. .
  3. Fixed Periodendaten: Empfänger Knoten hält einen Timer, der jedes Mal zurückgesetzt wird ein Update empfangen wird. Wenn die Zeit abgelaufen ist, fordert er die fehlende Aktualisierung von dem Master-Knoten. Wiederholungen können an den anfordernden Knoten Unicast werden.

Wenn keine dieser Situationen zutrifft (jedes Paket muss von jedem Knoten empfangen werden, und das Paket Timing ist nicht vorhersehbar, so dass die Empfänger können keine Pakete auf ihrem eigenen verpasste Detect), dann Ihre Optionen sind:

  1. Explicit ACK von jedem Knoten für jedes Paket. Sender Wiederholungen (Unicast) Jedes Paket, das nicht ACKed wird.
  2. TCP-basierte Grid-Ansatz, bei dem jeder Knoten manuell Pakete an Nachbarknoten Wiederholungen empfangen ist, auf dem TCP-Mechanismen angewiesen Lieferung zu gewährleisten.

Sie könnten möglicherweise auf Empfänger angewiesen, um ein vermisstes Paket beim Empfang eines mit einem späteren Sequenznummer zu merken, aber dies erfordert den Absender das Paket um zu halten, bis mindestens ein zusätzliches Paket gesendet wurde. positive ACKs erfordert, ist zuverlässiger (und beweisbar).

Andere Tipps

Der Ansatz, den Sie nehmen wird zu sehr abhängig von der Art der Daten, die Sie senden, die Skala Ihres Netzwerks und die Menge der Daten, die Sie senden. Insbesondere geht es auf die Anzahl der Ziele jedes Ihrer Knoten abhängen verbunden ist.

Wenn Sie erwarten dies für jeden Knoten auf eine große Anzahl von Zielen zu skalieren und einer großen Menge von Daten dann finden Sie vielleicht auch, dass der Aufwand für das Hinzufügen eines ACK / NAK zu jedem Paket ausreichend ist, den Durchsatz nachteilig zu begrenzen , vor allem, wenn Sie erneute Übertragungen in die Mischung hinzufügen.

Wie Frank Szczerba gesagt hat Multimediadaten in den Genuss der in der Lage ist von verlorenen Paketen zu erholen. Wenn Sie irgendeine Kontrolle über die Daten, die Sie senden, sollten Sie versuchen, die Nutzlasten so zu gestalten, dass Sie die Anfälligkeit für verworfene Pakete zu minimieren.

Wenn die Daten, die Sie senden können nicht verworfene Pakete tolerieren und Sie versuchen, eine hohe Auslastung des Netzwerks zu skalieren dann vielleicht udp nicht das beste Protokoll zu verwenden ist. Die Implementierung einer Reihe von TCP-Proxies (wobei jeder Knoten überträgt, Unicast-, an alle anderen Knoten verbunden - ähnlich wie Ihre Überschwemmungen Idee). Wäre ein zuverlässiger Mechanismus sein

Mit all dies gesagt wurde, haben Sie für diese Anwendung wahr Multicast betrachtet mit?


Gerade gesehen, der „Hausaufgaben“ Tag ... diese Vorschläge nicht für Hausaufgaben Problem angemessen sein könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top