betway官网手机版HTTP断点续传原理。HTTP断点续传(分块传输)(HTTP头格式非常懂得)

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

相关文章

admin

网站地图xml地图