1、断点续传原理

  • 断点续传可以分为两个部分,一部分是断点,一部分是续传
  • 断点的由来是在下载过程中,将下载的内容切片分成多个部分,同时进行多个部分一起下载,当某个时间点,任务被暂停了,此时下载暂停的位置就是断点了。
  • 续传就是当一个未完成的下载任务再次开始时,会从上一次的断点继续传送。
  • 使用多线程断点续传下载的时候,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,多个线程并发可以占用服务器端更多资源,从而加快下载速度。
  • 断点续传步骤
    • 1、断点续传需要在下载过程中记录每条线程的下载速度
    • 2、每次下载开始之前先读取数据库,查询是否有未完成的记录,如果有就继续下载,否则创建新纪录插入数据库。
    • 3、在每次向文件中写入数据之后,在数据库中更新下载进度。
    • 4、下载完成之后删除数据库中的下载记录。
  • 断点续传在HTTP请求中和一般的下载有所不同,客户端浏览器传给Web服务器的时候要多加一条信息。且要实现断点续传,Web服务器必须支持HTTP1.1
    • 在使用断点续传的Web应用中,HTTP请求Header里有两个参数。
    • 客户端发请求时对应的是Range,服务器端响应时对应的是Content-Range
      • Range用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般的格式:
        Range:(unit=first byte pos)-[last byte pos]
      • Range头部的格式有以下几种情况
        Range: bytes=0-499 表示第 0-499 字节范围的内容
        Range: bytes=500-999 表示第 500-999 字节范围的内容
        Range: bytes=-500 表示最后 500 字节的内容
        Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容
        Range: bytes=0-0,-1 表示第一个和最后一个字节
        Range: bytes=500-600,601-999 同时指定几个范围
      • Content-Range用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小。一般格式:
        Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
        例如:Content-Range: bytes 0-499/22400 (0-499 是指当前发送的数据的范围,而 22400 则是文件的总大小。)
      • 而在响应完成之后返回的响应头内容也是不同的
        HTTP/1.1 200 Ok(不使用断点续传方式)
        HTTP/1.1 206 Partial Content(使用断点续传方式)
  • FTP实现断点续传
    • FTP协议也支持断点续传下载数据,基本原理是用get命令拿数据的时候在文件名后面加上要获取的初始位置。FTP实现断点续传有三个条件。
      • 1、断点续传需要服务器的支持,FTP服务器必须能够提供断点续传的能力。传统的FTP Server是不支持的,因为它不支持REST指令;目前包括IIS和大部分的FTP架设软件都有了这个功能。用Serv-U架设FTP服务器就能支持断点续传。
      • 2、支持断点续传的下载工具软件。
      • 3、FTP服务器上的文件要与下载到硬盘中的文件名相同。