场景

多线程、断点续传、随机点播的步骤

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

 

posted on 2021-12-07 00:27  木木-林  阅读(175)  评论(0)    收藏  举报