0

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

与TCP的保证相比,上述UDP的解决方案是否等效?

基本上,我到处都在读到 UDP 不提供顺序接收,但这似乎是一个明显的修复,我想知道它是否真的是一个足够的修复。

4

4 回答 4

1

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

同样,UDP 不提供重新发送丢失数据包的机制。当您的应用程序注意到序列号跳过了一个时,其含义就会出现一些歧义。是否有丢包或延迟包?您的应用程序需要能够检测到这一点,并能够通过数据包编号引用请求再次发送数据包。

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

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

于 2013-05-22T18:33:13.247 回答
1

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

然而,它本身并不是一个解决方案。您必须将 ACK 消息添加到您的协议中,以便发送者知道您有什么和没有收到什么;您必须在发送方缓冲发送的数据报,直到它们被确认,以防您必须重新传输;并且您必须缓冲序列数据报或将它们丢弃,以便您可以正确重建序列。到目前为止,如果发送方注意到需要大量重传,则实施某种形式的流量控制或定步也是明智的。

这是实现 TCP 的好方法。大多数人在这一点上放弃并使用 TCP。

于 2013-05-23T00:08:28.920 回答
1

听起来您想要一种介于 TCP 和 UDP 之间的部分可靠性。

一种选择是使用 SCTP-over-UDP(SCTP,可移植用户空间和内核源代码)。SCTP 允许您按顺序设置不可靠的类似 UDP 的流,以及部分可靠的流(有限时间或重传次数)。

于 2013-05-22T18:46:48.080 回答
0

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

如果您需要 TCP,那么您应该使用它。UDP 专为那些您不关心它们是否丢失的数据包而设计(如 VOIP、Gameserver 等)。

于 2013-05-22T18:28:16.823 回答