在UDP中使用部分数据报顺序接收数据包有什么缺点吗?

时间:2013-05-22 18:23:39

标签: networking tcp network-programming udp packet

UDP协议不保证按顺序接收数据包,但您可以使用部分数据报作为序列号。

与TCP的保证相比,UDP等价的上述解决方案是什么?

基本上,我一直在阅读UDP无法提供顺序接收,但这似乎是一个明显的解决方案,我想知道它是否真的是一个适当的修复。

4 个答案:

答案 0 :(得分:1)

以这种方式使用UDP使应用程序需要处理数据包重建和排序。这会在网络的应用层中产生开销。 TCP在传输层中处理它可能更有效。

同样,UDP不提供重新发送丢失数据包的机制。当您的应用程序注意到序列号跳过一个时,其含义有些含糊不清。是丢包还是丢包?您的应用程序需要能够检测到该数据,并能够通过数据包编号参考请求再次发送数据包。

换句话说,当需要按顺序保证传送时,TCP的开销是有原因的。

https://en.wikipedia.org/wiki/User_Datagram_Protocol

答案 1 :(得分:1)

听起来你想要一种部分可靠性,在TCP和UDP之间。

一个选项是使用SCTP-over-UDP(SCTP,可移植用户空间和内核source)。 SCTP允许您按顺序设置不可靠的UDP类流,以及部分可靠的流(限制时间或重新传输的数量)

答案 2 :(得分:1)

唯一的“缺点”是丢失了几个字节的数据空间。

但是,它本身并不是解决方案。您必须在协议中添加ACK消息,以便发送方知道您拥有和未接收的内容;您必须在发送方缓冲已发送的数据报,直到它们被确认为止,以防您必须重新传输;并且您必须缓冲无序数据报或将它们丢弃,以便您可以正确地重建序列。到目前为止,如果发送者注意到需要进行大量的重传,那么发送者实施某种形式的流量控制或节奏也是明智的。

这是实施TCP的好方法。大多数人都放弃了这一点并使用TCP。

答案 3 :(得分:0)

当然,您可以在UDP中实现TCP中缺少的功能,但这会破坏UDP的目的。关键是网络堆栈中的TCP实现会为您执行所有必要的操作。 (涉及分组重组和丢包)。

如果你需要TCP,你应该使用它。 UDP专为丢包而不关心的数据包而设计(如VOIP,Gameserver等)。