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

标签 c++ c networking multiplexing

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

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

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

最佳答案

做可能有效的最简单的事情,并仅在必要时使其变得更复杂:

  1. 使用单个 TCP 连接并通过其复用逻辑 session

    • 例如,如果这些逻辑实体只是异步请求/响应对,您可能可以完全省去显式逻辑 session
  2. 如果每个实例中有多个并发组件,这些组件确实需要自己的队列并通过回推来限制过度渴望的发送者:

    • 首先考虑限制发送端未完成的请求/事件 session 的数量,而不是要求特定的确认
    • 仅当您需要动态改变队列长度时(例如,因为您确实试图限制工作内存,而工作内存因 session 而异),请为此使用显式逻辑确认
  3. 只有当您遇到逻辑 session 与 TCP 交互确实很糟糕的情况时,才考虑实现您自己的可靠流控制数据报协议(protocol)

关于c++ - 使用多路复用搜索 C/C++ 网络库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251925/

相关文章:

ubuntu - 带有 LXD 的 Ubuntu 16.04 中的自定义桥接器

c++ - ZeroMQ 是否允许多个服务器套接字?

c++ - 当我只有一个指向数据的空指针时,使用 printf 打印字符

c - 在二叉搜索树中的 C 处插入新节点

c++ - Boost 客户端卡住

c - 使用 free() 时获取核心转储

c - 使用 getchar 和存储字符时遇到困难

c# - SocketAsyncEventArgs 和 ReadAsync

c++ - 使用 icc -static 问题编译

c++ - 与兄弟类型之间的侧向转换是否保留 C++ 中的地址?