3

我知道该协议不支持这一点,但是对于需要某种程度的可靠性以在其应用程序中构建一种在发现数据包损坏时请求重新传输数据包的方法的客户端来说,这是否常见?

4

4 回答 4

6

如果客户端需要可靠性(或有时只是一些可靠性),而不是 TCP 提供的任何其他东西,例如严格的按顺序交付,并且如果他们需要,客户端通常在 UDP 之上实现可靠性时间,低延迟(或多播,它工作的地方)。

通常,您只会在有紧急原因时才想使用可靠的 UDP(需要非常低的延迟和高速,例如用于 twitch 游戏)。在每个“正常”情况下,简单地使用 TCP 将为您提供同样好的或更好的服务。另请注意,在性能比 TCP更差
的 UDP 之上实现自己的堆栈很容易。

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

于 2011-03-30T11:44:26.497 回答
2

您可能想看看这个问题的答案:当您需要可靠的 UDP 时,您使用什么?

于 2011-03-31T07:41:24.867 回答
2

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

例子

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

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

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

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

于 2011-03-30T11:37:59.033 回答
0

简短的回答:没有。

长答案:UDP 不关心数据包丢失。如果一个 UDP 数据包到达并且有一个错误的校验和,它就会被简单地丢弃。数据包的发送者不会被告知这一点,接收者也不会被告知。它只是被丢弃,这就是发生的一切。UDP数据包也没有编号,因此如果您发送四个数据包而只有三个到达接收者,那么接收者无法知道曾经有四个而丢失了一个。最后但同样重要的是,数据包没有得到确认,因此发送者永远不会知道它发送的数据包是否曾经到达接收者。

与此相反,TCP 将数据分成段,每个段都有编号,因此接收者可以知道是否丢失了段。此外,所有段都必须向发送者确认。如果发送方在一段时间后没有收到对段的确认,它将认为该段丢失并再次发送。

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

于 2018-10-26T17:45:02.423 回答