HTTP断点续传,HTTP断点续传原理

by admin on 2019年7月30日

HTTP 1.1默许帮助断点续传。

亚洲必赢手机入口,简述

断点续传:指的是在上传/下载时,将职分(叁个文书或压缩包)人为的剪切为多少个部分,每一个局地应用二个线程进行上传/下载,假如遇上网络故障,能够从已经上传/下载的一些开首三翻五次上传/下载未产生的部分,而从不须要从头初步上传/下载。能够节省时间,进步速度。

 

 

 

断点续传的用途

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

广大的支撑断点续传的上传/下载软件:QQ
旋风、迅雷、快车、电驴、酷6、马铃薯、优酷、百度摄像、搜狐录像、Tencent录像、百度云等。

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

关联header如下:

Range & Content-Range

HTTP1.1
协议(传祺FC2616)开端帮忙获取文件的局地剧情,那为并行下载以及断点续传提供了技术帮忙。它通过在
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(使用断点续传情势)

 

进步校验

在实际上处境中,会冒出一种意况,即在终极发起续传诉求时,U昂CoraL
对应的公文内容在服务器端已经产生变化,此时续传的多少一定是破绽百出的。怎么着缓和那些难题了?明显此时要求有一个标志文件独一性的秘诀。

在 昂科威FC2616 中也可能有照料的概念,比方完成 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=五千- 下载从第陆仟字节开首到文件甘休部分

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字节范围的源委

检验服务器是还是不是辅助断点续传

CU酷路泽L 实现检查评定:

[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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图