当我们需要可靠的UDP时使用什么?

时间:2020-03-06 14:28:49  来源:igfitidea点击:

如果我们遇到TCP连接可能太慢而UDP'连接'可能太不可靠的情况,该怎么使用?有各种各样的标准可靠的UDP协议,我们对它们有什么经验?

请讨论每个答复的一种协议,如果其他人已经提及我们使用的协议,则可以考虑将其投票,并在需要时使用评论进行详细说明。

我对这里的各种选项感兴趣,其中TCP处于规模的一端,而UDP处于另一端。有各种可靠的UDP选项可用,每个选项都将TCP的某些元素引入UDP。

我知道,TCP通常是正确的选择,但是列出替代方案通常有助于帮助得出这一结论。基于UDP构建的诸如Enet,RUDP等之类的东西各有优缺点,我们使用过它们吗,经历是什么?

为避免产生疑问,没有更多的信息,这是一个假设性的问题,我希望能引出一系列答复,详细说明需要做出决定的人可以使用的各种选择和替代方案。

解决方案

ENET http://enet.bespin.org/

我已经使用ENET作为可靠的UDP协议,并为在其服务器中使用它的我的客户端编写了异步套接字友好版本。它工作得很好,但是我不喜欢点对点ping会增加空闲连接的开销。当我们有很多连接时,定期对其进行ping操作是一件很忙的事。

ENET为我们提供了发送多个"通道"数据的选项,并使发送的数据不可靠,可靠或者有序。它还包括上述保持活动的对等ping。

没有关于问题领域的其他信息,很难回答这个问题。
例如,我们正在使用多少数据?多常?数据的本质是什么? (例如,它是唯一的,一次性的数据吗?还是样本数据流?等)
我们正在开发什么平台? (例如,台式机/服务器/嵌入式)
要确定"太慢"是什么意思,我们使用的是哪种网络介质?

但是总的来说,我认为我们将必须非常努力地击败tcp以提高速度,除非我们对要发送的数据做出一些硬性假设。

例如,如果我们尝试发送的数据可以容忍单个数据包的丢失(例如,定期采样的数据,其采样率是信号带宽的许多倍),那么我们可能可以通过确保我们可以检测到数据损坏(例如通过使用良好的crc)来牺牲传输的可靠性

但是,如果我们不能忍受单个数据包的丢失,那么我们将不得不开始介绍tcp已经具备的可靠性技术类型。而且,在没有进行大量工作的情况下,我们可能会发现,我们已经开始将这些元素构建到用户空间解决方案中,并且解决了所有固有的速度问题。

那SCTP呢。这是IETF(RFC 4960)的标准协议

它具有分块功能,可以帮助提高速度。

更新:TCP和SCTP之间的比较表明,除非可以使用两个接口,否则性能是可比的。

更新:一篇不错的介绍性文章。

If you have a situation where a TCP connection is potentially too slow and a UDP 'connection' is potentially too unreliable what do you use? There are various standard reliable UDP protocols out there, what experiences do you have with them?

句子中的关键字是"潜在"。我认为我们确实需要向自己证明,如果我们需要协议的可靠性,那么TCP实在太慢了。

如果要从UDP中获得可靠性,则基本上是要在UDP之上重新实现TCP的某些功能,这可能会使事情比最初仅使用TCP时慢。

我们是否考虑过压缩数据?

如上所述,我们缺乏有关问题确切性质的信息,但是压缩数据进行传输可能会有所帮助。

正如其他人指出的那样,问题是非常笼统的,是否某事"比TCP更快"在很大程度上取决于应用程序的类型。

通常,TCP的速度与从一台主机到另一台主机的可靠数据流的速度一样快。但是,如果应用程序进行了大量的小流量通信并等待响应,则UDP可能更适合于最大程度地减少延迟。

有一个简单的中间立场。 Nagle的算法是TCP的一部分,可帮助确保发送方不会使接收方无法承受大量数据流,从而避免拥塞和数据包丢失。

如果我们需要可靠,有序的TCP传输,还需要UDP的快速响应,而又不必担心发送大量数据流会造成拥塞,则可以禁用Nagle的算法:

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

RUDP可靠的用户数据报协议

这提供了:

  • 确认收到的数据包
  • 窗口和拥塞控制
  • 重传丢失的数据包
  • 过度缓冲(比实时流更快)

在保持生命方面,它似乎比ENet更具可配置性,但它没有给我们太多选择(即,所有数据都是可靠的,并且不仅对我们决定的位进行了排序)。实施起来看起来很简单。

我们有一些国防工业客户使用UDT(基于UDP的数据传输)(请参阅http://udt.sourceforge.net/),对此感到非常满意。我看到它也具有友好的BSD许可证。

可能是RFC 5405,"应用程序设计者的单播UDP使用指南"对我们很有用。

我们可能正在寻找在RFC 4340中标准化的协议DCCP"数据报拥塞控制协议"。

它似乎在Linux中实现。