Pythonで信頼性の高い、完全に順序付けられたマルチキャストシステムを作成する
-
05-07-2019 - |
質問
信頼できる、完全に順序付けられたマルチキャストシステムをPythonでゼロから作成する必要があります。外部ライブラリを使用できません。中央シーケンサーを使用できます。
2つの直接的なアプローチがあるようです:
- 効率的なシステムを作成して、各マルチキャストメッセージに一意のIDを付加し、 受信したメッセージIDのシーケンサマルチキャストシーケンス番号を持つ ACKとNACKを送受信します。
- 非効率的なフラッディングシステムを作成します。この場合、各マルチキャスターはそれぞれを単に再送信します 1回受信するメッセージ(その特定のマルチキャスターによって送信された場合を除く)
2番目のオプションを使用できますが、使用する傾向があります。
現在、UDPメッセージをマルチキャストしています(これが唯一のオプションのようです)が、これは一部のメッセージが失われる可能性があることを意味します。つまり、送信された各UDPメッセージを一意に識別できる必要があるため、#2に従って再送信できます。本当に一意の番号を生成する必要がありますか(送信者アドレスとカウンターを使用するなど)、送信されるすべてのUDPメッセージにそれらをパックする必要がありますか?それをどうやってやるの?また、データのストリームではなく、Pythonで単一のUDPメッセージ(つまり、 socket.recv
)を受信するにはどうすればよいですか?
解決
フラッディングアプローチは、悪い状況を悪化させる可能性があります。ネットワーク負荷が高いためにメッセージがドロップされた場合、すべてのノードがすべてのメッセージを再送信すると、状況が悪化するだけです。
最適なアプローチは、送信するデータの性質によって異なります。例:
- マルチメディアデータ:再試行なし。ドロップされたパケットはドロップされたフレームであり、次のフレームがいつ到着しても関係ありません。
- 固定期間データ:受信者ノードは、更新を受信するたびにリセットされるタイマーを保持します。時間が経過すると、マスターノードに不足している更新を要求します。再試行は要求元のノードにユニキャストできます。
これらの状況のどちらにも当てはまらない場合(すべてのパケットをすべてのノードで受信する必要があり、パケットのタイミングが予測できないため、受信者は自分で欠落パケットを検出できません)、オプションには次が含まれます:
- 各パケットのすべてのノードからの明示的なACK。送信者は、ACKされていないパケットを再試行(ユニキャスト)します。
- TCPベースのグリッドアプローチ。各ノードは、受信したパケットを隣接ノードに手動で繰り返し、TCPメカニズムに基づいて配信を保証します。
後のシーケンス番号を持つパケットを受信すると、欠落パケットに気づく受信者に頼ることができますが、これには、少なくとも1つの追加パケットが送信されるまで送信者がパケットを保持する必要があります。肯定的なACKを要求する方が信頼性が高い(そして証明できる)。
他のヒント
行うアプローチは、送信するデータの性質、ネットワークの規模、送信するデータの量に大きく依存します。特に、各ノードが接続されているターゲットの数に依存します。
これが各ノードの多数のターゲットと大量のデータに対応すると予想している場合、ACK / NAKをすべてのパケットに追加するオーバーヘッドでスループットが低下することが十分にわかるでしょう。 、特に再送信をミックスに追加する場合。
Frank Szczerbaが述べたように、マルチメディアデータには失われたパケットから回復できるという利点があります。送信するデータを制御できる場合は、ペイロードを設計して、ドロップされたパケットの影響を受けにくくする必要があります。
送信するデータがドロップされたパケットに耐えられない場合 、ネットワークの高い使用率に拡張しようとしている場合、おそらくudpは使用するのに最適なプロトコルではありません。一連のtcpプロキシ(各ノードが他のすべての接続ノードにユニキャストで再送信する場合-フラッディングアイデアと同様)を実装すると、より信頼性の高いメカニズムになります。
以上のことから、このアプリケーションで真のマルチキャストを使用することを検討しましたか?
「宿題」を見ただけタグ...これらの提案は宿題の問題には適さない可能性があります。