对断点续传原理的简单探究

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhougb3/article/details/82078853
断点续传的背景

有时候可能下载的文件过大,一次性传输遇到网络问题就很可能传输失败而需要全部重新下载。另外,断点续传还能够提供并发的下载提高下载速率。

断点续传的实现

如图,服务器通过返回的http报文头部字段告知客户端这只是请求数据的一部分,你需要再发起对剩余数据的请求。
这里写图片描述

断点续传的表现
浏览器

如果浏览器发起的请求中没有带range字段,而服务器没有返回全部数据,而是返回部分数据和一个206的状态码,则浏览器不会发起对剩余字段的请求,此时下载失败。

如果浏览器发起的请求带range字段,服务器返回指定range范围的数据,则下载成功

迅雷等下载器

如果迅雷发起的请求中没有带range字段,而服务器没有返回全部数据,而是返回部分数据和一个206的状态码,则迅雷会发起对剩余字段的请求,此时下载成功。

如果迅雷发起的请求带range字段,服务器返回指定range范围的数据,则下载成功。(服务器返回的range字段最好起始和结束点都一致,如果返回的range范围过小迅雷可能会提示下载失效)

结论

服务器的设计方面,应该让range的主动权应该掌握在客户端这边,如果请求中没有带range字段,则应该全部数据返回。如果带range字段,则应该返回确切范围内的数据。

如果下载的数据过大,服务器担心承受不住,可以断开TCP连接,则客户端那边会根据已经下载的内容再去发起对未下载内容的请求(带range字段)

这种设计模式下用迅雷下载,会先发起一个不带range的请求,拿到整个文件大小后再分段多线程发起对部分数据的请求。用谷歌浏览器下载,则直接是一个超级大的http包返回(状态码200)

探究浏览器的暂停恢复下载原理

下载测试:

这里写图片描述

查阅资料得到结论:

这里写图片描述

结论是通过测试和查找资料得出的,目前并未做过严格的抓包实验~

猜你喜欢

转载自blog.csdn.net/zhougb3/article/details/82078853