2012-11-06 18 views
2

我正在编写一个应用程序,它具有在两个实例之间并行运行的数百个并行网络操作。由于连接的平均寿命非常短(至多秒),我认为每次使用多个TCP连接并握手(特别是对于TLS握手)的开销会过大。搜索多路复用的C/C++网络库

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

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

+0

对于高性能网络事件处理(复用),您可以查看[libevent](http://libevent.org/)或[libev](http: //software.schmorp.de/pkg/libev.html)。 –

+0

从它的外观来看,你会用UDP的方式重新实现TCP,而我不知道如何让它更有效率。您链接到的帖子并没有真正说'TCP多路复用是愚蠢的',更多的是存在复杂的风险(例如本地缓冲区溢出),并且这些也倾向于应用于模拟TCP。 – Kylotan

+0

@Kylotan没错,但我的“重新实现”会知道多路复用流。链接中突出显示的问题是多路复用流所需的ACK会触发另一个TCP ACK(因此会增加往返)。这是不需要的开销,不会发生在UDP上。 –

回答

5

做能够工作的最简单的事情,使之更加复杂的仅在必要时:

  1. 使用一个TCP连接,并在其上

    • 复用的逻辑会话,如果这些逻辑实体只是异步请求/响应对,例如,您可以完全免除显式逻辑会话
  2. ,如果你在每个实例中的多个并发的组件,其真的需要自己的队列,反推到油门过于急切的发件人:

    • 首先考虑的只是加盖在发送侧突出的请求/活动会话的数量,而不是仅在需要动态改变队列长度时才需要特定的确认
    • (例如,因为你真的试图限制工作记忆,它通过会话而异)使用一个明确的逻辑ACK此
  3. 只有当你击出了一些情况下你的逻辑会话真正与TCP交互严重,再考虑实现您拥有可靠流量控制的数据报协议