HTTP Range:范围请求

文章目录


HTTP 范围请求

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 个字节之间的数据。

表示范围的两个数字中,如果缺少第一个数字,则表示这个范围从数据末尾开始计数;如果缺少第二个数字,则表示这个范围从给出的字节数到数据的末尾。

【示例】假如要从 www.csdn.net 请求一张图片,但只返回前 1024 字节,客户端的请求如下所示:

GET /templets/new/images/logo.png HTTP/1.1
Host: www.csdn.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://www.csdn.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: www.csdn.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://www.csdn.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

<!doctype html>
<html>
<head>
    <title>Example Do
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-150/1270

eta http-equiv="Content-type" content="text/html; c
--3d6b6a416f9b5--

上面的响应中,Content-Type:multipart/byteranges表示这个响应有多个 byterange。每一部分 byterange 都有他自己的 Centen-type 头和 Content-Range 头,并且使用 boundary 参数对响应体进行划分。

与范围请求相关的有三种状态码:

  1. 若请求成功,服务器会返回 206 状态码;
  2. 若请求的范围越界(范围值超过了资源的大小),服务器会返回 416 状态码;
  3. 若服务器不支持范围请求,服务器会返回 200 状态码。
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值