作者 | 喵叔
责编 | 屠敏
出品 | CSDN(ID:CSDNnews)

我们都用过网盘,不管是例如百度网盘之类的公共网盘,还是自己搭建的私有网盘,都会或多或少的涉及到断点续传和秒传。断点续传和秒传大大提高了网盘上传的效率,下面我们就来讲解一下这两种技术的具体原理和实现,这里的讲解不涉及任何前后端编程语言,适合所有语言开发人员阅读。

零、断点续传

这里以上传为例,下载方式的断点续传类似。

简述原理

断点续传说白了就是将一个文件按照一定的规则人为的分割成多个小文件,然后客户端每次只上传一个小文件(当然我们也可以利用多线程技术每次上传多个小文件),服务器接收到上传过来的小文件后根据一定的规则来组合这些小文件。如果在上传过程中出现网络中断等意外情况,下次再次上传时可以从已经上传的部分继续上传,而不是重新上传。

详细讲解

从 HTTP1.1 协议开始就已经支出获取文件的部分内容,断点续传技术就是利用 HTTP1.1 协议的这个特点在 Header 里添加两个参数来实现的。这两个参数分别是客户端请求时发送的 Range 和服务器返回信息时返回的 Content-Range - Range,Range 用于指定第一个字节和最后一个字节的位置,格式如下:


Range 常用的格式有如下几种情况:
Range:bytes=0-1024 ,表示传输的是从开头到第1024字节的内容;

Range:bytes=1025-2048 ,表示传输的是从第1025到2048字节范围的内容;

Range:bytes=-2000 ,表示传输的是最后2000字节的内容;

Range:bytes=1024- ,表示传输的是从第1024字节开始到文件结束部分的内容;

Range:bytes=0-0,-1 表示传输的是第一个和最后一个字节 ;

Range:bytes=1024-2048,2049-3096,3097-4096 ,表示传输的是多个字节范围。

Content-Range Content-Range 用于响应带有 Range 的请求。服务器会将 Content-Range 添加在响应的头部,格式如下:


常见的格式内容如下:

这里边 2048-4096 表示当前发送的数据范围, 10240 表示文件总大小。
这里我顺便说一下,如果在客户端请求报文头中,对 Range 填入了错误的范围值,服务器会返回 416 状态码。416 状态码表示服务器无法处理所请求的数据区间,常见的情况是请求的数据区间不在文件范围之内,也就是说,Range 值,从语法上来说是没问题的,但从语义上来说却没有意义。

注意:当使用断点续传的方式上传下载软件时 HTTP 响应头将会变为:


当然光有 Range 和 Content-Range 还是不够的,我们还要知道服务端是否支持断点续传,只需要从如下两方面判断即可:
判断服务端是否只 HTTP/1.1 及以上版本,如果是则支持断点续传,如果不是则不支持

服务端返回响应的头部是否包含 Access-Ranges ,且参数内容是 bytes 符合以上两个条件即可判定位支持断点续传。

校验

这里的校验主要针对断点续传下载来说的。当服务器端的文件发生改变时,客户端再次向服务端发送断点续传请求时,数据肯定就会发生错误。这时我们可以利用 Last-Modified 来标识最后的修改时间,这样就可以判断服务器上的文件是否发生改变。和 Last-Modified 具有同样功能的还有 if-Modified-Since,它俩的不同点是 Last-Modified 由服务器发送给客户端,而 if-Modified-Since 是由客户端发出, if-Modified-Since 将先前服务器发送给客户端的 Last-Modified 发送给服务器,服务器进行最后修改时间验证后,来告知客户端是否需要重新从服务器端获取新内容。客户端判断是否需要更新,只需要判断服务器返回的状态码即可,206 代表不需要重新获取接着下载就行,200代表需要重新获取。 但是 Last-Modified 和 if-Modified-Since 存在一些问题:

某些文件只是修改了修改时间而内容却没变,这时我们并不希望客户端重新缓存这些文件;

某些文件修改频繁,有时一秒要修改十几次,但是 if-Modified-Since 是秒级的,无法判断比秒更小的级别; 部分服务器无法获得精确的修改时间。 要解决上述问题我们就需要用到 Etag ,只需将相关标记(例如文件版本号等)放在引号内即可。

当使用校验的时候我们不需要手动实现验证,只需要利用 if-Range 结合 Last-Modified 或者 Etage 来判断是否发生改变,如果没有发生改变服务器将向客户端发送剩余的部分,否则发送全部。

注意:If-Range 必须与 Range 配套使用。缺少其中任意一个另一个都会被忽略。

秒传

原理

秒传利文件的MD5,首先将文件的MD5发送个服务器,服务器传输过来的MD5判断服务器上是否存在相同类型的文件,如果存在就将文件复制一份,而不是本地上传。这样就是先的秒传功能。

MD5

秒传涉及到了MD5,那么什么MD5呢?MD5的英文全称是 Message-Digest Algorith 5 ,是计算机广泛使用的算法之一。 MD5 会为文件产生唯一的“指纹”,任何改动都会改变文件指纹。它以 512位分组来处理信息,每个分组又被分为16个32位分组,经过处理后输出4个32位分组,最后将输出的4个32位分组进行级联生成128位散列值。

