HTTP文件传输-分块传输之断点续传原理分析

时间:2024-03-26 11:41:57

前言

断点续传是一种提高文件传输效率的重要方法,当我们下载资源时很有可能因为断网等原因导致下载中断,那么我们最希望的肯定是重新联网后继续上一次下载,而不是要重新下载,万一我们已经下载了99%,让我们重新下载那岂不是太令人头秃了
HTTP文件传输-分块传输之断点续传原理分析
断点续传相关的 header 信息:Accept-Ranges,If-Range,Range,Etag,Last-Modified,Content-Range

原理解释

第一步: 浏览器向服务器发送请求,请求格式如下:

/cx.zip:申请资源的相对路径,请求下载文件名为 cx.zip 的文件

GET /cx.zip HTTP/1.1
Host: 39.107.14.0:9090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3
Referer: http://39.107.14.0:9090/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

第二步: 服务器针对请求发送响应,开始下载

Accept-Ranges: bytes 表示服务器支持断点续传,并且数据传输以字节为单位
ETag: “102039-e5f47-5da2c691” ETag内容是程序猿自己规定,用于断点续传时验证文件是否被修改过,如果修改过就只能重新从头下载
Last-Modified: Sun, 13 Oct 2019 06:39:13 GMT 文件的最后一次修改时间

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: application/octet-stream
Connection: close
Content-Length: 941895
ETag: “102039-e5f47-5da2c691”
Last-Modified: Sun, 13 Oct 2019 06:39:13 GMT
Date: Sun, 13 Oct 2019 08:27:27 GMT

第三步: 此时,断网了,下载中断,然后重新联网,想要继续下载,浏览器会再次发送请求,相比于之前多了两条信息
If-Range: “102039-e5f47-5da2c691” If-Range的内容就是服务器返回给浏览器的Etag内容,比较If-Range和现在浏览器中Etag的内容来确定文件资源是否修改过
Range: bytes=361760- Range是请求的数据范围,361760- 指的是从361760开始到最后

GET /cx.zip HTTP/1.1
Host: 39.107.14.0:9090
Connection: keep-alive
Range: bytes=361760-
If-Range: “102039-e5f47-5da2c691”
Accept-Encoding: identity
Referer: http://39.107.14.0:9090/
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
Accept-Language: zh-CN,zh;q=0.9

第四步: 服务器收到请求,返回响应,和之前不同的是:
206 此时返回的状态码变为了206,代表部分内容
Content-Range: bytes 361760-941894/941895 Content-Range是返回的数据范围,从361760开始到941894,两头都是闭区间,总大小为941895

HTTP/1.1 206 Partial Content
Content-Range: bytes 361760-941894/941895
Accept-Ranges: bytes
Content-Type: application/octet-stream
Connection: close
Content-Length: 580135
ETag: “102039-e5f47-5da2c691”
Last-Modified: Sun, 13 Oct 2019 06:39:13 GMT
Date: Sun, 13 Oct 2019 08:27:45 GMT

注意:
Etag 和 If-Range 相对应,浏览器将服务器响应的Etag保存在If-Range中,用于下次判断文件是否被修改,没有被修改浏览器可以使用缓存

Last-Modified 和 If-Modified-Since 相对应,浏览器将服务器响应的Last-Modified保存在If-Modified-Since中,通过时间判断文件是否为最新,是最新浏览器可以使用缓存