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

HTTP 1.1默认援助断点续传。

简述

断点续传:指的是在上传/下载时,将职责(一个文书或压缩包)人为的划分为多少个部分,每一个有的使用一个线程举办上传/下载,若是遇到互联网故障,可以从曾经上传/下载的有的开首一连上传/下载未形成的局部,而没有须求从头起首上传/下载。能够节省时间,升高速度。

 

 

 

断点续传的用处

突发性用户上传/下载文件须求历时数时辰,万一线路中断,不具有断点续传的
HTTP/FTP 服务器或下载软件就不得不从头重传,相比较好的 HTTP/FTP
服务器或下载软件具备断点续传能力,允许用户从上传/下载断线的地点继续传送,那样大大减弱了用户的困扰。

大面积的帮衬断点续传的上传/下载软件:QQ
旋风、迅雷、快车、电驴、酷6、土豆、优酷、百度摄像、网易视频、腾讯视频、百度云等。

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

关联header如下:

Range & Content-Range

HTTP1.1
协议(RFC2616)开端扶助获取文件的局部情节,那为并行下载以及断点续传提供了技术援助。它通过在
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(使用断点续传格局)

 

提大学验

在其实情状中,会现出一种情形,即在极端发起续传请求时,URL
对应的公文内容在劳动器端已经暴发变化,此时续传的多少肯定是谬误的。怎样缓解这些难点了?分明此时亟需有一个标识文件唯一性的方法。

在 RFC2616 中也有对应的概念,比如已毕 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字节范围的始末

检测服务器是或不是支持断点续传

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

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

相关文章