当你需要可靠的UDP时,你使用什么?

如果你有一个TCP连接可能太慢,UDP连接可能太不可靠的情况,你使用什么? 那里有各种标准可靠的UDP协议,你有什么经验?

请每个回复讨论一个协议,如果其他人已经提到了你使用的那个,那么就要考虑投票,如果需要的话可以使用评论来详细说明。

我对这里的各种选项感兴趣,其中TCP处于一个规模的一端,UDP处于另一端。 各种可靠的UDP选项都可用,并且每个都带有一些TCP到UDP的元素。

我知道TCP通常是正确的select,但是有一个替代scheme的列表通常可以帮助我们得出这个结论。 像Enet,RUDP等build立在UDP上的东西有各种各样的优点和缺点,你用过它们,你有什么经验?

为了避免疑问,没有更多的信息,这是一个假设性的问题,我希望能够得出一份回应清单,详细列出需要作出决定的人可以使用的各种选项和备选scheme。

如果没有关于问题领域的额外信息,就很难回答这个问题。 例如,你使用的数据量是多less? 多久? 数据的性质是什么? (例如,它是唯一的,一个数据呢?还是一个样本数据stream?等等)你在为什么开发平台? (如桌面/服务器/embedded式)要确定你的意思是“太慢”,你使用什么networking媒体?

但是(非常)总的来说,我认为除非你可以对你要发送的数据做出一些硬性的假设,否则你将不得不努力去争取tcp的速度。

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

但是,如果你不能容忍丢失一个数据包,那么你将不得不开始介绍tcp已经具有的可靠性技术types。 而且,如果不进行合理的工作量,您可能会发现您已经开始将这些元素构build到用户空间解决scheme中,并解决所有固有的速度问题。

什么关于SCTP 。 这是IETF(RFC 4960)的标准协议,

它有大块的能力,可以帮助速度。

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

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

ENET – http://enet.bespin.org/

我已经和ENET一起作为一个可靠的UDP协议,并且为我的客户端编写了一个asynchronous的套接字友好版本,这个客户端正在服务器端使用它。 它工作得相当好,但我不喜欢对等ping所增加的空闲连接的开销; 当你有很多的连接时,经常需要大量的工作。

ENET让您可以select发送多个“频道”的数据,并使发送的数据不可靠,可靠或sorting。 它还包括前述的作为保持活动的对等ping。

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

正如其他人所指出的那样,你的问题是非常普遍的,不pipe是否比TCP更快,取决于应用的types。

一般来说,TCP的传输速度与从一台主机到另一台主机的数据可靠传输速度相同。 但是,如果您的应用程序执行了大量小型突发stream量并等待响应,那么UDP可能更适合将延迟降至最低。

有一个容易的中间地带。 Nagle的algorithm是TCP的一部分,它有助于确保发送方不会淹没大量数据stream的接收方,从而导致拥塞和数据包丢失。

如果您需要TCP的可靠,有序的交付以及UDP的快速响应,并且不需要担心发送大量数据stream的拥塞,您可以禁用Nagle的algorithm:

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

RUDP – 可靠的用户数据报协议

这提供了:

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

它看起来稍微更易于configuration,但是它没有提供尽可能多的选项(也就是说,所有的数据都是可靠的,并且不仅仅是你所决定的位应该是有序的)。 它看起来相当直接的实施。

任何人如果决定上面的列表是不够的,他们想要开发自己的可靠的UDP应该看看谷歌的QUIC规范,因为这涵盖了许多复杂的angular落案例和潜在的拒绝服务攻击。 我还没有玩过这个实现,你可能不需要或者不需要它提供的所有东西,但是在开始一个新的“可靠的”UDPdevise之前,这个文档是值得一读的。

QUIC的一个很好的起点在这里 ,在Chromium博客。

当前的QUICdevise文档可以在这里find。

如果你有一个TCP连接可能太慢,UDP连接可能太不可靠的情况,你使用什么? 那里有各种标准可靠的UDP协议,你有什么经验?

你的句子中的关键词是“潜在的”。 我认为你真的需要向自己certificate,如果你的协议需要可靠性,TCP实际上对你的需求来说太慢了。

如果你想从UDP中获得可靠性,那么你基本上要在UDP之上重新实现一些TCP的function,这可能会比首先使用TCP更慢。

在RFC 4340中标准化的协议DCCP“数据报拥塞控制协议”可能是你正在寻找的。

它似乎在Linux中实施 。

可能是RFC 5405 ,“应用程序devise者的单播UDP使用指南”将对你有用。

你有没有考虑压缩你的数据?

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

RUDP 。 游戏的许多socket服务器实现类似的东西。

使用UDP实现可靠性的最好方法是在应用程序本身build立可靠性(例如,增加确认和重传机制)