愚公移山与断点续传以及多线程下载

一。 愚公移山与可中断的事情

愚公移山的故事, 在中国是家喻户晓的事情了。

这个故事的特点是, 一件事情就是这个移动山的事情, 是一个非常大,非常繁重的工作, 没办法一次或者一下完成

需要分多次完成。  当然这个事情必须是可以分多次完成的事情, 才能有愚公移山的事情。 但是有些事情必须是一次性的完整完成的。 例如炮弹爆炸就是必须一次性, 没听说一点爆炸, 然后过一会在爆炸一点等等。人类,动物等的分娩也是一次的不能分割的。

愚公移山的事情, 恰巧可以分多次来完成, 第一次完成一点, 第二次完成一点, 第三次完成一点。。。。

同时愚公移山的事情, 也可以是多人多次来完成的。

这样就有一个好处就是, 今天完成一部分, 第二天, 有事情去做别的, 当第三天到了又有时间了, 可以继续再进行。

二。 文件下载与可中断

用http下载文件(就是我们普通的下载文件), 通常可以分为大文件和小文件两种情况。 对于小文件通常一次性下载, 是最方便的。

但是对于非常大文件, 例如几百兆,或者几个G的文件, 用浏览器下载通常是一次性下载的, 并且在网络状况不好的情况下, 在下载一部分后, 可能下载会中断, 若是中断了, 浏览器通常不会自动重新下载, 更不会从中断处继续下载。 这样等您发现后, 您通常会选择刷新(也就是重新下载, 是重头下载), 因此类似的事情仍然会发生的, 也就是很可能再次中断。

因此, 我们需要一个专门的工具, 能记住上次下载到哪里了, 并且可以检查多长时间没传输数据了, 当检查到长时间没有传输数据, 可以重新启动程序, 并且从中断的地方继续传输。

这个过程, 就像愚公移山,一个人,一点一点去做事情,做过的就不做了(山已经移走的部分, 就不需要在做了)。

因此需要1. 专有工具支持一点一点下载(做过的不做, 从中断的地方继续)。 2. 需要服务器(就是被移动的山)是支持中断点继续传输的。

请特别注意, 有些服务器特别限制断电续传的, 就是不支持的!!!

若是断点续传都不支持, 后面的多线程下载就更不支持了。

通常下载工具都支持断点续传,例如 迅雷, 网络蚂蚁, 网络快车等等

下面是 http如何支持断点续传的!

以前,用户不能使用现在这种高速的带宽访问互联网,当时,下载一个尺寸稍大的图片或文件就已经很吃力了。如果下载过程中遇到网络中断的情况,那就必须重头开始。


获取部分内容

在HTTP/1.1中,为了解决上述问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(RangeRequest)。

对一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。

执行范围请求时,会用到首部字段Range来指定资源的byte范围。
byte范围的指定形式如下。

  • 5000-10000
    Range:bytes=5001-10000
  • 从5001字节之后的全部
    Range:bytes=5001-
  • 从一开始到3000字节和5000-7000字节的多重范围
    Range:bytes=-3000,5000-7000

针对范围请求,响应会返回状态码为206PartialContent的响应报文。另外,对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器端无法响应范围请求,则会返回状态码200OK和完整的实体内容。

好了,这个主要是得靠客户端去记住上次获取到数据的那个Range值。

三。 多人多次工作, 最后合并

在前面愚公移山中, 可以多个人, 多次进行工作的, 类似的事情也可以在下载中进行的。 我们可以有个工具,下载一个大文件的前面30%的内容, 另外一个人下载31%~70%的部分,最后在有个人下载71%~100%的部分。最后3个人将自己下载的内容合并在一起构成一个文件。

这个办法可以加快下载的进程, 但是前提还是, 您要有个专有的工具, 以及服务器要支持。

下图是一个多线程下载过程的图片供参考

如上图, 红色的部分就是多人同时开始下载, 最后合并

 

总结:

1. 多次线程下载需要 断点续传的支持

2. 多线程下载和断点续传可以解决网络不稳定情况下, 不必要的重复工作

3. 通常情况下多线程下载会更好利用网络资源等

因此建议优先采用 多线程下载工具下载大型软件, 浏览器下载小文件