在ack中使用广播和UDP (我们必须使用它,因为它支持现有系统)。
当A向B发送消息时,A的定时器将开始运行,在超时之前,它将再次向B发送相同的消息。B作为许多系统的协调者,可能会延迟回复A。此外,回复可能会在此过程中丢失。A可以在任何时间向B发送任何消息。
在B的ack到达A之前,我们如何减少A重新发送B msg的危险(我猜解决是不可能的),这样A可以将msg注册为失败(在重新发送两次之后),然后B的ack到达A?
发布于 2011-01-18 14:27:21
这真的是广播(一对多传输)吗?这听起来不像是纯粹的广播,因为您提到了每个接收器的重传决定。因此,假设您可以单独向每个接收方发送数据包,我将回答此问题。
您可以通过借鉴TCP的概念来构建良好的可靠性机制。TCP具有最通用和最成熟的解决方案-它处理无序重组,可以扩展到具有高延迟的高带宽(使用ACK窗口),并且具有一定的信道条件适应性。
取决于你在做什么,这可能是过度杀伤力。相反,您可以借鉴USB,它在数据包传递和确认方面也具有可靠性和消除歧义的机制。但它一次只能处理一个未完成的数据包(例如,window size == 1),并且不能处理乱序传递,如果您有高带宽或高延迟要求,这将成为主要的性能限制因素。
在任何一种情况下,您的总超时(用于向应用层发送传递失败的信号)应该很长,以至于您在正常操作期间永远不会遇到它。例如,TCP实现将等待15+秒以放弃传送,并向应用层发送信号通知问题。
除了基本的一次一个数据包的传送之外,设计任何东西都需要认真的协议设计和QA才能正确。角落里的箱子很难打中。如果您的需求不是微不足道的,那么您需要雇佣一些可靠的网络协议工程师,或者想出一种方法来使用现有的解决方案,如TCP!
另请参阅What do you use when you need reliable UDP?上的相关讨论。
发布于 2011-02-15 07:58:52
应用程序B需要写入,以便高优先级的、优选的实时调度的线程正在等待来自应用程序A的数据包。当B接收到数据包时,将有效负载复制到内存锁定的循环缓冲区中,并立即返回到轮询套接字。然后,让应用程序B中的业务级逻辑从循环缓冲区中读取以进行实际处理。
https://stackoverflow.com/questions/4719906
复制相似问题