断点续传小解

news2024/10/6 22:31:59

断点续传的原理

HTTP 协议是互联网上应用最广泛网络传输协议之一,它基于 TCP/IP 通信协议来传递数据。断点续传的奥秘就隐藏在这 HTTP 协议中了。

我们知道HTTP请求会有一个Request header 和 Response header,在请求头里边有个和Range相关的参数

当下载文件的时候,response header会有如下:

Content-Length: 65804256  // 请求的文件的大小,单位 byte
Accept-Ranges: bytes      // 是否允许指定传输范围,bytes:范围请求的单位是 bytes (字节),none:不支持任何范围请求单位,
Last-Modified: Tue, 07 Jul 2020 13:19:46 GMT  // 服务端文件最后修改时间,可以用于校验文件是否更改过
x-bs-meta-crc32: 3545941535 // crc32,可以用于校验文件是否更改过
ETag: dcd0bfef7d90dbb3de50a26b875143fc //Etag 标签,可以用于校验文件是否更改过

可见<font color=red>并不是所有的下载都支持断点续传,只有在response header中有 Accpet-Ranges: bytes字段时,才可以断点续传。</font>

如何使用

利用content-range字段,就可以实现断点续传了。只需要在response header中指定Content-Range值就可以了。

使用方式如下:

Content-Range: <unit>=<range-start>-<range-end>/<size> // size 为文件总大小,如果不知道可以用 *
Content-Range: <unit>=<range-start>-<range-end>/*  
Content-Range: <unit>=<range-start>-
Content-Range: <unit>=*/<size>

举例说明

单位 bytes,从第 10 个 bytes 开始下载

Content-Range: bytes=10-

单位 bytes,从第 10 个 bytes 开始下载,下载到第100个 bytes

Content-Range: bytes=10-100

重启续传文件时保证文件一致性

下载中,如何保证文件的完整性?

我们要写的下载器是支持断点续传的,那么在进行续传时,怎么确定文件从我们上次下载时没有进行更新呢?这里通过response header中的几个属性值进行判断。

Last-Modified: Tue, 07 Jul 2020 13:19:46 GMT  // 服务端文件最后修改时间,可以用于校验文件是否更改过
ETag: dcd0bfef7d90dbb3de50a26b875143fc //Etag 标签,可以用于校验文件是否更改过
x-bs-meta-crc32: 3545941535 // crc32,可以用于校验文件是否更改过
  • ETag: 根据 HTTP 协议的规定,当文件更新时,是会生成新的 ETag 值的,它类似于文件的指纹信息
  • Last-Modified: 只是上次修改时间,有时候可能并不能够证明文件内容被修改过

写入阶段,如何保证文件顺序?

不管单线程还是多线程,由于要断点续传,在写入时都要在指定位置进行字符追加。

在Java中使用RandomAccessFile类,它可以在使用时指定读写模式,使用 seek 方法可以随意移动要操作的文件指针位置。很适合断点续传的写入场景。使用它你可以快速定位到已知的位置,进行快速检索;也可以在同一个文件的不同位置进行并发读写。

举个例子

在 aaa.text 文件中的位置 0 开始写入字符 abcdef,在位置 100 的位置开始写入字符 ddeeff。

// rw 为读写模式
try (RandomAccessFile rw = new RandomAccessFile("test.txt", "rw")){ 
    // 移动文件内容指针位置 
    rw.seek(0);
    rw.writeChars("abc");
    rw.seek(100);
    rw.writeChars("ddd");
}

网速贷宽固定,为什么多线程下载可以提速

最大网速是固定的,运营商给你 100Mbs的网速,不管你怎么使用,速度最大也就是100/8=12.5MB/s。那么为什么多线程下载可以提高下载速度呢?

理论上来说,单线程下载就可以达到最大的理想网速,但是事实是,网络经常不那么通畅,很难达到理想的最大速度,也就是说只有在网路不那么通畅的时候,多线程下载才能提速。

多线程下载提速原因

