14

是否有可能在高延迟环境中通过多个并行 TCP 连接实现更好的数据传输速率(具有大地理距离的公共互联网,假设每个连接没有流量整形或类似的东西),还是 TCP 可以通过单个连接利用整个带宽?


如果接收方没有报告 0 窗口大小的缓冲区拥塞,TCP 是否会尽可能快地发送数据?因此,如果 RTT 是例如 60 秒,它根本不会影响速率吗?是否有一些最大窗口大小或其他限制速率的东西?

4

4 回答 4

18

多个并发连接可能给您带来的一个好处(受制于 dove 和 Brian 提到的相同警告)是您将能够更好地克服 TCP 接收窗口太小的问题。

这涉及的原理是带宽延迟积(这里有更详细的解释)。

一个简短的总结:在高延迟、高带宽的环境中,可靠的通信(如 TCP)通常受到任何给定时间传输的数据量的限制。多个连接是解决此问题的一种方法,因为带宽延迟产品单独应用于每个连接。

更详细地考虑以下几点:您有 10^8 位每秒(10 兆位/秒)的端到端带宽,以及 100 毫秒(0.1 秒)的往返延迟。因此,在第一个数据位的确认返回给发送者之前,最多可以发送 10^7 位(10 兆位 = ~1.25 兆字节)的数据。

这取决于操作系统的 TCP 堆栈,但 TCP 接收窗口大小的一个不常见的值是 64Kbytes。这显然太小了,无法让您充分利用端到端带宽;一旦发送了 64kbytes (512kbits) 的数据,您的发送进程将等待来自接收器的窗口更新,表明已经消耗了一些数据,然后再将更多数据放到网络上。

打开多个 TCP 会话可以解决这个问题,因为每个 TCP 会话都有自己的发送/接收缓冲区。

当然,由于 TCP 窗口大小、争用等原因,在 Internet 上很难确定真正可用的端到端带宽。如果您能够提供一些示例数据,我们或许可以提供更多帮助。

您应该考虑的另一个选项是在创建套接字时设置更大的接收窗口,或者使用操作系统设置全局设置,或者使用套接字选项在每个套接字的基础上设置。

于 2008-11-03T21:00:58.587 回答
7

如果您是链接上唯一的人,则会增加开销并降低速度。然而,当与其他人共享一个完全饱和的链接时,这是一种游戏系统并提高整体速度的方式(每个连接将比单个连接慢,但聚合会更快,因为您现在拥有更大比例的分配给您的“时隙”(技术术语是什么?现在我忘记了)。

于 2008-11-03T19:02:48.590 回答
1

是的,但不一定容易实现。诸如 akamai 之类的 CDN 通过压缩比通常发送的更大的数据包来声称其部分性能,因为它们具有专用的可靠管道。在不了解您的应用程序的情况下很难提供更好的细节。

于 2008-11-03T18:48:28.247 回答
1

Muz 对这个问题的描述是正确的

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

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

于 2008-11-03T21:53:45.033 回答