~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