首页 > 技术杂记 > Http/Ftp多线程下载、断点续传

Http/Ftp多线程下载、断点续传

2010年12月18日 发表评论 阅读评论

写在最前面,本文面向的读者群体是对Http/Ftp协议有一定了解的,如果对Http/Ftp协议不熟的朋友,读先阅读相关RFC文档,下面是Http和Ftp的官方RFC文档地址:
1. Http RFC2616: http://www.faqs.org/rfcs/rfc2616.html
2. Ftp RFC959: http://www.faqs.org/rfcs/rfc959.html
上述文档是e文的,如果e文基础不好的朋友,可以给我留言,索求中文版的文档进行学习。

我们平时用到的下载器,比如迅雷,QQ旋风,网际快车等,都支持Http/Ftp的下载,用过这类下载器的朋友,应该对多线程下载,断点续传这两个概念不会感到陌生。多线程下载,目的是为了加快整体的下载速度;断点续传,目的了为了避免由于网络不稳定等因素造成的重复下载。“见过猪跑的未必吃过猪肉”,用过下载器的未必了解下载器的工作原理,下面我将来帮大家揭开常见下载器中最为重要的多线程下载和断点续传的神秘面纱。

1. 多线程下载
多线程下载的基本思想就是把要下载的文件按下载线程的个数N,划分为N块,每个线程负责下载一块。具体如何下载文件的块,不同的协议有点差别:
(1)Http多线程下载
Http协议支持Range关键字,可以用Range来指定要下载的范围,如下所示(假设要下载的文件总大小为1500bytes,用三个线程下,每个线程下载500bytes):
a. 首500字节(字节位移0-499): Range: bytes=0-499
b. 次500字节(字节位移500-999):Range: bytes=500-999
c. 后500字节(字节位移1000-1499):Range: bytes=1000-1499,或者Range: bytes=1000-
需要注意,Http请求头中加了Range字段后,请求成功的状态码206(部分内容),不再是200。
(2)Ftp多线程下载
Ftp协议支持REST和RETR指令,可以用这两个指令来指定要下载起始位置,如下所示(假设要下载的文件总大小为1500bytes,用三个线程下,每个线程下载500bytes, 文件名为file):
a. 首500字节: 首先用REST 0设置从第0个字节开始下载,然后用 RETR file指定要下载的文件,启动数据接收,开始下载。
b. 次500字节和最后500字节的做法和上面一样,唯一的区别在于REST指定的起始位置不一样,次500字节为REST 500,最后500字节为REST 1000。
需要注意,Ftp不能像Http那样,指定要下载的范围,只能指定要下载的起位置。因此,应用需要自己把握下载了多少个字节,比如说,要下载中间500个字节,用REST设置完起始位置,开始下载后,如果应用判断到接收的数据已大于等于500个字节,就需要停止下载。

2. 断点续传
断点续传的基本思想就是记住上次连接断开时已经下载的字节数N,然后本次下载的时候,从第N+1个字节开始下载,如果读者朋友对第一部分中讲的多线程下载已经理解的话,那么如果进行断点续传便是水到渠成的事情,下面我只做简单的说明,假设已经下载的字节为N:
(1)Http: Range: bytes=N- (注意字节位移是从0开始的,因此第N+1个字节的位移是N)
(2)Ftp: a. REST N, b.RETR file

  1. leungma
    2010年12月19日11:06 | #1

    PS:断点续传:所以很多下载软件创建文件的时候,一起创建两个,一个是要下载的文件,另外一个记录下载进度以及其他下载情况的文件。

  2. 2010年12月19日12:06 | #2

    恩,这是具体应用实现时的细节。我这里写的主要是协议层所要关注的。@leungma

  3. 2010年12月21日14:28 | #3

    断点续了很不错的

  4. 2010年12月27日15:39 | #4

    对于线程这种东西,我弄的不是很懂。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.