使用多路复用搜索C / C ++网络库

时间:2012-11-06 13:19:37

标签: c++ c networking multiplexing

我正在编写一个应用程序,该应用程序在两个实例之间并行运行多个(数百个)并发网络操作。由于连接的平均生命周期很短(最多几秒),我认为每次使用许多TCP连接并进行握手(特别是TLS握手)的开销太大。

我开始研究实现多路复用的几个协议和库(主要是AMQP实现,如Apache QupidRabbitMQ,如this question的答案中所述。然而,所有这些似乎都在TCP上运行,这引入了一些开销并且没有多大意义(this post很好地解释了问题并且得出结论TCP多路复用是愚蠢的)。他们所有人都觉得自己很胖,我更喜欢小而轻的(ZeroMQ不幸的是没有实现多路复用)。这让我想到是否使用UDP是一种选择。当然,必须正确实现恢复和ACK之类的东西,但是通过连接知道有关多个流的知识应该比简单地使用TCP更有效。

你认为我的推理是正确的,还是我错过了重要的事情?有没有好的C / C ++库通过UDP实现多路复用?

1 个答案:

答案 0 :(得分:5)

尽可能做最简单的事情,并在必要时使其更加复杂:

  1. 使用单个TCP连接并在其上复用逻辑会话

    • 如果这些逻辑实体只是异步请求/响应对,例如,您可以完全免除显式逻辑会话
  2. 如果每个实例中有多个并发组件真的需要自己的队列,并且需要回拨来限制过热的发件人:

    • 首先考虑在发送方上限制未完成请求/活动会话的数量,而不是要求特定的确认
    • 只有当你需要动态改变队列长度时(例如,因为你真的试图限制工作内存,因会话而异)使用明确的逻辑确认
  3. 只有当你遇到逻辑会话与TCP真正交互不良的情况时,才考虑实施自己的可靠流量控制数据报协议