要为C ++中的应用程序最佳使用而打开的并行套接字/ TCP连接数

时间:2019-01-04 15:10:16

标签: c++ c sockets networking tcp

因此,我正在研究一个C ++应用程序,该应用程序当前使用C套接字在同级之间传输数据。有n个对等点,所有对等点都运行相同的代码。在应用程序逻辑中,任何对等方都可能需要将数据(可能是大数据)传输到任何其他对等方,因此首先在所有可能的对等方组合之间打开连接。要求是(尽可能大的)数据的应用逻辑和网络传输应尽可能快。

到目前为止,该应用程序在任意两个对等方(例如A和B)之间打开2种类型的连接-一种连接,其中A是服务器,B是客户端,反之亦然。这样做的目的是,如果A需要同时将数据传输到B,反之亦然,那么整个过程比从A到B拥有一种连接类型要快得多。对于每种连接类型(假设A是服务器,B是客户端),然后该应用程序打开3个TCP连接(使用C套接字)。但是,其当前编码方式仅最终仅使用这3个连接之一。

看到这一点,我开始怀疑要充分利用N个打开的连接,也许有人可以使用轮询或某种策略将数据分成多个块并同时进行传输。但是,我不清楚要打开多少个并行TCP连接以及在这些连接之间使用什么策略的问题。这个答案还取决于哪些因素?例如,如果我打开了1000个TCP连接,会有什么危害? (忽略系统限制,例如端口用尽等)

如果有人可以阐明当今的应用程序如何利用多个并行TCP连接来实现最佳性能,那就太好了。快速的google搜索使我获得了几篇研究论文,但我也想知道例如Web浏览器如何解决此问题。

谢谢!


更新:在与一些对TCP有更多了解的人交谈之后,我有了更好的认识。 首先,我的前提是在A和B之间打开两种类型的连接(一种是A是客户端,另一种是B服务器,反之亦然)将有助于增加净吞吐量,这似乎是错误的。在A和B之间打开一种类型的TCP连接就足够了。这取决于数据报是否能够同时从A传输到B,反之亦然。我发现此链接非常有用:Is TCP bidirectional or full-duplex?

另外,要利用我可用的全部带宽,最好打开多个TCP连接。我发现了这个高度相关的链接:TCP is it possible to achieve higher transfer rate with multiple connections?

但是仍然应该打开多少这样的连接的问题。如果有人可以回答,那就太好了。

2 个答案:

答案 0 :(得分:1)

您没有指定OS,所以我假设我们正在谈论的是Linux。 我认为您需要对非阻塞IO做一些研究,例如epoll或asio。这是目前同时处理多个连接的最有效和可扩展的方法。

例如,您可以启动here

可以herehere找到一些性能分析。

答案 1 :(得分:1)

在两个主机之间传输数据时,使用多个TCP套接字不太可能获得显着的吞吐量优势。通过适当的编程,单个TCP连接可以同时在两个方向上同时饱和链路的带宽(即它可以以线速进行全双工/ 2路传输)。跨多个TCP连接拆分数据只会增加开销。在最佳情况下,N个连接中的每个连接将以单个连接的速度的1 / N传输(并且在现实生活中,由于附加的数据包报头,带宽争用等原因,传输速度会小于该速度)。

使用多个TCP流可以实现一个潜在的(次要)好处,但是,只有在流A中传输的数据在逻辑上独立于流中数据的情况下,才能看到该好处。 B.如果是这种情况(即,如果接收方可以立即使用流A中的数据,而不必等待流B中的数据先到达),那么拥有多个流可以使您的数据传输对数据包的适应性更强辍学。

例如,如果流A丢弃了一个数据包,这将导致流A在重新传输被丢弃的数据包时必须短暂暂停,但是与此同时,由于流B的运行独立,流B的数据可能会继续无中断地流动。 (如果A数据和B数据都通过相同的TCP流OTOH发送,则B数据将被迫等待丢失的A数据包重新发送,因为严格的FIFO-排序总是在TCP流中强制执行。

请注意,这种好处可能比您想象的要小,因为在许多情况下,导致一个TCP流丢失数据包的问题还将同时导致通过同一网络路径的任何其他TCP流也丢失数据包。