我必须要写一个可靠的,完全有序播系统,从头开始在蟒蛇。我不能使用任何外部图书馆。我允许使用一个中央序。

似乎有两个直接的办法:

  1. 写一个有效的系统,其中附有一个独特的id每个多消息, 具有序播序列号的消息id收到 和送回ACK和NACK。
  2. 写一个效率低下的洪水系统,在那里每一个到的多路广播器,只需重新发送每 消息接收一次(除非它是发送的通过,具体到的多路广播器.)

我允许使用第二种选择,而我倾向于这样做。

我目前正在播UDP消息(这似乎是唯一的选项)但是,这意味着一些信息可能丢失。这意味着我必须要能够独特的标识,每个发UDP消息,使其可以重新发送根据#2.我应该真正产生独特的编号(例如使用发件人的地址和电台)和组成每UDP消息发送?我怎么去做呢?而且我怎么会收到一个单一的UDP消息在蟒蛇,而不是一流的数据(即 socket.recv)?

有帮助吗?

解决方案

洪水的做法可能会导致一个糟糕的情况变得更糟。如果消息都下降了,由于高网络载荷,具有每个节点重新发送每一个消息只会让情况更糟。

最好的办法来取决于数据的性质正在发送.例如:

  1. 多媒体数据:没有重试一下降的分组是下降了框架,它不会有问题当的框架下到达那里。
  2. 定期数据:收件人节点保持一个计时器,是重置每次更新是收到。如果时间到期,它请求缺少更新的主节点。重试可以单播的请求的节点。

如果没有这些情况适用(每个分组已收到的每一节点,并将分组时是不可预测的,所以收件人不能错过了检测包在他们自己的),然后你的选择包括:

  1. 明确ACK从每个节点对于每个分组。发送者试次数(单播)中的任何分组,不ACKed.
  2. TCP基于网格办法,其中每个节点是手动重复收到的包邻居点,依靠TCP机制,以确保交付。

你可能依赖于收件人注意到错过了一个分组在接收一个与以后的序列号,但是这需要发送者保持的包围,直到至少一个额外的分组已经发送。需要积极的确认是更可靠的(和可证明的).

其他提示

这种方法将在很大程度上取决于数据的性质,你在发送,规模的网络和数量数据发送。特别是,要依赖于数量的目标,每个节点相连接。

如果你期待的这个比例要大量的目标对于每个节点和大量数据,然后您可能发现的开销增加一个ACK/NAK每个分组是足以不利地限制产量,特别是在加重。

作为弗兰克Szczerba有说的多媒体数据具有的益处能够恢复丢失的数据包。如果你有任何控制的数据,你是送你应该试图设计的有效载荷所以你尽量减少易感性的下降包。

如果数据,你送不能容忍下降了数据包 你在试图扩展到高利用率的网络,那么也许udp不是最佳协议的使用。执行一系列的tcp代理人(其中每个节点重发,单播,所有其他连接节点的-类似的洪水的主意)将是一个更可靠的机制。

所有这一切说,你有没有考虑采用真正的多播对于这个应用程序?


只是看到了"家庭作业"标记...这些建议可能不适用于家庭作业的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top