Tcp UDP可靠组播的实现方法

Tcp UDP可靠组播的实现方法,tcp,udp,multicast,reliable-multicast,Tcp,Udp,Multicast,Reliable Multicast,我正在准备大学考试,去年的一个问题是“如何使UDP多播可靠”(如tcp,丢失数据包的重新传输) 我想到了这样的事情: 服务器使用UDP发送多播 每个客户端发送接收该数据包的确认(使用TCP) 若服务器意识到并不是每个人都接收数据包,它会将多播或单播重新发送到特定的客户端 问题是,可能有一个客户端通常会丢失数据包,并迫使服务器重新发送 它好吗?要使UDP可靠,您必须处理一些事情(即,自己实现它) 连接处理:发送和接收进程之间的连接可能会断开。最可靠的实现通常发送保持活动状态的消息以维持两端之间的连

我正在准备大学考试,去年的一个问题是“如何使UDP多播可靠”(如tcp,丢失数据包的重新传输)

我想到了这样的事情:

  • 服务器使用UDP发送多播

  • 每个客户端发送接收该数据包的确认(使用TCP)

  • 若服务器意识到并不是每个人都接收数据包,它会将多播或单播重新发送到特定的客户端

  • 问题是,可能有一个客户端通常会丢失数据包,并迫使服务器重新发送


    它好吗?

    要使UDP可靠,您必须处理一些事情(即,自己实现它)

    连接处理:发送和接收进程之间的连接可能会断开。最可靠的实现通常发送保持活动状态的消息以维持两端之间的连接

    排序:邮件在发送前需要分块

    确认:收到每条消息后,需要向发送进程发送ACK消息。这些ACK消息也可以通过UDP发送,而不必通过UDP。接收进程可能会意识到丢失了一条消息。在这种情况下,它将停止从保留队列(保存已接收消息的消息队列,它就像等待消息的房间)传递消息,并停止请求重新传输丢失的消息

    流量控制:根据接收进程传递数据的能力限制数据的发送

    通常,有一组流程的领导者。每个小组通常都有一个组长和整个小组的视图。这称为虚拟同步

    每个客户端发送接收该数据包的确认(使用TCP)

    为每个数据包发送一个ACK,并使用TCP这样做,对于大量的接收器来说是不可伸缩的。使用基于NACK的方案更有效

    从服务器发送的每个数据包都应该有一个与之关联的序列号。当客户收到序列号时,他们会跟踪丢失的序列号。如果数据包丢失,则可以通过UDP将NACK消息发送回服务器。此NACK可以格式化为序列号列表或接收/未接收序列号位图

    若服务器意识到并不是每个人都接收数据包,它会将多播或单播重新发送到特定的客户端

    当服务器接收到NACK时,它不应立即重新发送丢失的数据包,而应等待一段时间,通常是GRTT(组往返时间——接收器组中最大的往返时间)的倍数。这使得它有时间从其他接收器积累NACK。然后,服务器可以多播丢失的数据包,以便丢失它们的任何客户端都可以接收它们

    如果此方案用于文件传输而不是流式数据传输,则服务器可以交替发送文件数据。在第一次传递时发送完整的文件,在此期间,将累积接收到的所有NACK,并标记需要重新发送的数据包。然后在随后的过程中,只发送重新传输。这样做的好处是,丢失率较低的客户端将有机会完成文件的接收,而高丢失率的接收器可以继续接收重传

    问题是,可能有一个客户端通常会丢失数据包,并迫使服务器重新发送

    对于丢失率极高的客户端,服务器可以为丢失的数据包的最大百分比设置阈值。如果客户机发回NACK的次数超过该阈值一次或多次(取决于服务器的次数),则服务器可以删除该客户机,或者不接受其NACK,或者向该客户机发送消息,通知其已删除


    有许多协议实现这些功能:

    • (披露:作者)
    相关RFC:


    我假设步骤2中的确认涉及实际连接到服务器?此外,第3步可能是无止境的,如果某个客户机的连接非常糟糕,或者有一个本地防火墙在默默地丢弃数据包,那该怎么办呢。是的,这就是步骤3的问题所在。有什么解决办法吗?第3个问题的解决方案是继续无限次地重试,或者在一定次数的重试后简单地放弃错误消息。如果你想在第二步中使用TCP确认,那么真的没有其他方法。我的想法是在第二步中使用TCP,所以可能是错误的。我认为使用udp确认会加剧问题我认为问题已经得到了回答:。除了TCP,它使用NACK而不是ACK,这对多播更有利。您将如何处理接收您的数据报的10000个客户端的ACK?只有在检测到数据包丢失时才发送NACK,在多播可用的情况下,通常RFC的标准值为5740。尝试编辑,但编辑少于10个字符,因此被拒绝。@jcrigby感谢您捕捉到这一点。更新。