概念:
FTP(文件传输协议的简称) (File Transfer Protocol、FTP)客户端软件端点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度。
用途:
有时用户上传下载文件需要历时数小时,万一线路中断,不具备断点续传的FTP服务器或下载软件就只能从头重传,比较好的FTP服务器或下载软件具有FTP断点续传能力,允许用户从上传下载断线的地方继续传送,这样大大减少了用户的烦恼。
IE浏览器默认下载方式不支持断点续传。
常见的支持端点续传的上传、下载软件:QQ旋风、迅雷、快车(迷你快车)、web迅雷、影音传送带、快车、BitComet、电驴eMule、哇嘎Vagaa、RF[RaySourse/RayFile]、酷6、土豆、优酷、百度视频、新浪视频、腾讯视频、百度云等都支持断点续传。
在 *nix(Linux/Unix)系统下,常用支持断点续传的FTP客户端软件是lftp。
特点
断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。
断点续传下载软件具有以下特点:
1、断点续传功能,既可节约时间又可以节约金钱。
2、定时下载功能,可以为将要下载的软件制定一任务列表,让下载软件在规定的时间自动拨号上网并下载软件,下载完毕后再自动挂起Modem,断开与internet的连接,甚至自动关闭计算机。
3、多文件同时下载。
4、支持拖放式操作,可将下载文件的URL超链接用鼠标拖放到下载软件的窗口上,即可激活下载软件,同时开始文件的下载。
5、自动捕捉剪贴板上的URL并激活下载软件,可以捕捉到剪贴板中的URL,甚至浏览器中单击下载文件超链接,即可激活程序实现文件的下载。
6、致命错误发生时的关闭机制。
7、预防病毒侵害的安全机制,文件下载完毕,即可自动将其发送到指定的病毒的检测软件进行病毒扫描。
断点续传下载软件包括Thunder、NetAnts、FlashGet、Net Vampire、Download Manager、GetRight、Go!Zilla、WinDownload、Internet Download Manager等。
Http怎么支持断点续传的?
Http1.1协议中默认支持获取文件的部分内容,这其中主要是通过头部的两个参数:Range、Content Range来实现的。客户端发请求时对应的是Range,服务端响应时对应的是Content-Range。
Range
客户端想要获取文件的部分内容,那么它就是请求头部中的Range参数中指定获取内容的起始字节的位置和终止字节的位置,它的一般格式为:
Range:(unit=first byte pos)-[last byte pos]
例如:
Range: bytes=0-499 表示第 0-499 字节范围的内容
Range: bytes=500-999 表示第 500-999 字节范围的内容
Range: bytes=-500 表示最后 500 字节的内容
Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容
Range: bytes=0-0,-1 表示第一个和最后一个字节
Range: bytes=500-600,601-999 同时指定几个范围
Content-Range
用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小。一般格式:
Content-Range:bytes(unit first byte pos)-[last byte pos]/[entity legth]
例如:
Content-Range:bytes 0-499/22400
0-499是指当前发送的数据的范围,而22400则是文件的总大小。
而在响应完成后,返回的响应头内容也不同:
HTTP/1.1 200 Ok(不使用断点续传的方式)
HTTP/1.1 206 Partial Content(使用断点续传方式)
增强校验
在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据是肯定错误的。如何解决这个问题了?显然此时需要一个表示文件唯一性的方法。
在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时FC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识。
Last-Modified
If-Modified-Since,和Last-Modified一样都是用于记录页面最后修改时间的HTTP头信息,只是Last-Modified是由服务器往客户端发送的HTTP头,而If-Modified-Since则是由客户端往服务器发送的头,可以看到,再次请求本地存在的cache页面时,客户端会通过If-Modified-Since头将先前服务器发过来的Last-Modified最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是由是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回304告诉客户端其本地cache的页面时最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
Etag
Etag(Entity Tags)主要为了解决Last-Modified无法解决的一些问题。
1.一些文件也许会周期性的更改,但是内容并不改变(仅改变修改时间),这时候我们并不希望客户端人为这个文件被修改了,而重新GET。
2.某些文件修改非常频繁,例如:在秒以下的时间内进行修改(1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)
3.某些服务器不能精确地得到文件的最后修改时间
为此,HTTP/1.1引入了Etag。Etag仅仅是一个和文件相关的标记,可以是一个版本标记。例如:v1.0.0;或者说“627-4d648041f6b80”这么一串看起来很神秘的编码。但是HTTP/1.1标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在" "内。
If-Range
用于判断实体是否发生改变,如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。一般格式:
If-Range:Etag |HTTP-Date
也就是说,If-Range可以使用Etag或者 Last-Modified返回的值。当没有Etag却有Last-modified时,可以把Last-modified作为If-Range字段的值。
例如:
If-Range: “627-4d648041f6b80”
If-Range: Fri, 22 Feb 2013 03:45:02 GMT
If-Range 必须与 Range 配套使用。如果请求报文中没有 Range,那么 If-Range 就会被忽略。如果服务器不支持 If-Range,那么 Range 也会被忽略。
如果请求报文中的 Etag 与服务器目标内容的 Etag 相等,即没有发生变化,那么应答报文的状态码为 206。如果服务器目标内容发生了变化,那么应答报文的状态码为 200。
用于校验的其他 HTTP 头信息:If-Match/If-None-Match、If-Modified-Since/If-Unmodified-Since。
工作原理
Etag由服务器端生成,客户端通过If-Range条件判断请求来验证资源是否修改。请求一个文件的流程如下:
第一次请求:
客户端发起 HTTP GET 请求一个文件。
服务器处理请求,返回文件内容以及相应的 Header,其中包括 Etag(例如:627-4d648041f6b80)(假设服务器支持 Etag 生成并已开启了 Etag)状态码为 200。
第二次请求(断点续传):
1.客户端发起 HTTP GET 请求一个文件,同时发送 If-Range(该头的内容就是第一次请求时服务器返回的 Etag:627-4d648041f6b80)。
2.服务器判断接收到的 Etag 和计算出来的 Etag 是否匹配,如果匹配,那么响应的状态码为 206;否则,状态码为 200。
检测服务器是否支持断点续传
CURL 实现检测:
[root@localhost ~]# curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif
HTTP/1.1 206 Partial Content
Date: Mon, 21 Nov 2016 05:26:29 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=0CD0E23B4D4F739954DFEDB92BE6CE03:FG=1; expires=Tue, 21-Nov-17 05:26:29 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
ETag: "627-4d648041f6b80"
Accept-Ranges: bytes
Content-Length: 10
Cache-Control: max-age=315360000
Expires: Thu, 19 Nov 2026 05:26:29 GMT
Content-Range: bytes 0-9/1575
Connection: Keep-Alive
Content-Type: image/gif
GIF89a[root@localhost ~]#
能够找到 Content-Range,则表明服务器支持断点续传。有些服务器还会返回 Accept-Ranges,输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。