场景
多线程、断点续传、随机点播的步骤
1、客户端明确任务:从哪开始下载(如果是多线程并发下载,每个线程分别从哪下载)
本地是否已有部分文件
文件已下载部分在服务器端发生改变?
使用几个线程进行并发下载
2、下载文件的指定部分内容
3、下载完成后拼装成统一的文件
HTTP range规范(RFC7233)
1、允许服务器基于客户端的请求只发送响应包体的一部分给到客户端,而客户端自动将多个片段的包体组合成完成的体积更大的包体
支持断点续传
支持多线程下载
支持视频播放器实时拖动
2、服务器通过 Accept-Rang 头部标识是否支持range请求
Accept-Ranges = acceptable-ranges
例如 Accept-Ranges:bytes 支持、Accept-Ranges:none 不支持
range 请求范围的单位
0表示第一个字节,499标识第500个字节。用,表示分别取到两块字节的内容,然后客户端再进行拼接


range条件请求
1、如果接护短已经得到range响应的一部分,并想在这部分响应未过期的情况下,获取其他响应的响应
常与 if-unmodified-since 或者if-match头部共同使用
2、if-range = entity-tag/HTTP-date
可以使用etag或者last-Modified
服务器响应
206partial content:使用range协议时返回部分响应内容试的响应码(多线程、断点下载)
content-range 头部:显示当前片段包体在完整包体中的位置
content-range = byte-content-range /other -content-range (基于字节或者其他的,一般使用字节)
byte-content-range =bytes-unit SP(byte-range-resp /unstatisfied-range)
byte-range-resp = byte-range(当前片段从哪里到哪里) "/" (complete-length(完整包体的长度) / "*")
complete-length =1*DIGIT(1个多多个十进制数字,不知道大小时可以用*表示)
完整资源的大小,如果未知则用*号替代
byte-range = first-byte-pos "-" last-byte-pos
例如:
Content-Range:bytes 42-1233/1234
Content-Range: bytes 42-1233/*

416 range not satisfiable:无法提供range请求中指定的那段包体,请求范围不满足实际资源的大小。
content-range中的complete-length显示完整响应的长度 Content-Range: bytes */1234
200 ok的情况是因为服务器不支持range请求时,会议200返回完整的响应包体
多重范围与multipart
当我们请求的range:bytes=0-50,100-150有多段范围时
响应content-Type:multipart/byteranges;boundary=...
boundary中会以--xxx表示为一部分包体,--xxx--表示最后一部分

参考资料:
https://time.geekbang.org/course/intro/100026801
浙公网安备 33010602011771号