首页 > 代码库 > http断点续传原理

http断点续传原理

断点续传一是断点,一续传。

断点是在下载时,将下载文件分多片,同时进行多片一起下载,如果任务被暂停,暂停的位置就是断点。

续传就是未完成的下载再次开始时,会从上次的断点继续传送。

在下载(或上传)过程中,如果网络故障、电量不足等原因导致下载中断,这就需要使用到断点续传功能。

下次启动时,可以从记录位置(已经下载的部分)开始,继续下载以后未下载的部分,避免重复部分的下载。断点续传实质就是能记录上一次已下载完成的位置。

断点续传需要在下载过程中记录每条线程的下载进度;
每次下载开始之前先读取数据库,查询是否有未完成的记录,有就继续下载,没有则创建新记录插入数据库;
在每次向文件中写入数据之后,在数据库中更新下载进度;
下载完成之后删除数据库中下载记录。
 
断点续传在HTTP请求上和一般的下载有所不同,客户端浏览器传给Web服务器的时候要多加一条信息——从哪里开始(HTTP请求变量)。要实现HTTP断点续传,Web服务器必须支持HTTP/1.1(相对于HTTP/1.0老版本)。
  HTTP请求是有一个Header的,里面有个Range属性是定义下载区域的,它接收的值是一个区间范围,比如:Range:bytes=0-10000。这样我们就可以按照一定的规则,将一个大文件拆分为若干很小的部分,然后分批次的下载,每个小块下载完成之后,再合并到文件中;这样即使下载中断了,重新下载时,也可以通过文件的字节长度来判断下载的起始点,然后重启断点续传的过程,直到最后完成下载过程。
 
参考:http://blog.csdn.net/hou_jiong/article/details/4406155
http://blog.163.com/playkid/blog/static/562872602013326115648172/
 

断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给Web服务器的时候要多加一条信息--从哪里开始。 

    下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。

    GET /down.zip HTTP/1.0 

    User-Agent: Netfront3

    RANGE: bytes=2000070- 

    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 

    多了一行RANGE: bytes=2000070-;

    这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。

 

    服务器收到这个请求以后,返回的信息如下: 

    206 

    Content-Length=106786028 

    Content-Range=bytes 2000070-106786027/106786028 

    Date=Mon, 30 Apr 2001 12:55:20 GMT 

    ETag=W/"02ca57e173c11:95b" 

    Content-Type=application/octet-stream 

    Server=Microsoft-IIS/5.0 

    Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 

    增加了一行: 

    Content-Range=bytes 2000070-106786027/106786028