断点续传实现(断点续传的原理)

作者喵叔

编辑|不小心的鞋垫/p制|csdn(id:csdnnews ) ) ) ) ) ) ) ) ) ) )。

我们用过网盘。 无论是百度网盘这样的公共网盘,还是自己制作的私人网盘,都与断点的持续和秒传有关。 断点和秒传大大提高了上网效率。 下面介绍这两种技术的具体原理和实现。 这里的说明适合所有语言开发者阅读,无论前后的编程语言如何。

零,断点续断

这里以上传为例,接着是下载方式的断点。

简述原理

断点简单地说,就是将一个文件按照一定的规则人为地分割成多个小文件,客户端一次只上传一个小文件(当然也可以利用多线程技术一次上传多个小文件, 如果在上传过程中发生了诸如互联网断开等意外情况,则下次重新上传时可以从已经上传的部分继续上传,而不是重新上传。

详细说明

从HTTP1.1协议获取文件的部分被支出,断点续传技术是通过利用HTTP1.1协议的这个特点向Header添加两个参数来实现的。 这些参数是在客户端请求时发送的范围,以及在服务器返回信息时返回的内容范围。 Range按以下格式指定第一个字节和最后一个字节的位置:

范围: (单元=第一个字节) -“最后一个字节”范围的常用格式包括:

Range:bytes=0-1024表示正在传输从开头到第1024个字节的内容。

range :字节=1025-2048表示正在传输从第1025字节到第2048字节的范围内的内容。

range :字节2000表示传输了最后2000个字节的内容。

Range:bytes=1024-表示传输了从第1024字节到文件最后的内容。

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

range :字节=1024-2048、2049-3096、3097-4096,表示正在传输多个字节的范围。

内容范围内容范围用于响应包含范围的请求。 服务器将内容范围添加到响应的开头。 型号如下。

内容范围:字节(unitfirstbytepos ) (-最后字节销售点/实体长度)的典型格式如下:

内容范围:字节2048-4096/10240这一边2048-4096表示当前发送的数据范围,10240表示文件的总大小。

顺便说一下,如果在客户端的请求标头中输入的范围值不正确,服务将返回416状态代码。 416状态代码表示服务器无法处理请求的数据部分。 常见的情况是,请求的数据区间不在文件范围内。 也就是说,Range值在语法上没有问题,但在意义上没有意义。

注:如果继续使用断点上载下载软件,HTTP响应标头将为:

http/1.1 206分区内容当然,光有范围和内容范围是不够的。 您还需要知道服务器端是否支持断点重新分发。 只需从以下两个方面进行判断即可。

确定服务器是否只支持HTTP/1.1或更高版本,否则支持断点重新分发,否则不支持

服务器端返回响应的头中是否包含访问范围,以及参数的内容是否为字节,可以判断为位支持断点的继续传输。

检查

这里的检查主要是为了继续下载断点。 如果在服务器端文件发生更改时,客户端向服务器端再次发送中断点重新发送请求,则数据肯定会发生错误。 在这种情况下,可以使用上次修改时间来确定服务器上的文件是否已修改。 具有与上次修改相同功能的是if-Modified-Since,其差异在于上次修改从服务器发送到客户端,而if-Modified-Since从客户端发送, if-Modified-Since以前要判断客户端是否需要更新,只要判断服务器返回的状态码即可,206表示不需要重新取得和下载,200表示需要重新取得。 但是,不存在最后修改和if修改-敏感性

一些问题:

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

某些文件修改频繁,有时一秒要修改十几次,但是 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】

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注