- 这个问题很久前就研究过了,觉得挺有意思,这里总结记录一下
- 所有的文字整理来源于: https://bbs.csdn.net/topics/392163074,感谢wjyiooo的耐心解答
Range
- Range,是在 HTTP/1.1(http://www.w3.org/Protocols/rfc2616/rfc2616.html)里新增的一个 header field,也是现在众多号称多线程下载工具(如 FlashGet、迅雷等)实现多线程下载的核心所在。
chrome 版本58
- 抓包确认,chrome点击暂停的时候会发送一系列窗口变动应答,将窗口降到5,并且不再应答ACK包。 当点击恢复的时候只是重新发送ACK给服务器,同时将窗口重新设置为256。
- 以上可以确认它的“续传”只是利用TCP滑动窗口的特性,跟断不断网没关系,也不属于真正意义的断点续传功能(一般用range头部实现)。当然如果你中断网络超过了服务器的TCP连接超时时间那么就不能续传了,而且如果关闭浏览器即使网络非常正常也不能续传(也是因为TCP连接断了)。
- 在等待足够长时间让TCP连接关掉后,chrome就可以断点续传了,原理也是头部带range。
总结
- 本地有临时下载文件
- 短时间内点继续,利用的是TCP滑动窗口的特性(与服务器未断开)
- 长时间之后点继续,再次发请求,带range头,继续下载剩余部分(与服务器断开)
扩展
使用Range进行多线程下载
- Http 请求头 Range:https://www.cnblogs.com/1995hxt/p/5692050.html
- curl -H “Range: bytes=0-1551” http://127.0.0.1:8180/bg-upper.png -v -o 0-1151.png
- curl -H “Range: bytes=1552-3103” http://127.0.0.1:8180/bg-upper.png -v -o 1552-end.png
- 合并 cat 0-1151.png 1552-end.png > filename.png