http断点续传原理

姚二二二姚 姚二二二姚     2022-11-14     617

关键词:

这周完成了一个断点续传的功能。

我们的游戏里加载地图的逻辑简化而言是这样:

1.首先用本地的md5文件校验地图文件(很多文件)是否完整。(中间有很多步骤,任何步骤失败都认为地图不完整)

2.如果完整,直接加载地图。

3.如果不完整,需要通过一个http协议请求后台服务器传回完整的地图。

 

现在要增加一个断点续传的功能。也就是地图下载过程中,如果断网,丢包之类,重启游戏地图会继续下载,而不是重新下载。给服务器减少流量。

要解决这个问题,要了解以下问题:

1.正常的http请求流程。

2.http分段请求的原理。

3.具体地图下载流程的处理。

 

1.http请求的流程 

客户端发送的请求被封装成请求报文

请求报文的内容里面包括请求方法,请求地址,http协议版本,请求首部。其中的请求方法就是所谓的Get,Post,Put,Header,Delete,Options,Trace,Connect这些。这里我们无需详细了解。

服务器收到请求以后,会以响应报文的形式发回客户端。响应报文里面包括了http协议版本,状态码,状态码的原因短语,响应首部,请求的实体主体

状态码会标记服务端是否正常处理,是个重要的参数。

我们来看下载地图的请求。

因为是需要直接请求实体,当然是用Get方法。另外只需要知道Url就行。网络正常的情况下,服务端会返回状态码200。而返回的实体就是地图文件,通常是一个压缩文件.zip,用二进制模式写到一个文件,再用ziplib之类解压。

 

2.http分段请求的原理

那么断点续传怎么做呢。在客户端发起的请求报文里,请求首部里面有个可选参数Range,用来标识只请求实体的一部分。

格式形如:Range: bytes=500-999,请求500bytes到999bytes。Range: bytes=500-,请求500bytes开始到结束的部分。

那么断点续传其实就是知道上一次传输的终点,把它作为Range参数的起点,发起请求。

如果请求首部带有Range参数,那么服务器正常情况会返回状态码206和请求的部分实体。

 

3.具体地图下载流程的处理

地图下载的具体逻辑。我这里这样处理:

服务器返回的实体内容写到一个临时文件,命名为temp.zip。如果下载完整了,就会把名字改掉,改为map_id.zip。如果不完整就不会改名了。

所以每次发起请求前,判断是否需要断点续传,只需要判断存不存在temp.zip即可。

1.首先用本地的md5文件校验地图文件(很多文件)是否完整。(中间有很多步骤,任何步骤失败都认为地图不完整)

2.如果完整直接使用本地地图。

3.如果不完整,判断是否存在temp.zip文件。

4.如果存在,请求头部带有Range参数,起点是temp文件的大小。

5.如果不存在,默认的请求头部,请求完整的文件。

 

中间有一些细节问题。可能和具体的实现框架有关。想象一次研发测试流程:

1.启动游戏,第一次下载是一次完整下载,下载的过程中断网(下载过程有个回调,回调参数有标识进度的process,在这里打断点,然后断网),把收到的实体(应该是一部分)写到temp.zip。

2.把网接回,再启动游戏,判断是否有temp.zip,有temp.zip,所以将temp.zip的文件大小作为Range参数的起点,发起部分请求。把收到的实体写入temp.zip,但是这次的写入起点是文件的末尾。把文件改名为map_id.zip。

这两个情况都是写在一个函数里的,那么怎么判断temp.zip文件是否已经是完整的地图文件呢?要不要改名了呢?

我这边的框架里面,服务器返回的实体res里面有个error参数,通过这个参数就能知道本次返回的实体,是不是客户端请求的全部实体(包括完整的请求和部分的请求)。

也就是说如果res里面的error是true,那么最后是不会走到改名那步的。下一次请求还是会走断点续传。反之error是false,那么说明本次请求返回的实体已经完整,最后会走到改名那步。

 

另外一个问题。如果服务器上的文件内容变更了,我们还从旧文件的断点位置请求,这样就会出错了。

这个问题,可以考虑请求首部的If-Range参数和响应首部的ETAG参数。也就是说要客户端记录传回文件的ETAG,下一次请求把此ETAG作为If-Range参数。那么服务器会根据ETAG判断文件是否更新。

如果有更新,会走全量下载,返回状态码200。如果没有更新,会走部分下载,返回状态码206。

