如果你有一个情况下,TCP连接是潜在的过于缓慢和UDP"连接"可能是太不可靠你怎么使用?有各种不同的标准可靠UDP议定书有什么经验,你有他们吗?

请讨论一协议每答复,如果有人已经提到过一个你使用,然后再考虑他们的投票和使用评论阐明,如果需要的话。

我感兴趣的各种选择,在这里,其中TCP是一端的规模和UDP是在其他。各种可靠的UDP选项可供选择及每一带来了一些要素TCP UDP。

我知道,往往TCP是正确的选择,但有一个列表中的替代品往往是有益的帮助之一来这一结论。事情就像硅谷动力,RUDP,等等,都是建立在UDP具有各种优点和缺点,你用他们,你有什么经验?

为避免产生疑问,没有更多信息,这是一个假设的问题之一,我希望将引出一个清单的答复,详细说明了各种选项和可用的替代技术的人的需要做出决定。

有帮助吗?

解决方案

如果没有关于问题领域的其他信息,很难回答这个问题。 例如,您使用的数据量是多少?多常?数据的性质是什么? (例如,它是唯一的,一个关闭数据?还是一个样本数据流?等等) 你正在开发什么平台? (例如桌面/服务器/嵌入式) 要确定“太慢”的含义,您使用的是什么网络媒体?

但在(非常!)一般术语中,我认为你将不得不尝试非常努力地击败tcp以获得速度,除非你可以对你试图发送的数据做出一些严格的假设。

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

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

其他提示

SCTP 怎么样?它是IETF(RFC 4960)的标准协议

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

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

更新:精彩的介绍性文章

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

我使用ENET作为可靠的UDP协议,并为我的客户在其服务器中使用它编写了一个异步套接字友好版本。它运行得很好,但我不喜欢对等ping增加空闲连接的开销;当你有很多连接时,定期ping所有连接是很繁忙的工作。

ENET为您提供了发送多个“通道”数据的选项,以及发送的数据不可靠,可靠或有序的选项。它还包括前面提到的点对点ping,它起着保持活力的作用。

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

RUDP- 可靠的用户数据协议

这提供:

  • 确认收到了数据包
  • 窗口和塞控制
  • 丢失的数据包重传
  • Overbuffering(快于实时的流)

它似乎略有更多的配置方面保持连接后,硅谷动力,但它不会给你的许多选项(即所有数据都是可靠和顺序不仅仅是位,你决定应)。它看起来相当直接的实施。

正如其他人所指出的那样,你的问题很普遍,而且某些东西是否比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");

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

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

可以在此处找到当前的QUIC设计文档。

  

如果您的TCP连接可能太慢并且UDP“连接”可能太不可靠,您使用什么?有各种标准的可靠UDP协议,你有什么经验吗?

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

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

协议DCCP,在 RFC 4340 ,“数据报拥塞控制协议”中标准化。可能就是你要找的东西。

似乎在Linux中实施

可能是 RFC 5405 ,“应用程序设计人员的单点UDP使用指南”对你有用。

您是否考虑过压缩数据?

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

RUDP 。许多用于游戏的套接字服务器实现了类似的功能。

使用UDP实现可靠性的最佳方法是在应用程序本身中构建可靠性(例如,通过添加确认和重传机制)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top