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