我正在为大学考试做准备,去年的问题之一是“如何使UDP多播可靠”(例如tcp,重传丢失的数据包)
我想到了这样的事情:
问题在于,可能有一个客户端通常会丢失数据包并迫使服务器重新发送。
好吗 ?
最佳答案
对于每个数据包发送ACK并使用TCP进行发送,无法扩展到大量接收器。使用基于NACK的方案效率更高。
从服务器发送的每个数据包都应具有与其关联的序列号。当客户收到它们时,他们会跟踪丢失了哪些序列号。如果丢失了数据包,则可以通过UDP将NACK消息发送回服务器。此NACK可以格式化为序列号列表或已接收/未接收到的序列号的位图。
当服务器收到NACK时,它不应立即重新发送丢失的数据包,而应等待一段时间,通常是GRTT的倍数(组往返时间-接收器组中最大的往返时间)。这使它有时间积累来自其他接收器的NACK。然后,服务器可以多播丢失的数据包,以便任何丢失它们的客户端都可以接收它们。
如果此方案用于文件传输而不是流数据,则服务器可以轮流交替发送文件数据。完整文件在第一遍发送,在此过程中,将累积接收到的所有NACK,并标记需要重新发送的数据包。然后,在随后的遍历中,仅发送重传。这样做的好处是,丢失率较低的客户端将有机会完成文件的接收,而丢失率较高的接收者可以继续接收重传。
对于损失很大的客户端,服务器可以为丢失的最大数据包百分比设置阈值。如果客户端发回超过该阈值的NACK一次或多次(取决于服务器的次数),则服务器可以丢弃该客户端,并且不接受其NACK或向该客户端发送消息以通知其已掉了。
有许多协议(protocol)可以实现这些功能:
相关RFC:
关于tcp - 可靠实现UDP组播的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31199565/