3.8.3 支持用户多线程下载和断点续传

RFC2616规范中定义了range协议,它给出了一种规则使得客户端可以在一次请求中只下载完整文件的某一部分,这样就可支持客户端在开启多个线程的同时下载一份文件,其中每个线程仅下载文件的一部分,最后组成一个完整的文件。range也支持断点续传,只要客户端记录了上次中断时已经下载部分的文件偏移量,就可以要求服务器从断点处发送文件之后的内容。

Nginx对range协议的支持非常好,因为range协议主要增加了一些HTTP头部处理流程,以及发送文件时的偏移量处理。在第1章中曾说过,Nginx设计了HTTP过滤模块,每一个请求可以由许多个HTTP过滤模块处理,而http_range_header_filter模块就是用来处理HTTP请求头部range部分的,它会解析客户端请求中的range头部,最后告知在发送HTTP响应包体时将会调用到的ngx_http_range_body_filter_module模块,该模块会按照range协议修改指向文件的ngx_buf_t缓冲区中的file_pos和file_last成员,以此实现仅发送一个文件的部分内容到客户端。

其实,支持range协议对我们来说很简单,只需要在发送前设置ngx_http_request_t的成员allow_ranges变量为1即可,之后的工作都会由HTTP框架完成。例如:


r->allow_ranges=1;


这样,我们就支持了多线程下载和断点续传功能。