为什么有时候下载东西一开始很快,后来就越来越慢?

呈递减趋势,这是什么原因呢? 比如我在下载安卓开发不同版本的SDK时就出现这种情况,还有平时下载东西的时候也遇到过
关注者
1,453
被浏览
876,608

41 个回答

基本上是多线程分段式下载的结果。

现在很多下载算法都有一个默认分段下载,比如超过100M大小就分段,最多分10段,每个分段至少20M


这样一个400M的文件可能一开始被分成10段下载,每段40M,同时开10个tcp链接下载。


tcp下载速度和几个因素有关:时延,接收端窗口大小,丢包率。(参考: TCP传输性能剖析 - 推酷 tuicool.com/articles/re ), TCP Throughput Calculator A Very Simple Model for TCP Throughput | Blog | ThousandEyes | Network Monitoring Software ,其中最后一个的公式是“大众”参考公式(即简化版), T=\frac{MSS*C}{ RTT*\sqrt{p}} ,其中T是TCP吞吐量,MSS是窗口,RTT是双向时延,p是丢包率,C是一个常数,一般取 \sqrt{\frac{3}{2}} )。


当网络状况一样,窗口大小一样时,每个tcp线程最高速度确定。所以分段多线程下载要比单线程下载快很多。尤其是带宽很大时。


但是不同的线程下载速度并不是完全相等的。有的快有的慢(因为tcp总是尝试提高速度塞了再降),另外还有就是分段的最后一段可能不够长(比如一个360M的文件最后一个分段才10M其他段是40M)。快的线程结束后,会去看看其他线程剩下的部分是不是够20M,如果超过20M,可以再分成两段,原来那段继续下,新加入的一段则是提速的。这时,总速度还是10个线程的速度。


但是,总有剩下部分不够20M的时候。这时候下载程序就会降低线程数(已经完成任务的部分就退出)。所以会看到速度越来越慢,最后的速度就是一个单线程的速度。


所以将近结束时,会越来越慢。如果仔细观察,一般能观察到线性下降的过程。


当然,这个机制前提是服务器支持多线程下载。如果服务器不支持就不存在了。


看到有答案说到P2P了。也是类似的机制,分段,多线程。但是,每个段还是有下限。P2P的一个特殊点就是还要提供上传。如果本地已经给其他人提供了上传数据,那么需要等上传的“段”结束以后才能结束一个下载任务。