【问题标题】:How to implement retransmissions in Twisted UDP-based application如何在基于 Twisted UDP 的应用程序中实现重传
【发布时间】:2012-05-16 20:30:06
【问题描述】:

我想编写一个基于 UDP 的应用程序,它需要重新传输未经远程主机确认的数据包。我认为有两种可能的方法:

  1. 对我的应用程序发送的每个数据包使用 reactor.callLater(),以调用一个函数来检查是否已收到确认(如果没有收到则重新传输数据包)。

  2. 记住一个特殊列表中的每个数据包,并定期调用一个函数来检查该列表中的所有成员是否已收到确认。这个函数也可以通过 reactor.callLater() 调用——超时设置为下一次重传(列表中所有数据包的最短值)。

我的问题是:

  1. 第一种方法要简单得多 - 但 Twisted 底层实现是否足够高效以使用它?
  2. 当使用第二种方法时,是否可以中断 reactor.callLater()?例如,如果我安排了一个 20 秒的通话,突然我需要发送一个重传间隔为 5 秒的新数据包?

最好的问候

马切克

【问题讨论】:

  • 考虑使用 TCP,它将为您处理重传。
  • 我正在研究 CoAP Protocol,它在 UDP 之上使用。

标签: timeout udp twisted


【解决方案1】:

为了讨论 callLater 的行为,我将忽略此问题的 UDP 部分并回答您提出的两个具体问题。 :)

延迟呼叫的处理效率很高。安排一个新的呼叫是 O(log N) 对已经安排的呼叫的数量。反应器的整体性能在预定调用次数上保持不变。

就“打断”而言,“打断”对于您想要的东西来说是错误的词。 Delayed calls can be rescheduled 使用 resetdelay。当然,您可以随时 cancel 现有电话并安排新电话。

【讨论】:

  • 非常感谢 Jean-Paul - 这让我相信选择 Twisted 是一个不错的选择。最好的问候
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 2019-02-10
  • 2011-06-03
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多