range 头是在 http/1.1 协议中新增的一个请求头。包含 range 头的请求通常称为范围请求,因为 range 头允许服务器只发送部分响应到客户端,它是下载工具(例如迅雷)实现多线程下载的核心所在,而且在传送大的媒体文件或者实现文件下载中的断点续传功能时非常有用。
在使用范围请求时,我们首先需要确定服务器是否支持范围请求。假如在响应中存在 accept-ranges 这一头部字段,而且它的值也不为“none”,那么则表示该服务器支持范围请求。如下例所示:
http/1.1 200 ok
...
accept-ranges: bytes
content-length: 146515
上面的响应中, accept-ranges: bytes
表示使用 bytes 作为单位来为范围请求设定范围,content-length 则表示响应的完整大小。如果响应头中没有 accept-ranges 头,那么则说明服务器可能不支持范围请求。如下所示:
http/1.1 200 ok
...
accept-ranges: none
如果服务器支持范围请求的话,就可以在请求中添加 range 头来告诉服务器返回请求的哪一个或哪几个部分。range 头的通用语法如下所示:
range: bytes=start-end
bytes 用来表示请求的范围,单位为字节,start 和 end 用来表示这个范围的起始位置。例如:
range: bytes=20- :获取请求中第 20 个字节之后数据;
range: bytes= -50 :获取请求中最后 50 个字节的数据;
range: bytes=40-100 :获取请求中第 40 个字节到第 100 个字节之间的数据。
表示范围的两个数字中,如果缺少第一个数字,则表示这个范围从数据末尾开始计数;如果缺少第二个数字,则表示这个范围从给出的字节数到数据的末尾。
【示例】假如要从 c.biancheng.net 请求一张图片,但只返回前 1024 字节,客户端的请求如下所示:
get /templets/new/images/logo.png http/1.1
host: c.biancheng.net
connection: keep-alive
user-agent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/84.0.4147.125 safari/537.36
accept: image/webp,image/apng,image/*,*/*;q=0.8
referer: http://c.biancheng.net/golang/
range: bytes=0-1023
服务器收到请求后会返回 206 状态码,具体响应如下:
http/1.1 206 partial content
content-range: bytes 0-1023/146515
content-length: 1024
...
上面的响应中 content-length 头在这里用来表示之前请求中所定义的范围大小,而不是整张图片的大小。content-range 头则表示这一部分内容在整个资源中所处的位置。
range 头中还可以列出多个范围,之间以逗号进行分隔,如下所示:
get /golang/ http/1.1
host: c.biancheng.net
user-agent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/84.0.4147.125 safari/537.36
accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
referer: http://c.biancheng.net/sitemap/
range: bytes=0-50, 100-150
服务器响应如下所示:
http/1.1 206 partial content
content-type: multipart/byteranges; boundary=3d6b6a416f9b5
content-length: 282
--3d6b6a416f9b5
content-type: text/html
content-range: bytes 0-50/1270
example do<br/>--3d6b6a416f9b5<br/>content-type: text/html<br/>content-range: bytes 100-150/1270<br/><br/>eta http-equiv="content-type" content="text/html; c<br/>--3d6b6a416f9b5--</p><p><span >上面的响应中,</span><code >content-type:multipart/byteranges</code><span >表示这个响应有多个 byterange。每一部分 byterange 都有他自己的 centen-type 头和 content-range 头,并且使用 boundary 参数对响应体进行划分。</span><br/><br/><span >与范围请求相关的有三种状态码:</span><br/></p><ul ><li><p>若请求成功,服务器会返回 206 状态码;</p></li><li><p>若请求的范围越界(范围值超过了资源的大小),服务器会返回 416 状态码;</p></li><li><p>若服务器不支持范围请求,服务器会返回 200 状态码。</p></li></ul><p><br/></p> <br />
</div>
<ul class="clearfix number discuss">
<li class="range js_support">
<i class="support" type="1" catid="194" dataid="330479"></i>
<span>
0</span>
</li>
<li class="range js_support">
<i class="nosupport" type="0" catid="194" dataid="330479"></i>
<span>
0</span>
</li>
<li class="range js_collect">
<i class="collect" type="1" catid="194" dataid="330479"></i>
<span>
0
</span>
</li>
<li class="range start">
<a href="#">
<i></i>
<span>
0</span>
</a>
</li>
<li class="range shares">
<i></i>
<span>0</span>
<div class="fen bdsharebuttonbox" data-initialized="true" catid="194" dataid="330479">
<a class="bds_weixin weixin icon-wechat" data-cmd="weixin"></a>
<a class="bds_qzone qq icon-qq" data-cmd="qq" href="#"></a>
<a class="bds_qzone qzone icon-qzone" data-cmd="qzone" href="#"></a>
<a class="bds_tsina sina icon-weibo" data-cmd="tsina"></a>
</div>
</li>
</ul>
<script>pc_textend()</script>
<!--<div class="look clearfix">
<a id="hylprev" class="js_prev" href="/wenda/330478.html"><span class="prev back">上一条</span></a>
<a id="hylnext" class="js_next" href="/wenda/330480.html"><span class="next">下一条</span></a>
</div>
<div class="discu">
<div class="import clearfix">
<div class="discu-trea">
<textarea id="pl-tex" class="textr" placeholder="期待你的神评论"></textarea>
</div>
<div class="discu-img"><img src="/assets/images/portrait.png"></div>
</div>
<div class="criticism">
<i id="comment_len"></i>
<input type="button" data-type="" id="pinlun" value="评论">
<input type="hidden" id="hiddataid" value="330479" />
<input type="hidden" id="hidcommenttype" value="1" />
<input type="hidden" id="hidcategoryid" value="194" />
</div>
</div>
<div class="pinlun">
<div class="pinlun-title">
评论<i>(0)</i>
</div>
<div id="comment_divnonecomment" class="none-comment">
“还没有人发表评论,快去抢占沙发吧”
</div>
<div class="god-comments-cont">
</div>
</div>-->
</div>
</div>
</div>
</div>
</div>
<div class="footer">
<div class="grid">
<div class="copy">
<span>尊龙凯时 copyright 2005-2017 <a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow">湘icp备2021020205号</a></span>
</div>
</div>
</div>
<div style="display:none;">
<script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1279197011&web_id=1279197011"></script>
</div>
<div class="scroll-top">
<div class="scroll-top-er">
<em>
<img src="/assets/images/ers.png" alt=""></em>
</div>
<div class="scroll-top-arrow f-tac">
<a href="#top"><i class="arrow"></i></a>
</div>
</div>
</div>
<script type="text/javascript">hitcount_type=1;</script>
</body>
</html>