是否有可能在高延迟环境中使用多个并行TCP连接实现更好的数据传输速率(假设没有每个连接的流量整形或类似的东西,具有较大地理距离的公共互联网)或TCP可以利用单个整体带宽连接?
如果接收方没有报告0窗口大小的缓冲区拥塞,TCP是否能够尽可能快地发送数据?因此,如果RTT例如60秒,它根本不影响速率?是否有一些最大窗口大小或其他限制速率?
答案 0 :(得分:18)
多个并发连接可能给你的一个好处(受到dove和Brian提到的相同警告),你将能够更好地克服TCP接收窗口太小的问题。 / p>
与此相关的原则是bandwidth delay product。 (有更详细的解释here)。
简要总结:在高延迟,高带宽环境中,TCP等可靠通信通常受限于任何给定时间的飞行数据量。多个连接是解决此问题的一种方法,因为带宽延迟产品单独应用于每个连接。
更详细地说,请考虑以下事项:端到端带宽为每秒10 ^ 8位(10兆位/秒),往返延迟为100毫秒(0.1秒)。因此,在确认第一位数据已经发送回发送方之前,最多可以发送10 ^ 7位(10兆位= ~1.25兆字节)的数据。
这取决于您的操作系统的TCP堆栈,但TCP接收窗口大小的一个非常见的值是64K字节。这显然太小,无法让您充分利用端到端带宽;一旦发送了64k字节(512kbits)的数据,您的发送过程将等待接收器的窗口更新,指示在将更多数据添加到线路上之前已经消耗了一些数据。
由于每个TCP会话都有自己的发送/接收缓冲区,因此打开多个TCP会话可以解决这个问题。
当然,由于TCP窗口大小,争用等原因,在互联网上很难确定真正可用的端到端带宽。如果您能够提供一些示例数据,我们可能会提供帮助更多。
您应该研究的另一个选项是在创建套接字时设置更大的接收窗口,全局使用OS设置,或者使用套接字选项在每个套接字上设置。
答案 1 :(得分:7)
如果您是链接中唯一的一个,则会增加开销并降低速度。但是,当与其他人共享一个完全饱和的链接时,这是一种游戏系统并提高整体速度的方法(每个连接都会慢于单个连接,但是聚合速度会更快,因为你现在拥有更大的百分比分配给你的“时间段”(技术术语是什么?现在让我逃脱)。
答案 2 :(得分:1)
是的,但不一定容易实施。像akamai这样的CDN通过压缩比通常发送的更大的数据包来声称其部分性能,因为它们具有专用的可靠管道。如果不了解更多应用程序,很难提供更好的细节。
答案 3 :(得分:1)
Muz's description of the issue现场点亮。
请记住,利用它可能取决于操作系统中TCP的实现。特别是,为了获得最佳结果,您需要一个支持RFC 1323的Window Scale选项的TCP堆栈。
此外,您可能需要调整一些操作系统设置才能使其正常工作。在Windows上,您可能需要调整名为TcpWindowSize的注册表设置。 Microsoft KB文章224829: Description of Windows 2000 and Windows Server 2003 TCP Features描述了如何执行此操作。