也可以用其他方法,比如大家约定好,服务器那边地图改变了,地图就换一个名字(用时间戳做地图名字后缀),那么客户端这边请求的名字就会变了。不需要考虑If-Range参数。也不必在客户端记录ETAG。

 

引用:

1.《图解http》

掀开断点续传那一层面纱(下载篇)

1、简介  这一篇文章主要介绍的是http协议下载时的断点续传,详细到各个步骤。主要步骤有:DNS查找、TCP三次握手、http请求发送、TCP协议数据传输、暂停后的状态、继续下载、TCP三次握手、http请求发送、数据传输、。。。... 查看详情

http协议文件下载原理及多线程断点续传

最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下来比较好。起初只是想研究研究,但后来发现写个可重用性比较高的模块还是很有必要的,我想这也是大多数开发人员的习惯吧。对于HTTP协议,向服务器请求某... 查看详情

断点续传

虽然断点续传已经会了,也知道一些原理,但是总感觉没有吃透,就像别人给我一个东西,告诉我要这么做,但却不是很明白为什么要这么做,这里看到一篇文章,不算难,也不多,算是对理论... 查看详情

图解:http范围请求,助力断点续传多线程下载的核心原理(代码片段)

题图:byCharlesLoyer一、序Hi,大家好,我是承香墨影!HTTP协议在网络知识中占据了重要的地位,HTTP协议最基础的就是请求和响应的报文,而报文又是由报文头(Header)和实体组成。大多数HTTP协议的使用方式,都是依赖设置不同... 查看详情

http断点续传range与content-range(代码片段)

...节,用以下配置启用HTTP头信息打印后发现原来是设置了断点续传位置的原因curl_easy_setopt(m_pCurl,CURLOPT_VERBOSE,1L);故了解了一下HTTP断点续传的相关设置参考文章:1、HTTPHeader里的Range和Content-Range参数2、http断点续传原理:http头Range、... 查看详情

用c实现断点续传的功能,详细点的实现原理是啥嘞

参考技术A用C实现断点续传的功能,详细点的实现原理是什么嘞于HTTP协议的多执行绪下载和断点续传的实现学生:叶升路指导教师:覃颖(三峡大学电气资讯学院)摘要:本文介绍了网路下载软体中的最新技术——多执行绪下载... 查看详情

断点续传基本原理初了解

断点续传的理解可以分为两部分:一部分是断点,一部分是续传。断点的由来是在下载过程中,将一个下载文件分成了多个部分,同时进行多个部分一起的下载,当某个时间点,任务被暂停了,此时下载暂停的位置就是断点了。... 查看详情

linux下实现断点续传的原理介绍

参考技术A  Linux下实现断点续传的原理介绍  断点续传的原理  其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。  打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:  假... 查看详情

http协议断点续传

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Text;namespaceHttpDemo{   classProgram   {     查看详情

11_断点续传原理

断点续传得把下载到的位置给它记录下来。通过什么记?记在哪里?记在内存里行不行?用迅雷下了蓝光电影,动辄就好几个GB.下了一个GB突然间改早了没网了,这个时候你放在内存里面电脑一关所有的内容就都没有了,下一次... 查看详情

http断点续传(代码片段)

断点续传从下载断开的位置,继续下载,直到下载完整四个必须的HTTP头域Range用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:Range:(unit=firstbytepos)-[lastbytepos]Range:bytes=50-从第50个字节开始到最后一个字节R... 查看详情

断点续传

--实现断点续传http://www.cnblogs.com/peaceli/archive/2011/04/06/breakpoint_upload.html  查看详情

c#http协议断点续传

 usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Text;namespaceHttpDemo{classProgram{//需要下载的路径staticstringurl="http://www.aseoe.com/demo/ap 查看详情

断点续传的实现(代码片段)

...响应图解:获取文件ETag的函数:下载文件(断点续传)的函数:从上次断开位置继续下载HTTP断点续传:实现原理(客户端):1.客户端保存当前已下载文件的位置或大小。2.在下次请求时告诉服... 查看详情

基于http的断点续传和多线程下载

... Range请求的资源范围;  Content-Range响应的资源范围;断点续传:  在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。  分块请求资源实例:Eg1:Range:bytes=306302-:请求... 查看详情

基于http的文件断点续传实现(代码片段)

基于Http的文件断点续传实现1:断点续传的介绍客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如... 查看详情

http断点续传(分块传输)

简述断点续传:指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下... 查看详情

超大文件上传和断点续传的组件

一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断... 查看详情