现在的文件上传下载功能,都是支持断点续传的。那么这看似很简单的小功能,背后实现的原理是怎样的呢?
断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。
断点续传的原理如下:
由于浏览器与服务端的通讯是基于HTTP协议,所以断点续传功能的原理就是靠HTTP请求来实现。
断点续传功能最核心的原理就是利用HTTP请求中的两个字段:客户端请求头中的Range,和服务端响应头的Content-Range。
我们举一个例子,模拟一下整个过程。
1、浏览器请求服务器上的一个文件时,所发出的请求如下(假设文件名为 file.zip,服务器域名为W):
GET /file.zip HTTP/1.1 //浏览器用GET方式获取file.zip文件,HTTP协议版本1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint //可接受的响应内容(文件)类型
Accept-Language: zh-cn //可接受的响应内容语言(简体中文)
Accept-Encoding: gzip, deflate //可接受的响应内容的编码方式
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) //浏览器的身份标识(浏览器类型)
Connection: Keep-Alive //浏览器想要优先使用的连接类型
2、服务器收到请求后,寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
200 //响应状态码(200标识成功)
Content-Length=123456789 //响应消息的长度(单位是字节)
Accept-Ranges=bytes //服务器所支持的内容范围(字节)
Date=Mon, 30 Apr 2001 12:56:11 GMT //此消息被发送时的日期和时间
ETag=W/“02ca57e173c11:95b” //资源的标识符
Content-Type=application/octet-stream //当前内容的类型
Server=Microsoft-IIS/5.0 //服务器名称
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT //所请求的对象的最后修改日期
3、此时文件已经开始下载了,如果现在停止了下载,那么再次下载文件时就要从已经下载的地方继续下载。现在比如按下了继续下载,那么此时浏览器的请求内容如下:
GET /file.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint
Range: bytes=200000- //告诉服务器 file.zip 这个文件从200000字节开始传,前面的字节不用传了
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive
4、此时服务器收到这个请求后,返回的信息如下:
206 //表示服务器已经成功处理了部分GET请求
Content-Length=123256789
Content-Range=bytes 200000-/123456789 //表示已经返回了200000B的文件数据,同时也返回了文件的全部大小
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/“02ca57e173c11:95b”
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
以上就是断点续传的原理,在不同客户端实现时只需要找到不同的开发语言实现提交Range的方法即可。
作为产品功能的设计者,每一个看似简单的小功能,其背后的实现原理都值得我们去研究,正所谓“知其然,更要知其所以然”。