在高延迟的环境下(假设没有针对每个连接进行流量整形等)使用多个并行TCP连接是否可以实现更好的数据传输速率?或者TCP能否通过单个连接利用整个带宽?
如果接收方不报告缓冲区拥塞(窗口大小为0),TCP是否以尽可能快的速度发送数据?因此,如果RTT例如为60秒,它不会影响速率吗?是否存在某些限制速率的最大窗口大小或其他因素?
在高延迟的环境下(假设没有针对每个连接进行流量整形等)使用多个并行TCP连接是否可以实现更好的数据传输速率?或者TCP能否通过单个连接利用整个带宽?
如果接收方不报告缓冲区拥塞(窗口大小为0),TCP是否以尽可能快的速度发送数据?因此,如果RTT例如为60秒,它不会影响速率吗?是否存在某些限制速率的最大窗口大小或其他因素?
简单总结一下: 在高延迟、高带宽的环境中,诸如TCP之类的可靠通信通常受到任何时候正在传输的数据量的限制。多个连接是解决此问题的一种方法,因为带宽延迟乘积对每个连接都适用。
更详细地说,考虑以下情况: 您的端到端带宽为每秒10^8比特(10兆比特/秒),往返延迟为100毫秒(0.1秒)。
因此,在第一位数据的确认返回发送方之前,可以发送多达10^7比特(10兆比特=约1.25兆字节)的数据。
这将取决于您的操作系统的TCP栈,但是TCP接收窗口大小的一个不罕见的值是64K字节。这显然太小了,无法充分利用端到端带宽; 一旦发送了64kbytes(512kbits)的数据,则发送进程将等待接收方的窗口更新,表示已消耗某些数据,然后再将更多数据放入传输线上。
通过同时打开多个TCP会话来解决此问题,因为每个TCP会话都有自己的发送/接收缓冲区。
当然,在互联网上很难确定真正可用的端到端带宽,因为涉及TCP窗口大小、争用等因素。如果您能提供一些示例数字,我们可能能够提供更多帮助。
您应该考虑的另一个选项是在创建套接字时设置较大的接收窗口,可以使用全局操作系统设置或套接字选项逐个进行。
是的,但并不一定容易实现。像Akamai这样的CDN通过压缩比通常发送的更大的数据包来提高性能,因为它们有专用的可靠管道。如果不了解您的应用程序,很难给出更好的细节。
Muz对问题的描述非常准确。
请记住,利用它可能取决于您操作系统中TCP的实现。特别是,为了获得最佳结果,您需要一个支持RFC 1323中窗口缩放选项的TCP堆栈。
此外,您可能需要调整一些操作系统设置才能使其正常工作。在Windows上,有一个名为TcpWindowSize的注册表设置,您可能需要进行调整。有一篇微软知识库文章224829:Windows 2000和Windows Server 2003 TCP功能说明描述了如何进行调整。