MD5的具有压缩性、易计算、抗修改、弱抗碰撞和强抗碰撞。下面我们一一来讲解:

压缩性:任意长度数据,生成的MD5值长度是固定的;

易计算:可以很方便的从原始数据计算出MD5;

抗修改:对原始数据的任何修改,都会改变MD5;

弱抗碰撞和强抗碰撞:很难找到具有相同MD5的数据。

破解谣言:有人说网盘能秒传证明数据在网盘服务器是不加密的,有数据库查看权限的人都可以看,所以私密文件最好在本地磁盘加密后再上传到网盘中。这句话是错误的,正规的网盘服务器只是验证了文件的MD5码,文件还是加密存放的。

总结

这篇文章讲解了断点续传和秒传的知识,也讲解了它们所使用技术的相关知识点。这些知识可以用在任何编程语言的断点续传和秒传的开发中,因此这篇文章我并没有根据具体的语言讲解。

作者简介:朱钢,笔名喵叔,CSDN博客专家,.NET高级开发工程师,7年一线开发经验,参与过电子政务系统和AI客服系统的开发,以及互联网招聘网站的架构设计,目前就职于北京恒创融慧科技发展有限公司,从事企业级安全监控系统的开发。

【END】

断点续传、秒传究竟是如何实现的?相关推荐

  1. 云盘秒传原理的探讨——哈希查找与数据去重

    P个重要的S:用云盘存片的童鞋注意了,别以为你辛辛苦苦收集好几年的片存到云盘就高枕无忧了,根据"假秒传,真共享"原则,你秒传的文件是非常不保险的,很容易被河蟹,已经有童鞋表示存到云 ...

  2. 大文件分片上传,断点续传,秒传 实现

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  3. vue前端上传文件夹的插件_基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件...

    1. 前言 之前公司要在管理系统中做一个全局上传插件,即切换各个页面的时候,上传界面还在并且上传不会受到影响,这在vue这种spa框架面前并不是什么难题.然而后端大佬说我们要实现分片上传.秒传以及断点 ...

  4. dio 上传文件报错_Vue+Element UI实现断点续传、分片上传、秒传

    作者:Pseudo 转发链接:https://segmentfault.com/a/1190000023434864 凡是要知其然知其所以然 文件上传相信很多朋友都有遇到过,那或许你也遇到过当上传大文 ...

  5. formdata上传文件_封装一个多文件断点续传、分片上传、秒传、重试机制的组件...

    本文为:多文件断点续传.分片上传.秒传.重试机制 的更新版,若想看初始版本的实现,请查看该文章. 凡是要知其然知其所以然 文件上传相信很多朋友都有遇到过,那或许你也遇到过当上传大文件时,上传时间较长, ...

  6. 分片上传,断点续传,还有秒传

    分片上传 为什么需要分片上传 如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成. 分片上传的核心思想 利用H ...

  7. 多宽带叠加的分布式云盘:文件秒传、断点续传、大文件下载

    多宽带叠加的分布式云盘:文件秒传.断点续传.大文件下载 1. 前言 2. 各种私有云盘对比 3.本云盘实现的功能 4. 界面 4. 安装 4.1 负载均衡服务器 4.1 储存节点 5. 代码说明 1. ...

  8. 完整版断点续传、秒传,支持超大大大文件_支持重定义文件名和路径

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  9. 大文件上传最全方案:秒传、断点续传、分片上传

    前言 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上 ...

最新文章

  1. UITextField 详解
  2. 达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别
  3. mysql cluster 用户_mysql cluster统一用户权限
  4. Golang list双向链表源码走读
  5. LeetCode-3. 无重复字符的最长子串
  6. 版本为2.5的OpenMP的所有API函数
  7. 数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题
  8. vb连接mysql数据库必须要装mysql odbc驱动程序_vb连接mysql数据库必须要装mysql odbc驱动程序...
  9. PCoIP卡由火炮升级为喀秋莎
  10. 制作多个exe顺序安装程序(打包程序)
  11. 关于微信8.0.0以下版本登录版本验证的解决办法
  12. Python实现问卷星调查问卷自动填写
  13. 从AWS S3换成阿里云OSS存储所踩的坑
  14. 网络安全:六种常见的网络攻击手段
  15. gradle编译错误:Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one
  16. 采用计算机联锁系统的目的,计算机联锁系统特点及优势
  17. 百度流量异常投诉方法、网站被黑了处理方案、网站被镜像处理方案
  18. 乱码形成原因及其消除方法大全
  19. 针对秒杀项目做的一些优化
  20. 他们为什么能拿到11K的入职薪资?

热门文章

  1. Access denied for user 'root'@'192.168.64.154' (using password: YES)
  2. linux rm后文件放哪里,怎样将Linux rm号令删除的文件放进渣滓箱
  3. 【实验记录】Fashion-Mnist分类实验记录
  4. ubuntu18.04多版本opencv
  5. Emacs基本快捷键
  6. 中国水稻种子行业市场供需与战略研究报告
  7. 11条规则教你如何玩转数据库设计
  8. 硬核!如何全面系统地自学 Java ?
  9. 10 个内存引发的大坑,你能躲开几个?
  10. 只需一行代码,就能导入所有的Python库?