常用协理断点续传的 FTP 客商端软件是 lftp,~N 下载第0-N字节范围的剧情

HTTP 1.1暗中同意扶助断点续传。

简述

断点续传:指的是在上传/下载时,将职务(二个文本或压缩包)人为的分割为多少个部分,每三个局地采纳三个线程进行上传/下载,借使遇上网络故障,能够从曾经上传/下载的一些早前继续上传/下载未成功的部分,而从未要求从头发轫上传/下载。能够节省时间,升高速度。

 

 

 

断点续传的用处

偶尔顾客上传/下载文件需求历时数钟头,万一路径中断,不负有断点续传的
HTTP/FTP 服务器或下载软件就只可以从头重传,相比较好的 HTTP/FTP
服务器或下载软件具备断点续传工夫,允许顾客从上传/下载断线之处继续传送,那样大大减少了顾客的烦躁。

大面积的支撑断点续传的上传/下载软件:QQ
旋风、迅雷、快车、电驴、酷6、马铃薯、优酷、百度摄像、天涯论坛录像、Tencent录制、百度云等。

在 Linux/Unix 系统下,常用辅助断点续传的 FTP 顾客端软件是 lftp。

关联header如下:

Range & Content-Range

HTTP1.1
公约(安德拉FC2616)开端扶助获取文件的部分剧情,那为并行下载以致断点续传提供了本领协助。它通过在
Header 里八个参数达成的,顾客端发央求时对应的是 Range
,服务器端响适合时宜对应的是 Content-Range。

Range

用于央浼头中,钦赐第一个字节的职位和尾声三个字节的地点,平日格式:

Range:(unit=first byte pos)-[last byte pos]

Range 底部的格式有以下两种情景:

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(使用断点续传格局)

 

拉长校验

在其实情状中,会自然则然生机勃勃种情景,即在顶峰发起续传央浼时,U途乐L
对应的文件内容在劳务器端已经发生变化,那个时候续传的数码一定是不当的。怎么样消除那一个标题了?明显这时候亟待有二个标志文件唯意气风发性的办法。

在 TiggoFC2616 中也许有相应的定义,举个例子实现 Last-Modified
来标记文件的尾声纠正时间,那样就可以剖断出续传文书时是还是不是已经产生过校勘。同期FC2616 中还定义有三个 ETag 的头,可以动用 ETag 头来放置文件的天下无双标记。

Range:用于顾客端到服务端的乞求,能够经过改字段钦点下载文件的某大器晚成段大小及其单位,字节偏移从0初阶。典型格式:

Last-Modified

If-Modified-Since,和 Last-Modified 相符都是用以记录页面最终更正时间的
HTTP 头音信,只是 Last-Modified 是由服务器往顾客端发送的 HTTP 头,而
If-Modified-Since
则是由顾客端往服务器发送的头,能够看出,再一次恳请本地存在的 cache
页面时,客商端会通过 If-Modified-Since 头将此前服务器端发过来的
Last-Modified
最终改善时间戳发送回去,那是为了让服务器端举行验证,通过这些时刻戳剖断顾客端的页面是还是不是是最新的,假使不是流行的,则赶回新的内容,假若是风靡的,则赶回
304 告诉客商端其本地 cache
的页面是新型的,于是客商端就足以直接从本土加载页面了,那样在网络上传输的数据就能够大大减少,同临时间也缓解了服务器的承担。

    Ranges:    (unit=first byte pos)-[last byte pos]

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
须要放在 “” 内。

    Ranges:    bytes=4000- 下载从第4000字节开端到文件结束部分

If-Range

用以判别实体是不是爆发转移,假若实体未更动,服务器发送顾客端错过的有个别,不然发送全数实体。日常格式:

If-Range: Etag | HTTP-Date

也正是说,If-Range 能够接收 Etag 恐怕 Last-Modified 重临的值。当没有ETage 却有 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。

    Ranges:    bytes=0~N 下载第0-N字节范围的剧情

办事规律

Etag 由劳动器端生成,顾客端通过 If-Range
条件判别必要来注明能源是还是不是校正。央浼八个文书的流水生产线如下:

第一回倡议:

  1. 客商端发起 HTTP GET 央求四个文书。
  2. 服务器管理要求,再次回到文件内容以致相应的 Header,当中包蕴Etag(举个例子:627-4d648041f6b80)(倘使服务器辅助 Etag 生成并已开启了
    Etag)状态码为 200。

其次次倡议(断点续传):

  1. 客商端发起 HTTP GET 诉求一个文书,同一时间发送
    If-Range(该头的剧情便是第一遍号令时服务器再次回到的
    Etag:627-4d648041f6b80)。
  2. 服务器判别选拔到的 Etag 和总计出来的 Etag
    是还是不是合营,即便同盟,那么响应的景观码为 206;不然,状态码为 200。

    Ranges:    bytes=M-N 下载第M-N字节范围的剧情

检查实验服务器是还是不是协理断点续传

CU奥迪Q5L 完毕检查测量检验:

[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
,表明服务器帮助按字节下载。

http://blog.csdn.net/liang19890820/article/details/53215087

    Ranges:    bytes=-N 下载最终N字节内容

 

If-Range:用于顾客端到服务端的倡议,用于剖断实体是还是不是产生变动,必得与Range协作使用。若实体未被涂改,则响应所贫乏的那有些;不然,响应整个新的实体。

The If-Range HTTP request header makes a range request conditional:
if the condition is fulfilled, the range request will be issued and the
server sends back
206 Partial
Content answer with the appropriate body. If the condition is not
fulfilled, the full resource is sent back, with
200 OK status.

 

Accept-Ranges:用于server到client的回答,client通过该自段剖断server是或不是帮忙断点续传。

    Accept-Ranges:bytes    表示协助以bytes为单位展开传输。

    Accept-Ranges:none     表示不帮忙断点续传

 

Content-Ranges:用于sever到client的回复,与Accept-Ranges在同三个报文内,通过该字段钦命了归来的文件资源的字节范围。格式如下:

    Content-Ranges:bytes M-N/size 大小为size的文件的第M-N字节范围的内容

 

关于ETag

ETag用于标记/保险文件的唯生机勃勃性、完整性,每一趟文件有改革该值就能够变动。

 

关于HTTP 206

断点续传,借使回到文件的生机勃勃有个别,则选用HTTP
206状态码;假使回去整个文件,则运用HTTP 200响应码。

HTTP/1.1 200 OK(不行使断点续传)

HTTP/1.1 206 Partial Content(使用断点续传)

 

HTTP/1.1 206 Partial Content

Server: nginx/1.4.2

Date: Fri, 20 Oct 2017 03:28:44 GMT

Content-Type: application/octet-stream

Content-Length: 11

Last-Modified: Tue, 25 Aug 2015 08:56:26 GMT

Connection: keep-alive

ETag: “55dc2dba-14dd5b”

Content-Range: bytes 0-10/1367387

 

断点续传检查:

curl -i –range 0-9 url   
响应中包含Accept-Range或许Content-Ranges则代表援救。

 

参考:

If-Range:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Range

相关文章