TCP:使用多个连接可以实现更高的传输速率吗?

17

在高延迟的环境下(假设没有针对每个连接进行流量整形等)使用多个并行TCP连接是否可以实现更好的数据传输速率?或者TCP能否通过单个连接利用整个带宽?


如果接收方不报告缓冲区拥塞(窗口大小为0),TCP是否以尽可能快的速度发送数据?因此,如果RTT例如为60秒,它不会影响速率吗?是否存在某些限制速率的最大窗口大小或其他因素?

4个回答

22
< p>多个并发连接可能会给您带来一个好处(在遵循dove和Brian提到的相同注意事项的前提下),那就是您将能够更好地克服TCP接收窗口过小的问题。

这与带宽延迟乘积有关。(这里有一个更详细的解释。)

简单总结一下: 在高延迟、高带宽的环境中,诸如TCP之类的可靠通信通常受到任何时候正在传输的数据量的限制。多个连接是解决此问题的一种方法,因为带宽延迟乘积对每个连接都适用。

更详细地说,考虑以下情况: 您的端到端带宽为每秒10^8比特(10兆比特/秒),往返延迟为100毫秒(0.1秒)。

因此,在第一位数据的确认返回发送方之前,可以发送多达10^7比特(10兆比特=约1.25兆字节)的数据。

这将取决于您的操作系统的TCP栈,但是TCP接收窗口大小的一个不罕见的值是64K字节。这显然太小了,无法充分利用端到端带宽; 一旦发送了64kbytes(512kbits)的数据,则发送进程将等待接收方的窗口更新,表示已消耗某些数据,然后再将更多数据放入传输线上。

通过同时打开多个TCP会话来解决此问题,因为每个TCP会话都有自己的发送/接收缓冲区。

当然,在互联网上很难确定真正可用的端到端带宽,因为涉及TCP窗口大小、争用等因素。如果您能提供一些示例数字,我们可能能够提供更多帮助。

您应该考虑的另一个选项是在创建套接字时设置较大的接收窗口,可以使用全局操作系统设置或套接字选项逐个进行。


你的意思是“最多10^8位”吗? - tmm1

7
如果您是链接上唯一的人,它将增加开销并降低速度。然而,当与他人共享完全饱和的链接时,这是一种欺骗系统并增加您总体速度的方法(每个连接都比单个连接慢,但聚合后将更快,因为您现在拥有更大比例的 "时间槽"(技术术语是什么?我现在不记得了)分配给您)。

延迟是怎么样的呢?它是如何影响速率的?如果使用足够大的缓冲区,那么延迟是否不会影响速率? - JtR
根据TCP窗口的大小,任何缓冲区都远不如此重要。 - Brian Knoblauch

1

是的,但并不一定容易实现。像Akamai这样的CDN通过压缩比通常发送的更大的数据包来提高性能,因为它们有专用的可靠管道。如果不了解您的应用程序,很难给出更好的细节。


我的应用程序正在单向传输数据,而不需要任何应用层对话。只需将数据推送到远程套接字即可。 - JtR
我可能不太了解这里的情况,但如果不是太困难的话,最可靠的方法是设置一个试用。在我看来,鉴于它是单向的,肯定有潜力。 - dove
你是否在寻找可靠的(基于连接的)套接字?如果不是,可能使用UDP而不是TCP会有所帮助? - AshtonKJ
是的,它应该是可靠的,所以UDP不是选择。 - JtR

1

Muz对问题的描述非常准确。

请记住,利用它可能取决于您操作系统中TCP的实现。特别是,为了获得最佳结果,您需要一个支持RFC 1323中窗口缩放选项的TCP堆栈。

此外,您可能需要调整一些操作系统设置才能使其正常工作。在Windows上,有一个名为TcpWindowSize的注册表设置,您可能需要进行调整。有一篇微软知识库文章224829:Windows 2000和Windows Server 2003 TCP功能说明描述了如何进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接