HTTP 协议在传输时候是基于 TCP 协议传输数据的,TCP 协具有拥塞控制机制。拥塞控制 是TCP 的一个避免网络拥塞的算法,它是基于和性增长/乘性降低这样的控制方法来控制拥塞的。

a8Gc0s.png

简单来说就是在 TCP 开始传输数据时,服务端会不断的探测可用带宽。在一个传输内容段被成功接收后,会加倍传输两倍段内容,如果再次被成功接收,就继续加倍,直到发生了丢包,这是这也被叫做慢启动。当达到慢启动阀值(ssthresh)时,慢启动算法就会转换为线性增长的阶段,每次只增加一个分段,放缓增加速度。我觉得其实慢启动的加倍增速过程并不慢,只是一种叫法。

但是当发生了丢包,也就是检测到拥塞时,发送方就会将发送段大小降低一个乘数,比如二分之一,慢启动阈值降为超时前拥塞窗口的一半大小、拥塞窗口会降为1个MSS,并且重新回到慢启动阶段。这时多线程的优势就体现出来了,因为你的多线程会让这个速度减速没有那么猛烈,毕竟这时可能有另一个线程正处在慢启动的在最终加速阶段,这样总体的下载速度就优于单线程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6种交互式内容创意帮助跨境电商卖家提高独立站商店知名度

关键词&#xff1a;跨境电商卖家、独立站商店 交互式内容是一种允许用户与之交互的内容。一些示例包括在线投票、问答环节、交互式视频和交互式计算器等交互式工具。此内容类型允许查看者通过单击或拖动项目来自定义显示方式和内容。内容还可以引导读者采取您想要的操作&#x…

【网络安全】——sql注入之云锁bypass

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

嵌入式分享合集110

一、功耗&#xff0c;成为芯片设计的头号问题 很明显&#xff0c;热量将成为半导体未来的限制因素。已经有很大一部分芯片在任何时候都是黑暗的&#xff0c;因为如果所有东西同时运行&#xff0c;所产生的热量将超过芯片和封装消散该能量的能力。如果我们现在开始考虑堆叠模具…

智能网卡的网络加速技术

2021年9月25日&#xff0c;由“科创中国”未来网络专业科技服务团指导&#xff0c;江苏省未来网络创新研究院、网络通信与安全紫金山实验室联合主办、SDNLAB社区承办的2021中国智能网卡研讨会中&#xff0c;多家机构谈到了智能网卡的网络加速实现&#xff0c;我们对此进行整理&…

金枪鱼群优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

跑步需要哪些运动装备?跑步装备选购指南

跑步是一项有氧运动&#xff0c;是富有韵律性的运动,在运动过程中&#xff0c;血液可以供给心肌足够的氧气&#xff1b;氧气能充分酵解体内的糖分&#xff0c;还可消耗体内脂肪&#xff0c;增强和改善心肺功能&#xff0c;预防骨质疏松。 而在跑步的时候选择好自己的运动装备&…

代码随想录训练营第32天|LeetCode 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

参考 代码随想录 题目一&#xff1a;LeetCode 122.买卖股票的最佳时机II 按照自己的想法&#xff0c;无非就是在最低点买入&#xff0c;在最高点卖出&#xff0c;因此只需要找到成对的极小值和极大值&#xff0c;就可以计算利润了。代码实现如下&#xff1a; class Solutio…

使用姿势估计构建 姿势校正器

我们中的许多人大部分时间都在办公桌前弯腰驼背&#xff0c;身体前倾看着电脑屏幕&#xff0c;或者瘫坐在椅子上。如果你像我一样&#xff0c;只有当你的脖子或肩膀在数小时后受伤&#xff0c;或者你有偏头痛时&#xff0c;你才会想起你的不良姿势。如果有人可以提醒您坐直不是…

SpringBoot配置文件(学习笔记)

目录 一、配置文件概述 配置文件的作用 配置文件的格式 二、application.properties 配置文件 基本语法 读取配置文件 三、application.yml 配置文件 基本语法 读取yml中的配置 1、yml配置的简单读取 2、读取yml 配置中不同数据类型及 null​编辑 2、读取yml配置文…

Python基础知识入门(三)

