HTTP 1.1默认支持断点续传。

简述

断点续传:指的是以上传/下充斥时,将任务(一个文件要压缩包)人为的划分为几独片,每一个组成部分以一个线程进行上传/下载,如果遇网络故障,可以自已经上传/下载的局部开始持续上传/下充斥不就的片段,而并未必要从头开始上传/下载。可以节省时间,提高速度。

 

  • 简述
  • 断点续传的用
  • Range
    Content-Range
  • 增长校验
    • Last-Modified
    • Etag
    • If-Range
    • 工作规律
  • 检测服务器是否支持断点续传

 

 

断点续传的用

偶然用户上传/下充斥文件需要历时数小时,万一致路中断,不拥有断点续传的
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
a 206 Partial
Content answer with the appropriate body. If the condition is not
fulfilled, the full resource is sent back, with
a 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

相关文章