• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

HTTP Range范围请求

武飞扬头像
梁辰兴
帮助1


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 状态码。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgekbef
系列文章
更多 icon
同类精品
更多 icon
继续加载