UDP协议不保证按顺序接收数据包,但您可以使用部分数据报作为序列号。
与TCP的保证相比,UDP等价的上述解决方案是什么?
基本上,我一直在阅读UDP无法提供顺序接收,但这似乎是一个明显的解决方案,我想知道它是否真的是一个适当的修复。
答案 0 :(得分:1)
以这种方式使用UDP使应用程序需要处理数据包重建和排序。这会在网络的应用层中产生开销。 TCP在传输层中处理它可能更有效。
同样,UDP不提供重新发送丢失数据包的机制。当您的应用程序注意到序列号跳过一个时,其含义有些含糊不清。是丢包还是丢包?您的应用程序需要能够检测到该数据,并能够通过数据包编号参考请求再次发送数据包。
换句话说,当需要按顺序保证传送时,TCP的开销是有原因的。
答案 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等)。