gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:50:44 25 4
gpt4 key购买 nike

我必须用 Python 从头开始​​编写一个可靠的、完全有序的多播系统。我不能使用任何外部库。我可以使用中央音序器。

似乎有两种直接的方法:

  1. 编写一个高效的系统,为每个多播消息附加一个唯一的id,具有接收到的消息 ID 的定序器多播序列号,并来回发送 ACK 和 NACK。
  2. 编写一个低效的泛洪系统,其中每个多播器简单地重新发送每个它收到一次消息(除非它是由那个特定的多播器发送的。)

我被允许使用第二个选项,并且我倾向于这样做。

我目前正在多播 UDP 消息(这似乎是唯一的选择),但这意味着某些消息可能会丢失。这意味着我必须能够唯一地标识每个发送的 UDP 消息,以便它可以根据 #2 重新发送。我真的应该生成唯一编号(例如使用发件人地址和计数器)并将它们打包到发送的每条 UDP 消息中吗?我该怎么做呢?我如何在 Python 中接收单个 UDP 消息,而不是数据流(即 socket.recv)?

最佳答案

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

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

  1. 多媒体数据:无需重试,丢弃的数据包就是丢弃的帧,无论如何下一帧何时到达都无关紧要。
  2. 固定周期数据:接收节点保留一个计时器,每次收到更新时该计时器都会重置。如果时间到期,它会向主节点请求丢失的更新。重试可以单播到请求节点。

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

  1. 来自每个节点的每个数据包的显式 ACK。发件人重试(单播)任何未确认的数据包。
  2. 基于 TCP 的网格方法,其中每个节点手动重复接收到的数据包到相邻节点,依靠 TCP 机制来确保交付。

您可能会依赖于接收方在收到序列号较晚的数据包时注意到丢失的数据包,但这需要发送方保留该数据包,直到至少发送了一个额外的数据包。要求肯定的 ACK 更可靠(并且可证明)。

关于python - 用 Python 编写一个可靠的、完全有序的多播系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/176179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com