Python基础知识入门&#xff08;一&#xff09; Python基础知识入门&#xff08;二&#xff09; 一、元组类型 元组是用英文小括号 () 把所有元素包裹起来&#xff0c;元组里面的每一个数据叫作元素。每个元素之间都要用 英文逗号 ( , ) 隔开。例如&#xff1a;(1,2,3)。 注意…

Head First设计模式(阅读笔记)-04.工厂模式

披萨订购 假设要完成披萨订购的功能&#xff0c;披萨的种类很多&#xff0c;比如 GreekPizz、CheesePizz 等&#xff0c;披萨店会根据用户需要的披萨种类制作披萨&#xff0c;制作的流程包括prepare->bake->cut->box 简单实现 下面代码的实现十分简单清晰&#xff0c;…

从0到0.1学习 lambda表达式(Java版)

编码几年时间&#xff0c;有一个东西似乎一直也逃不过去&#xff0c;那就是lambda表达式。 无论是c#&#xff0c;Python还是Java&#xff0c;lambda的思想都是共通的。但以下的语法和实例为java。 现在就来说说这个看似很难的lambda表达式 什么是lambda表达式&#xff1f; l…

【owt-server】m88分支和m59-server

OWT 单独有个webrtc的仓库,里面有m88的分支Merged Upgrade sdk to m88 for webrtc node #1026 提交记录 主干merge Merge pull request #1026 from starwarfan/mst-88webrtc-m88 目录 构建修改

【信管2.2】项目管理知识体系与组织结构

项目管理知识体系与组织结构上一次课中&#xff0c;我们已经学过了项目以及项目管理的概念&#xff0c;这些内容帮我们认识到了项目到底是个什么东西&#xff0c;有什么特点&#xff0c;和运营有什么区别等等。今天我们就继续沿着项目这件事说下去&#xff0c;我们将一起探讨一…

【知识网络分析】共引网络(co-citation)

共引网络(co-citation) 1 读取本地文献构建共引网络数据集2 网络数据集精简3 社团群体划分4 节点中心度相关指标计算1 读取本地文献构建共引网络数据集 RC.networkCoCitation()方法中的参数与RC.networkCitation()方法中的参数功能一致。该案例中使用的数据集同样为2020-202…

SpringBoot框架保姆级笔记一看就会

文章目录 文章目录文章目录[toc]1️⃣ 简介一. 什么是 [IoC](https://so.csdn.net/so/search?qIoC&spm1001.2101.3001.7020) 容器&#xff1f;二. AOP面向切面编程三. SSM整合四. HttpServletRequest五. HttpServletResponse六. Cookie 与 Session七. Cookie八. Session九…

Java异常01:Error 和 Exception

什么是异常 # 实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的实际要求、你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff0c;你要读取数据库的数据&#xff0c;数据…

最全面的SpringMVC教程(一)——SpringMVC简介

前言 本文为SpringMVC相关教程&#xff0c;下边将对SpringMVC进行简单介绍&#xff0c;具体包含&#xff1a;对MVC架构的回顾&#xff0c;什么是SpringMVC&#xff0c;SpringMVC编程示例&#xff08;包含配置版示例、注解版示例&#xff09;&#xff0c;初识SpringMVC&#xff…

NM DEV Mathematics for Java 【suanshu.net免费】

NM Dev是一个面向对象、高性能、经过广泛测试和专业记录的数学编程库&#xff0c;在S2上运行。自 2010 年开发以来&#xff0c;它是大量经过编码的数值算法&#xff0c;因此它们是可靠的面向对象、统一和可测试的。编程经验或数学知识很少的用户可以通过快速组合类轻松地为他或…

备战 2023 春招,P7 大咖手打 26 大后端面试专题神技,1500 题解析助力

年过后&#xff0c;不少人已经蓄势待发&#xff0c;信心满满地准备投递简历&#xff0c;到处面试&#xff0c;在不同的 Offer 之中择优而栖。 与此同时&#xff0c;也有人会悔恨自己这半年进步不大&#xff0c;每天噼里啪啦敲代码&#xff0c;但面对那些不能再熟悉的 Java 面试…