HTTP断点续传原理 状态码206 Partial Content

HTTP断点续传

断点续传就是从文件上次中断的地方开始重新下载或上传,当下载或上传文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间。所以断点续传的功能就应运而生了。要实现断点续传的功能,需要客户端记录下当前的下载或上传进度,并在需要续传的时候通知服务端本次需要下载或上传的内容片段。

HTTP的请求上定义了断点续传相关的HTTP头Range字段和Content-Range字段。

比如说客户端在Header中设置Range=bytes22223333- 表示文件从22223333字节开始传,前面的字节不用传了。

服务器收到请求,返回206 Partial Content。 Content-Length=44445555,Content-Range=bytes22223333-44445554/44445555 。

如果文件变化了,怎么判断呢?

在RFC2616中有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。

终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。

RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。

206 Partial Content

HTTP 206 Partial Content 成功状态响应代码表示请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 Range 首部指定的。

如果只包含一个数据区间,那么整个响应的 Content-Type 首部的值为所请求的文件的类型,同时包含 Content-Range 首部。

如果包含多个数据区间,那么整个响应的 Content-Type 首部的值为 multipart/byteranges ,其中一个片段对应一个数据区间,并提供 Content-Range 和 Content-Type 描述信息。

假如响应中包含 Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。

If-Range

If-Range HTTP 请求头字段用来使得 Range 头字段在一定条件下起作用:当字段值中的条件得到满足时,Range 头字段才会起作用,同时服务器回复206 部分内容状态码,以及Range 头字段请求的相应部分;如果字段值中的条件没有得到满足,服务器将会返回 200 OK 状态码,并返回完整的请求资源。

字段值中既可以用 Last-Modified 时间值用作验证,也可以用ETag标记作为验证,但不能将两者同时使用。

ETag

ETag HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。而如果内容发生了变化,使用ETag有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

如果给定URL中的资源更改,则一定要生成新的Etag值。 因此Etags类似于指纹,也可能被某些服务器用于跟踪。 比较etags能快速确定此资源是否变化,但也可能被跟踪服务器永久存留。

### 回答1: QNetworkAccessManager是Qt网络模块提供的类,用于网络资源的请求和响应。但是QNetworkAccessManager本身并不支持断点续传,需要开发者自行实现。 实现断点续传的一种常见方法是使用HTTP协议的Range头字段,该字段用于指定请求的字节范围。具体的实现步骤如下: 1. 首先,开发者需要在请求时添加Range头字段,以指定请求的起始位置。可以通过设置QNetworkRequest对象的setRawHeader方法来设置Range字段。 2. 当接收到响应时,可以通过QNetworkReply的rawHeader方法获取到响应头信息,如果响应头中包含Accept-Ranges字段,则表示该资源支持断点续传。 3. 如果资源支持断点续传,那么可以通过QNetworkReply的bytesAvailable方法获取到已下载的字节数,然后再次发起请求时,设置Range字段的起始位置为已下载的字节数,即可实现断点续传。 4. 在每次接收到数据时,开发者需要将已接收的数据追加到之前已下载的数据之后,以确保所有数据完整。 需要注意的是,实现断点续传对于服务器端和客户端都要支持,只有当服务器端支持Range头字段,且资源能够被分割成多个部分时,才能实现断点续传。 总结起来,通过在请求中设置Range头字段,结合服务器端的支持,可以实现QNetworkAccessManager的断点续传功能。开发者可以根据具体的需求和场景,自行实现相应的断点续传逻辑。 ### 回答2: QNetworkAccessManager在网络编程中是一个重要的类,通过它我们可以方便地进行网络请求和数据交互。而断点续传是一种网络传输的机制,在文件下载中特别常见。 断点续传是指在进行文件下载时,如果下载过程中突然中断了,可以通过断点续传的机制,在中断处继续下载,而不是重新开始。这样可以节省时间和流量,提高下载效率。 在QNetworkAccessManager中实现断点续传的方法如下: 1. 首先,通过发送HTTP请求从服务器获取文件的大小和上次下载的位置。 2. 然后,使用QFile类创建一个本地文件,并移动到上次下载的位置。 3. 接下来,设置HTTP请求的Range头部,指定从上次下载的位置开始下载。 4. 在网络请求完成后,将接收到的数据写入本地文件。 5. 最后,更新文件的下载进度,并在下载完成后关闭文件。 通过以上步骤,我们可以实现断点续传的功能。如果在下载过程中突然中断,下次再次下载时,只需要获取上次中断的位置并设置Range头部,就可以继续下载未完成的部分,提高了下载的效率。 总之,QNetworkAccessManager是一个强大的网络编程工具,通过合理地使用它的功能,我们可以轻松实现文件的断点续传。 ### 回答3: QNetworkAccessManager是Qt提供的网络访问类,它可以用于实现网络文件的下载和上传等功能。而断点续传指的是当文件传输中断后,能够从中断的位置继续传输,而不需要重新下载或上传整个文件。 QNetworkAccessManager本身并没有提供直接的断点续传功能,但可以通过下面的步骤实现: 1.在每次开始下载或上传前,先检查目标文件是否已经存在,并记录已经下载或上传的文件大小。 2.通过设置"Range"请求头信息来指定下载或上传的起始位置,以及结束位置。 3.在接收到服务器响应时,判断是否返回了"206 Partial Content"状态码,表示支持断点续传。如果返回了该状态码,就可以从响应的Content-Range头部获取已经下载或上传的字节数,并将其加上之前记录的字节数,即可计算出从哪个位置开始继续传输。 4.根据上述计算,设置新的"Range"请求头信息,继续发送请求。 5.接着继续下载或上传数据,直到完成。 通过上述逻辑,我们可以实现在网络传输中断后,能够从断点处继续传输的功能。同时,我们还可以根据具体需求,加入一些错误处理和进度条显示等功能,以提升用户体验。 总之,利用QNetworkAccessManager的网络请求、响应和数据读取等功能,结合HTTP协议中的"Range"请求头信息,我们可以实现断点续传的功能,提高网络传输的效率和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值