何为断点续传?
如果你下载一个超大的文件到99%,突然没网了,你急不急?
断点续传就是为解决这个问题运用而生

断点续传-上传

需要在前端手动切割文件,一块一块上传,最后再让后端组合文件。
目前主流框架没有实现,需要手写实现

断点续传-下载

请求一个文件下载,如果http响应中有一个Accept-Ranges: bytes
这就代表服务端支持断点续传,其实nginx,apache等web服务器默认是开始支持断点续传的
可以用curl --range 0-100 的命令表示下载0-100 这101字节的内容

1
2
3
4
Ranges:    bytes=4000- // 下载从第4000字节开始到文件结束部分
Ranges: bytes=0~N // 下载第0-N字节范围的内容
Ranges: bytes=M-N // 下载第M-N字节范围的内容
Ranges: bytes=-N // 下载最后N字节内容

http请求头中只要携带
range:bytes=M-N
range:bytes=M-
range:bytes=-N
服务端就会返回http_code码为206(即使返回的是全部的数据)
并且响应头多一个Content-Range:bytes ${start}-/${end}/${total}字段,表示本次下载范围

  • 经钻研,只要是网页标签发起的是媒体请求(音频,视频),默认都会携带range:bytes=0-请求头。
    service worker线程,主动抓取的不会携带,拦截的依旧会携带(非200的响应码无法放入cache缓存中)
    (主动抓取:通过事件消息的方式从而主动触发请求资源,而不是靠fetch拦截事件去请求资源)

nginx断点续传模块

nginx断点续传的功能主要由ngx_http_range_filter_module模块实现
该模块包括

  1. ngx_http_range_header_filter_module
    设置Content-Range响应头: 指定区块的起始值
    设置Content-Length响应包大小
    设置code码为206
  2. ngx_http_range_body_filter_module
    根据range请求区间位置,从缓存区读取文件并发送给客户端

等两个模块组成

nginx