http 之 range

什么是 range

HTTP 的 Content-Range 支持对于一般的网页处理没啥重要的作用,但是对于大文件的下载,CDN回源,点续传功能的作用是非常重要的。

Content-Range允许一次只下载一个文件的一部分,后面再分批次下载文件的其他部分,或者并发下载,提高下载速度,这样如果在下载一个文件的过程中,网络断开了,恢复后不需要重新下载。

http 响应头如果有Accept-Ranges: bytes - 该响应头表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).我们还能知道:服务器支持断点续传,以及支持同时下载文件的多个部分,也就是说下载工具可以利用范围请求加速下载该文件.Accept-Ranges: none 响应头表示服务器不支持范围请求.

如何发起 range 请求

正常的文件,可以看到他的大小是34808

➜  ssh curl -I https://file201503.b0.upaiyun.com/linux.png
HTTP/2 200
server: marco/0.26
date: Wed, 22 Mar 2017 12:47:06 GMT
content-type: image/png
content-length: 34808
x-request-id: 409ac175280ee44091166096c88797d8; 2065b5286cc64a1873c2e2d7d988e20c
x-source: U/200
etag: "bbeb60d2732d5b37b4101b39eab78ba1"
last-modified: Sun, 12 Jun 2016 08:44:25 GMT
expires: Thu, 23 Mar 2017 09:22:17 GMT
cache-control: max-age=691200
accept-ranges: bytes
age: 617090
x-cache: HIT from 403-zj-fud-209, MISS from mix-hz-fdi-168, MISS from ctn-zj-lna3-016
via: T.5207.H.1, V.403-zj-fud-209, S.mix-hz-fdi-166, T.101170.M.1, V.mix-hz-fdi-168, T.3523.M.1, M.ctn-zj-lna3-016

我们通过

# curl  --header "Range: bytes=0-20000" https://file201503.b0.upaiyun.com/linux.png -o a1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20001  100 20001    0     0  53049      0 --:--:-- --:--:-- --:--:-- 82991

请求0-20000字节的数据保存为a1

# curl  --header "Range: bytes=20001-34808" https://file201503.b0.upaiyun.com/linux.png -o a2
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14807  100 14807    0     0    98k      0 --:--:-- --:--:-- --:--:--  283k

可以继续请求20001-34808的数据保存为 a2

然后合并文件

# cat a1 a2 >linux.png

1

这是通过加 header 进行操作,当然也可以加-r 参数

# curl  -r 0-20000 https://file201503.b0.upaiyun.com/linux.png -o a1     

服务器如何支持 range

nginx 为例 添加响应头

add_header Accept-Ranges bytes;