Tcp UDP可靠组播的实现方法
我正在准备大学考试,去年的一个问题是“如何使UDP多播可靠”(如tcp,丢失数据包的重新传输) 我想到了这样的事情:Tcp UDP可靠组播的实现方法,tcp,udp,multicast,reliable-multicast,Tcp,Udp,Multicast,Reliable Multicast,我正在准备大学考试,去年的一个问题是“如何使UDP多播可靠”(如tcp,丢失数据包的重新传输) 我想到了这样的事情: 服务器使用UDP发送多播 每个客户端发送接收该数据包的确认(使用TCP) 若服务器意识到并不是每个人都接收数据包,它会将多播或单播重新发送到特定的客户端 问题是,可能有一个客户端通常会丢失数据包,并迫使服务器重新发送 它好吗?要使UDP可靠,您必须处理一些事情(即,自己实现它) 连接处理:发送和接收进程之间的连接可能会断开。最可靠的实现通常发送保持活动状态的消息以维持两端之间的连
它好吗?要使UDP可靠,您必须处理一些事情(即,自己实现它) 连接处理:发送和接收进程之间的连接可能会断开。最可靠的实现通常发送保持活动状态的消息以维持两端之间的连接 排序:邮件在发送前需要分块 确认:收到每条消息后,需要向发送进程发送ACK消息。这些ACK消息也可以通过UDP发送,而不必通过UDP。接收进程可能会意识到丢失了一条消息。在这种情况下,它将停止从保留队列(保存已接收消息的消息队列,它就像等待消息的房间)传递消息,并停止请求重新传输丢失的消息 流量控制:根据接收进程传递数据的能力限制数据的发送 通常,有一组流程的领导者。每个小组通常都有一个组长和整个小组的视图。这称为虚拟同步 每个客户端发送接收该数据包的确认(使用TCP) 为每个数据包发送一个ACK,并使用TCP这样做,对于大量的接收器来说是不可伸缩的。使用基于NACK的方案更有效 从服务器发送的每个数据包都应该有一个与之关联的序列号。当客户收到序列号时,他们会跟踪丢失的序列号。如果数据包丢失,则可以通过UDP将NACK消息发送回服务器。此NACK可以格式化为序列号列表或接收/未接收序列号位图 若服务器意识到并不是每个人都接收数据包,它会将多播或单播重新发送到特定的客户端 当服务器接收到NACK时,它不应立即重新发送丢失的数据包,而应等待一段时间,通常是GRTT(组往返时间——接收器组中最大的往返时间)的倍数。这使得它有时间从其他接收器积累NACK。然后,服务器可以多播丢失的数据包,以便丢失它们的任何客户端都可以接收它们 如果此方案用于文件传输而不是流式数据传输,则服务器可以交替发送文件数据。在第一次传递时发送完整的文件,在此期间,将累积接收到的所有NACK,并标记需要重新发送的数据包。然后在随后的过程中,只发送重新传输。这样做的好处是,丢失率较低的客户端将有机会完成文件的接收,而高丢失率的接收器可以继续接收重传 问题是,可能有一个客户端通常会丢失数据包,并迫使服务器重新发送 对于丢失率极高的客户端,服务器可以为丢失的数据包的最大百分比设置阈值。如果客户机发回NACK的次数超过该阈值一次或多次(取决于服务器的次数),则服务器可以删除该客户机,或者不接受其NACK,或者向该客户机发送消息,通知其已删除
有许多协议实现这些功能:
- (披露:作者)