用Python编写一个可靠的、全序的多播系统

5
我需要用Python从头开始编写一个可靠的、完全排序的组播系统。我不能使用任何外部库,但是可以使用一个中央序列号生成器。有两种方法来实现这个系统:
1.编写高效的系统,将唯一编号附加到每个多播消息上,使序列号生成器组播接收到的消息编号,并发送ACK和NACK。
2.编写低效的洪泛系统,其中每个多播程序员仅简单地重新发送其接收到的每个消息一次(除非该特定的多播程序员发送了该消息)。
我可以使用第二个选项,也倾向于这么做。我目前正在进行UDP多播消息(似乎是唯一的选择),但这意味着一些消息可能会丢失。这意味着我必须能够唯一标识每个发送的UDP消息,以便根据第2种方法进行重发。我应该真的生成唯一的数字(例如使用发送方地址和计数器)并将它们打包到每个UDP消息中吗?我该如何操作?在Python中如何接收单个UDP消息而不是数据流(即socket.recv)?
3个回答

4

泛洪方法可能会使糟糕的情况变得更糟。如果由于高网络负载而丢失了消息,则每个节点重新发送每个消息只会使情况变得更糟。

采取的最佳方法取决于您发送的数据的性质。例如:

  1. 多媒体数据:不进行重试,丢失的数据包是一个丢失的帧,当下一帧到达时就不重要了。
  2. 固定周期数据:接收方节点保持计时器,每次接收更新时都会重置计时器。如果超时,则从主节点请求缺少的更新。重试可以单播到请求节点。

如果这些情况都不适用(每个节点都必须接收每个数据包,并且数据包的时间不可预测,因此接收者无法自行检测到丢失的数据包),则您的选择包括:

  1. 每个数据包都需要每个节点明确的ACK。如果未收到ACK,则发送方将重试(单播)该数据包。
  2. 基于TCP的网格方法,其中每个节点手动重复接收到的数据包以传递给邻居节点,并依赖TCP机制来确保传送。

您可能会依赖于接收方在接收到后续序列号的数据包时注意到丢失的数据包,但这要求发送方将该数据包保留至少一个附加数据包已发送。要求进行积极的ACK更可靠(并且可以证明)。


1
你所采取的方法很大程度上取决于你发送的数据的性质、网络规模和发送的数据量。特别是它将取决于每个节点连接的目标数量。
如果你期望将其扩展到每个节点的大量目标和大量数据,那么你可能会发现添加每个数据包的 ACK/NAK 的开销足以对你的吞吐量产生不利影响,特别是当你加入重传时。
正如Frank Szczerba所说,多媒体数据有助于从丢失的数据包中恢复。如果你能控制你要发送的数据,你应该尽量设计有效载荷,使其对丢失的数据包的易感性最小化。
如果你发送的数据不能容忍丢失的数据包,并且你正在尝试高利用率地扩展你的网络,UDP可能不是最好的协议。实施一系列 TCP 代理(每个节点向所有其他连接的节点重新发送单播),类似于你的洪水想法,将是一种更可靠的机制。
话虽如此,你考虑使用真正的组播在这个应用程序中吗?

刚刚看到了“作业”标签...这些建议可能不适用于作业问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接