并行文件下载

Parallel file download

这是一个基本问题,但我希望有更多网络经验的人提供更全面的答案。

假设我在外部服务器上有 3 个文件,每个文件大小为 1GB。要下载它们,我会这样做:

$ wget https://server.com/file1.mov

关于并行执行三个项目(例如,在三个单独的 tabs/shells/threads 中),或者串联执行 then,例如:

$  wget https://server.com/file1.mov \
&& wget https://server.com/file2.mov \
&& wget https://server.com/file3.mov \

在以下情况下:

  1. 我的本地下载连接速度非常快,而服务器速度要慢得多(例如,假设服务器需要 15 秒才能生成每个文件)。
  2. 我的本地下载连接速度很慢,服务器的上传带宽要快得多。
  3. 两者比较相似

对于第一种情况,很明显我们想要使用并行下载,如果在外部服务器上有固定的开销成本的话,但是对于其他两种情况呢,为什么一个比另一个好?

根据您的 TCP 窗口函数/方法,始终使用并行下载会更快。

如果某些中间节点(接入点/交换机/路由器/防火墙/代理)饱和。它必须丢弃一些数据包。

他们做到这一点的最简单方法是尾巴掉落。但是防火墙和路由器也可以有更复杂的流量整形器,例如

如果您尝试并行下载,并且带宽在其他流量之间共享,您会生成更多数据包或更多连接(针对每个连接流量整形), 这样你就可以获得一些速度

对于所有三种情况,实际结果取决于许多限制因素。 您列出了下载和上传带宽,但瓶颈也可能存在于磁盘 I/O、CPU 和 RAM 以及数据传输协议和其他数量。

一般来说,分段文件传输是获取数据的首选方式,因为它减少了 TCP 拥塞控制(假设我们使用 TCP 协议)和异构环境的影响。 正如这篇“跨广域网高带宽数据传输的应用技术”(Jason Lee、Dan Gunter、Brian Tierney)论文所述:

“TCP probes the available bandwidth of the connection by continuously increasing the window size until a packet is lost, at which point it cuts the window in half and starts “ramping up” the connection again. The higher the bandwidth-delay product, the longer this ramp up will take, and less of the available bandwidth will be used during its duration.”

“In order to improve this situation where the network becomes the bottleneck, parallel streams can be used. This technique is implemented by dividing the data to be transferred into N portions and transferring each portion with a separate TCP connection. The effect of N parallel streams is to reduce the bandwidth-delay product experienced by a single stream by a factor of N because they all share the single-stream bandwidth (u). Random packet losses for reasonable values of q (<0.001) will usually occur in one stream at a time, therefore their effect on the aggregate throughput will be reduced by a factor of N. When competing with connections over a congested link, each of the parallel streams will be less likely to be selected for having their packets dropped, and therefore the aggregate amount of potential bandwidth which must go through premature congestion avoidance or slow start is reduced.”

值得一提的是,拥塞算法在带宽分配中起着重要作用,但仍需要根据网络“class”进行设置。宽带、卫星、3G、WiFi - 它们都具有由物理环境决定的特性,并且 CWND 实现的表现不同。

另一件需要考虑的事情是拥挤网络中并行与并发数据传输的行为。从理论上讲,您传输的数据越多,阻塞网络和激活 ISP 端策略的机会就越大,这些策略将开始丢弃或调整连接。然而,即使在这种情况下,使用多个小型并行链路交换数据的可能性也比使用一个大连接更高。

同样,这是一个非常笼统的解释,连接吞吐量可能会因多种因素而有很大差异。也有可能发现自己处于这样一种情况:单个连接的性能与多线程相当,同时不需要额外的努力和代码来实现。

tl;dr : TCP congestion control

说明

真正的答案是几乎无关紧要!

创建 TCP 会话后,TCP 将处理您的带宽并尝试使用拥塞控制机制达到最大速度:

Transmission Control Protocol (TCP) uses a network congestion-avoidance algorithm that includes various aspects of an additive increase/multiplicative decrease (AIMD) scheme, along with other schemes including slow start and congestion window, to achieve congestion avoidance.

拥塞避免既可以是线路上两个数据包之间的“真正”拥塞,也可以是数据包丢失,因为您的 CPU/NIC/something 否则无法处理数据包带宽。

为什么几乎没关系?

这是因为在某些情况下,我们可能会因为两个并行会话而出现拥塞。

这是一个愚蠢的例子,可以解释为什么它很重要:

Computer with bandwidth of 8bit/s NIC ability trying to create a parallel session. Once he will send "SYN" in parallel there will be a congestion. Since 8bit is the minimum bits this specific computer can send in a packet the congestion will not allow the computer to use the internet.