UDP可以重传丢失的数据吗?

时间:2011-03-30 11:36:27

标签: networking udp udpclient

我知道协议不支持这一点,但对于那些需要一定程度可靠性的客户来说,如果发现它是腐败的,请求重新发送数据包的方法是常见的吗?

4 个答案:

答案 0 :(得分:5)

如果客户需要可靠性(或者有时只是某些可靠性)而不是TCP提供的任何其他内容,例如严格按顺序,客户端通常会在UDP之上实现可靠性交付,,如果他们想要,同时,低延迟(或多播,它的工作原理)。

一般情况下,如果有紧急原因(非常低的延迟和高速度,例如抽搐游戏),您只需要使用可靠的UDP。在每个“正常”的情况下,简单地使用TCP将同样为您提供更好或更好的服务 另请注意,很容易在UDP之上实现自己的堆栈,执行更糟而不是TCP。

有关在UDP之上实现可靠性(以及一些其他功能)的库的示例,请参阅enet(Raknet或HawkNL将是其他示例)。

答案 1 :(得分:2)

当然。您可以在UDP之上构建可靠的协议(如TCP)。

实施例

想象一下,您正在构建一个文件服务器:  *使用1024字节的块读取文件  *构造一个带有效载荷的UDP数据包:4个字节用于文件中的“位置”,4个字节用于数据包内容的“长度”。

接收器现在接收UDP数据包。如果他得到以下数据包:  * 0-1024:数据  * 1024-2048:数据  * 3072-4096:数据

它意识到数据包丢失,并要求发送应用程序在2048年和3072年之间重新发送该部分。

这是一个非常基本的示例,用于解释您的应用程序代码需要处理的数据包构造和有效负载解释。不要使用它,它不会考虑边缘情况(最后一个数据包,损坏数据包的校验和,......)。

答案 2 :(得分:2)

您可能希望查看此问题的答案:What do you use when you need reliable UDP?

答案 3 :(得分:0)

简短的回答:否

长答案:UDP并不关心数据包丢失。如果UDP数据包到达并具有错误的校验和,则将其丢弃。既不通知包的发送者也不通知接收者。它仅被删除,仅此而已。 UDP数据包也没有编号,因此,如果您发送四个数据包,而只有三个数据包到达接收者,则接收者将无法知道曾经有四个,而一个丢失了。最后但并非最不重要的一点是,数据包不会被确认,因此发送者将永远不会知道它发出的数据包是否曾经发送给接收者。

与此相反,TCP将数据分为多个段,每个段都进行了编号,因此收件人可以知道是否缺少段。同样,所有段都必须确认给发送者。如果发件人在一定时间段内未收到某段的确认,则将认为该段已丢失并再次发送。

当然,您可以在通过UDP发送的每个数据片段的顶部添加一个自己的帧头,这样您的应用程序代码可以对发送的片段进行编号,并且可以在代码中实现确认应答策略,但是问题是:这真的比已经免费提供的TCP更好吗?即使这同样好,也可以节省时间,只使用TCP。许多人已经认为他们可以做得比TCP更好,通常他们最终会意识到,实际上他们做不到。 TCP有其弱点,但总的来说,它的功能相当不错。