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



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

到目前为止,在任意2个对等点(比如A和B)之间,应用程序打开两种类型的连接——一种是A是服务器,B是客户端,反之亦然。这样做的目的可能是,如果A需要将数据传输到B,反之亦然,那么整个过程可以比从A到B只有一种连接类型更快地完成。对于每种连接类型(比如A是服务器,B是客户端),应用程序然后打开3个TCP连接(使用C套接字)。然而,按照目前的编码方式,它最终只使用了这3个连接中的一个。

看到这一点,我开始怀疑,为了优化利用N个开放连接,也许可以使用循环或某种策略将数据分成块,同时进行传输。然而,我不清楚应该打开多少个并行TCP连接,以及在这些连接之间使用什么策略。这个答案还取决于什么因素?例如,如果我打开了1000个TCP连接,有什么害处?(忽略系统限制,如端口用完等)

如果有人能阐明当今的应用程序是如何利用多个并行TCP连接来实现最高性能的,那就太好了。快速的谷歌搜索让我找到了几篇研究论文,但我也很想知道如何解决这个问题,例如网络浏览器。

谢谢!


更新:在与一些对TCP有更多了解的人交谈后,我有了更好的了解。首先,我认为在A和B之间打开两种类型的连接(其中A是客户端,B是服务器,反之亦然)将有助于提高净吞吐量的假设似乎是错误的。在A和B之间打开一种类型的TCP连接就足够了。这取决于数据报是否能够同时从A传播到B,反之亦然。我发现这个链接很有用:TCP是双向的还是全双工的?。

此外,为了充分利用我可用的带宽,最好打开多个TCP连接。我发现了这个高度相关的链接:TCP有可能通过多个连接实现更高的传输速率吗?

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

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

有一个潜在的(次要的)好处可以通过使用多个TCP流来实现,然而,只有在流A中传输的数据在逻辑上独立于流B中传输数据的情况下才能看到这种好处。如果是这种情况(即,如果接收器可以立即使用流A中的数据,而不必等待流B中的数据首先到达),那么拥有多个流可以使数据传输对数据包丢失更有弹性。

例如,如果流A丢弃了一个分组,这将导致流A在重新发送丢弃的分组时不得不短暂暂停,但与此同时,流B的数据可以继续流动而不中断,由于流B独立于流A操作(如果A数据和B数据都是通过同一TCP流OTOH发送的,则B数据将被迫等待丢失的A数据包被重新发送,因为在TCP流中总是强制执行严格的FIFO排序)。

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

您没有指定操作系统,所以我假设我们谈论的是Linux。我认为你需要做一些关于非阻塞IO的研究,比如epoll或asio。它是目前同时处理多个连接的最有效和可扩展的方式。

例如,你可以从这里开始。

可以在此处或此处找到一些性能分析。