实现UDP组播可靠的方法

时间:2015-07-03 06:03:21

标签: tcp udp multicast reliable-multicast

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

我想到了这样的事情:

  1. 服务器使用UDP发送多播

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

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

  4. 问题是可能有一个客户端通常丢失数据包并强制服务器重新发送。

    好吗?

2 个答案:

答案 0 :(得分:2)

  

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

为每个数据包发送一个ACK,并使用TCP这样做,不能扩展到大量接收器。使用基于NACK的方案更有效。

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

  

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

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

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

  

问题是可能有一个客户端通常丢失数据包并强制服务器重新发送。

对于非常高丢失的客户端,服务器可以设置丢失的最大丢包百分比的阈值。如果客户端发送超过该阈值一次或多次的NACK(服务器有多少次),则服务器可以丢弃该客户端,并且不接受其NACK或向该客户端发送消息,通知它是丢弃。

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

相关RFC:

答案 1 :(得分:0)

为了使UDP可靠,你必须处理一些事情(即自己实现)。

连接处理:发送和接收过程之间的连接可能会丢失。最可靠的实现通常发送keep-Alive消息来维护两端之间的连接。

排序:在发送之前,邮件需要拆分为块。

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

流量控制:根据接收流程传输数据的能力,阻止数据发送。

通常,有一组进程的领导者。这些组中的每一组通常都具有领导者和整个组的视图。这称为虚拟同步。