断点下载HTTP协议中有支持,一般的Web服务器都会支持,如 nginx。
HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。
应用场景
- 断点下载,下载大文件可以暂停。
- 多任务/多线程下载大文件(类似迅雷软件)
一、检查服务器是否支持断点续传
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | root@bogon:~HTTP/1.1 200 OK
 Server: nginx
 Date: Fri, 16 Aug 2019 02:00:07 GMT
 Content-Type: text/plain
 Content-Length: 6000
 Last-Modified: Tue, 13 Aug 2019 09:45:45 GMT
 Connection: keep-alive
 ETag: "5d5286c9-1770"
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: *
 Access-Control-Allow-Credentials: true
 Accept-Ranges: bytes
 
 | 
- 响应中 Accept-Ranges: bytes字段表示支持断点续传,并且单位是bytes。
- 响应中 Content-Length: 6000是文件的完整大小。
如果服务器响应未发送 Accept-Ranges ,那么它们有可能不支持断点续传。一些服务器会明确将其值设置为 “none”,以此来表明不支持。在这种情况下,某些应用的下载管理器会将暂停按钮禁用。
二、请求特定的范围
假如服务器支持 Range 请求的话,你可以在 Header 中 使用 Range 指示服务器应该返回文件的某部分。
单一范围
只需在 Headers 中加入 Range 字段,如
表示请求文件的前100个字节,服务器端会返回状态码为 HTTP/1.1 206 Partial Content 的响应
curl请求如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | root@bogon:~HTTP/1.1 206 Partial Content
 Server: nginx
 Date: Fri, 16 Aug 2019 02:10:05 GMT
 Content-Type: text/plain
 Content-Length: 100
 Last-Modified: Tue, 13 Aug 2019 09:45:45 GMT
 Connection: keep-alive
 ETag: "5d5286c9-1770"
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: *
 Access-Control-Allow-Credentials: true
 Content-Range: bytes 0-99/6000
 
 1ababadalgharaghtakamminarronnkonnbronntonnerronntbababadalgharaghtakamminarronnkonnbronntonnerronnt
 
 | 
多重范围
Range头部也支持一次请求文档的多个部分。请求范围用一个逗号分隔开。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | root@bogon:~HTTP/1.1 206 Partial Content
 Server: nginx
 Date: Fri, 16 Aug 2019 02:12:14 GMT
 Content-Type: multipart/byteranges; boundary=00000000029
 Content-Length: 278
 Last-Modified: Tue, 13 Aug 2019 09:45:45 GMT
 Connection: keep-alive
 ETag: "5d5286c9-1770"
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: *
 Access-Control-Allow-Credentials: true
 
 
 --00000000029
 Content-Type: text/plain
 Content-Range: bytes 0-50/6000
 
 1ababadalgharaghtakamminarronnkonnbronntonnerronntb
 --00000000029
 Content-Type: text/plain
 Content-Range: bytes 100-150/6000
 
 2ababadalgharaghtakamminarronnkonnbronntonnerronntb
 --00000000029--
 
 | 
Content-Type:multipart/byteranges 表示这个响应有多个 byterange 。每一部分 byterange 都有他自己的 Content-Type 头部和 Content-Range ,并且使用 boundary 参数对body进行划分。
条件式范围请求
当(中断之后)重新开始请求更多资源片段的时候,必须确保自从上一个片段被接收之后该资源没有进行过修改。
The If-Range 请求首部可以用来生成条件式范围请求:
假如条件满足的话,条件请求就会生效,服务器会返回状态码为 206 Partial 的响应,以及相应的消息主体。
假如条件未能得到满足,那么就会返回状态码为 200 OK 的响应,同时返回整个资源。
该Header字段值中既可以用 Last-Modified 时间值用作验证,也可以用 ETag 标记作为验证,但不能将两者同时使用。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | root@bogon:~HTTP/1.1 206 Partial Content
 Server: nginx
 Date: Fri, 16 Aug 2019 02:27:22 GMT
 Content-Type: text/plain
 Content-Length: 21
 Last-Modified: Tue, 13 Aug 2019 09:45:45 GMT
 Connection: keep-alive
 ETag: "5d5286c9-1770"
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: *
 Access-Control-Allow-Credentials: true
 Content-Range: bytes 100-120/6000
 
 2ababadalgharaghtakam
 
 |