Chrome下载文件时暂停和继续是什么原理?

  • 这个问题很久前就研究过了,觉得挺有意思,这里总结记录一下
  • 所有的文字整理来源于: https://bbs.csdn.net/topics/392163074,感谢wjyiooo的耐心解答

Range

chrome 版本58

  1. 抓包确认,chrome点击暂停的时候会发送一系列窗口变动应答,将窗口降到5,并且不再应答ACK包。 当点击恢复的时候只是重新发送ACK给服务器,同时将窗口重新设置为256。
  2. 以上可以确认它的“续传”只是利用TCP滑动窗口的特性,跟断不断网没关系,也不属于真正意义的断点续传功能(一般用range头部实现)。当然如果你中断网络超过了服务器的TCP连接超时时间那么就不能续传了,而且如果关闭浏览器即使网络非常正常也不能续传(也是因为TCP连接断了)。
  3. 在等待足够长时间让TCP连接关掉后,chrome就可以断点续传了,原理也是头部带range。

总结

  1. 本地有临时下载文件
  2. 短时间内点继续,利用的是TCP滑动窗口的特性(与服务器未断开)
  3. 长时间之后点继续,再次发请求,带range头,继续下载剩余部分(与服务器断开)

扩展

使用Range进行多线程下载

  1. curl -H “Range: bytes=0-1551” http://127.0.0.1:8180/bg-upper.png -v -o 0-1151.png
  2. curl -H “Range: bytes=1552-3103” http://127.0.0.1:8180/bg-upper.png -v -o 1552-end.png
  3. 合并 cat 0-1151.png 1552-end.png > filename.png