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

我想到了这样的事情:

  • 服务器使用UDP发送多播
  • 每个客户端(使用TCP)发送接收到该数据包的确认信息
  • 如果服务器意识到并非所有人都收到数据包,则它将多播或单播重新发送到特定的客户端

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

    好吗 ?

    最佳答案



    对于每个数据包发送ACK并使用TCP进行发送,无法扩展到大量接收器。使用基于NACK的方案效率更高。

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



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

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



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

    有许多协议(protocol)可以实现这些功能:

  • UFTP - Encrypted UDP based FTP with multicast(公开:作者)
  • NORM - NACK-Oriented Reliable Multicast
  • PGM - Pragmatic General Multicast
  • UDPCast

  • 相关RFC:
  • RFC 4654 - TCP-Friendly Multicast Congestion Control (TFMCC): Protocol Specification
  • RFC 5401 - Multicast Negative-Acknowledgment (NACK) Building Blocks
  • RFC 5740 - NACK-Oriented Reliable Multicast (NORM) Transport Protocol
  • RFC 3208 - PGM Reliable Transport Protocol Specification
  • 关于tcp - 可靠实现UDP组播的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31199565/

    10-10 12:42