Http中的Range、Content-Range

2021-01-14

一、简介

在做小程序的在线播放视频功能时,遇到了安卓端、模拟器都可以正常播放,IOS却无法正常播放的问题。

由于IOS的机制,所以必须使用分段下载进行处理才能正常播放视频。那么这里就记录HTTP协议中的Range和Content-Range是如何实现分段下载的。

二、参数说明

请求头

Range:告知服务器,客户端下载文件想要从指定位置开始。Range的格式如下:

一般格式:

Range:(unit=first byte pos)-[last byte pos] 

参数举例:

Range:bytes=0-500   
表示下载从0到500字节的文件即头500个字节  ,[0-500]前闭后闭0<=range<=500 
    
Range:bytes=501-1000
表示下载从500到1000这部分的文件单位字节       

Range:bytes=-500
表示下载最后的500个字节      
     
Range:bytes=500-
表示下载从500开始到文件结束这部分的内容   
 
Range:bytes=500-600,700-1000
表示下载这两个区间的内容

如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明.

如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK .(这个要注意,要分段下载时,要先判断这个,IOS请求时首先会发送不带Range的请求,先返回200和文件总大小,之后才会发送多次带Range的请求头进行分段下载)

响应头

Content-Range: 表示,服务器响应了多少字节的数据,以及资源的总大小

一般格式:

//表示服务器响应了前(0-10)个字节的数据,该资源一共有(3103)个字节大小。
Content-Range: bytes 501-1000/2000
#501-1000 请求头里range的值
#2000 文件总大小
#bytes 字节方式

Content-Length:表示这次服务器响应了多少字节的数据

一般格式:

Content-Length: 500 
# 如上 501-1000 => 1000-501+1=500

Content-Type :响应的资源类型,告知浏览器进行解析,类型略

Last-Modified:表示资源最近修改时间,⚠️如果分段下载时,这个值修改了,可能就必须全部重新下载了

ETag:只要实体发生改变,都会改变ETag

ETag: &quot;3103-1435633968000&quot;
// 或 弱ETag,前面带有 W/
ETag: W/&quot;12342423&quot;

注意,每种服务器对生成ETag的算法不同,这个要特别注意 如果使用分布式缓存,要特别要保证每台服务器生成的ETag算法是一致的.