使用广播和UDP与ack(我们必须使用它,因为它支持现有系统)。
当A向B发送一个msg时,A的计时器将开始运行,在超时之前它将再次向B发送相同的msg。 B是许多系统的协调者,可能迟到了答复A.此外,答复可能在此过程中丢失。 A可以随时发送任何消息。
在B的ack达到A之前,我们如何降低A重新发送B msg的危险(我想解决是不可能的),这样A可以将msg注册为失败(重发两次后),然后B的ack达到A?
答案 0 :(得分:0)
这实际上是广播,即一对多传输吗?它听起来不像是纯广播,因为你提到每个接收器的重传决定。假设您可以独立地向每个接收器发送数据包,我会回答。
您可以通过借用TCP中的概念来构建良好的可靠性机制。 TCP具有最通用和最先进的解决方案 - 它可以处理无序重组,并且可以高延迟地扩展到高带宽(使用ACK窗口),并且对信道条件具有一定的适应性。
根据你正在做的事情,这可能是过度的。相反,您可以从USB借用,USB在数据包传送和确认方面也具有可靠性和消歧机制。但它一次只能处理一个未完成的数据包(例如窗口大小== 1),并且无法处理乱序交付,如果您有高带宽或高延迟要求,这将成为主要的性能限制因素。 / p>
在任何一种情况下,您的总体超时(用于向应用程序层发送传递故障的信号)应该很长,以至于您在正常操作期间不会发现它。例如,TCP实现将等待15秒以上,以放弃交付并向应用层发出问题。
设计超出基本的一次一个数据包交付的任何东西都需要严格的协议设计和QA才能正确完成。角落的情况很难被击中。如果您的要求非常重要,您需要聘请一些可靠的网络协议工程师,或找出使用TCP等现有解决方案的方法!
答案 1 :(得分:0)
应用程序 B 需要编写,以便高优先级,优选的实时调度线程等待来自应用程序 A 的数据包。当 B 收到数据包时,将有效负载复制到内存锁定循环缓冲区并立即返回轮询套接字。然后让应用程序 B 中的业务级逻辑从循环缓冲区中读取以进行实际处理。