云备份服务端——详解断点重传

本文主要是对业务处理模块备份文件下载业务的亮点功能——断点重传,进行一个深入了解

首先为什么要有断点重传功能呢?

当我们下载文件时,可能会由于网络,或者资源服务器出了问题,导致下载中断,如果就下载了一点,那么重新下载也无妨,但是如果下载99%忽然断掉,此时再重新下载,那么哪个99%的资源就等于是浪费掉了,很明显这样效率是低下的,因此为了提高文件传输效率我们就引入了断点重传功能

那么如何实现这个断点重传呢?

我们先从服务器和客户端的角度出发,首先,客户端在下载文件时需要记录文件下载量,当下载异常,进行断点重传申请时,只需要将需要下载的数据区间(上次下载失败位置,结束位置)发送给服务端,然后服务端返回该区间数据即可

但是这里我们需要注意一点,就是当服务器收到断点重传申请时,需要判断文件资源是否被改变,如果被改变的话,那么我们只能重新下载文件

那么在http协议下,如何实现该功能呢?

根据上面分析实现该功能的关键主要有亮点:1.客户端页面能够告知服务端下载区域范围。2.服务端通过检测文件是否被修改,决定是否断点重传

因此http完成断点重传功能流程大概如下

云备份服务端——详解断点重传_第1张图片

 因此在我们业务处理模块的Download函数中的断点续传处理流程大概如下

1. 获取客户端请求下载资源路径

2. 根据资源路径获得对应备份文件信息

3. 如果是已经压缩的非热点文件,需要进行解压缩

4. 判断文件是否已经改变,已经改变则按照之前的流程响应完整的文件数据,未改变按照下面流程走

5. 读取req中的Range关键字对应的值,获取到需要续传的文件数据区间

6. 然后读取文件中对应区间的数据,将其填充到res的body字段中

7. 根据上图格式设置res的Content-Range字段

8. 设置状态码,向客户端页面返回响应

而在我们项目中,由于httplib库以及实现了断点续传功能,因此我们也无需再次实现

 云备份服务端——详解断点重传_第2张图片

httplib中206状态码设置

云备份服务端——详解断点重传_第3张图片

你可能感兴趣的:(#云备份系统,c++,linux)