很难对这个问题给出一个普遍的答案,但最好的方法可能不是留在“TCP 和 UDP 之间”的线上,而是横着走:)。
更详细的解释:
如果应用程序需要为它传输的每条数据获得确认响应,那么 TCP 的速度几乎与它获得的一样快(特别是如果您的消息远小于您的连接的最佳 MTU)并且如果您需要发送周期性数据发送出去的那一刻就过期了,那么原始 UDP 是最好的选择,原因有很多,但也不是特别考虑速度。
可靠性是一个更复杂的问题,在这两种情况下都有一定程度的相关性,并且始终取决于特定的应用程序。举个简单的例子,如果你从路由器上拔下网线,那么祝你好运,用 TCP 可靠地传送任何东西。更糟糕的是,如果您在代码中不做任何事情,那么您的操作系统很可能会在指示错误之前阻止您的应用程序几分钟,并且在许多情况下,这种延迟也是不可接受的。
因此,传统网络协议的问题通常不是关于速度或可靠性,而是关于便利性。它是关于获得 TCP 的一些特性(自动拥塞控制、自动传输单元大小调整、自动重传、基本连接管理……),同时还至少获得它错过的一些重要和有用的特性(消息边界 - 最重要的一个,连接质量监控,连接中的多个流等),而不必自己实现。
从我的角度来看,SCTP 现在看起来是最好的通用选择,但它不是很流行,并且在当今互联网上可靠地传递它的唯一现实方法仍然是将它包装在 UDP 中(可能使用sctplib)。它仍然是一个相对基本和紧凑的解决方案,对于某些应用程序,它本身可能仍然不够。
至于更高级的选项,在一些项目中我们使用了ZeroMQ,它工作得很好。这是一个更完整的解决方案,而不仅仅是一个网络协议(在底层它支持 TCP、UDP、几个更高级别的协议和一些本地 IPC 机制来实际传递消息)。自从发布了几个版本以来,它的初始开发人员将注意力转移到了他的新NanoMSG和目前最新的NNG库上。它没有经过彻底的开发和测试,也不是很受欢迎,但有一天它可能会改变。如果您不介意 CPU 开销和一些网络带宽损失,那么某些库可能适合您。还有一些其他面向网络的消息交换库可用。