支持断点续传的文件传输程序如何确定追加数据的起始位置?
聊聊rsync、curl这类工具的断点续传原理与细节
刚好对这块有点研究,来给你掰扯掰扯rsync和curl这类文件传输工具的断点续传是怎么玩的~
首先得明确这类工具的核心逻辑:传输中断后,它们不会傻乎乎从头重传,而是先校验目标端已有的文件片段,算出已经成功传输的字节数,接着从源端对应位置读取剩余数据,直接追加到目标文件的片段后面——这就是断点续传的核心思路。
下面分工具具体说:
curl的断点续传玩法
- 要让curl启用断点续传,主要靠
-C(或者全称--continue-at)参数。比如你之前用命令:
传输中途断了?没关系,重新跑的时候加个curl http://example.com/large-file.iso -o local-file.iso-C -就行:
这时候curl会自动检查你本地那个不完整的curl -C - http://example.com/large-file.iso -o local-file.isolocal-file.iso的大小,然后向服务器发送Range请求,告诉服务器“我要从第X字节开始的内容”,服务器支持的话就会返回剩余部分,curl直接追加到本地文件后面。 - 要是服务器不支持
Range请求头,那curl就没办法断点续传,只能乖乖从头开始传。 - 关于失败后的清理:curl默认不会自动删除传输中断产生的不完整文件——毕竟留着它才能用来续传嘛,除非你手动删除或者加了特定清理参数。
rsync的断点续传逻辑
rsync的断点续传其实是它增量同步能力的延伸,逻辑比curl更严谨:
- 默认情况下,rsync如果传输大文件中途中断,会自动删除那个不完整的临时文件,所以要保留片段用来续传的话,得加
--partial参数。比如:
这样传输中断后,目标端的不完整文件会被保留,下次再运行相同的rsync命令,它会对比源文件和目标端的片段,计算出未传输的部分,只传剩下的字节。rsync --partial /path/to/source/large-file /path/to/target/ - 你还可以用
--partial-dir指定一个临时目录来存放不完整文件,避免这些片段和正常文件混在一起,比如:rsync --partial-dir=.rsync-partials /path/to/source/large-file /path/to/target/ - 清理情况:没加
--partial的话,传输失败后rsync会自动删掉临时片段;加了参数就会保留。另外rsync还会校验文件的哈希值,确保已传输的片段没有损坏,这点比curl更靠谱——毕竟如果片段本身坏了,续传出来的文件也是错的。
一些额外细节
- 不是所有场景都能顺利续传:如果传输中断后源文件被修改了,rsync会重新对比文件内容,可能会重新传输差异部分甚至整个文件;而curl只看目标文件的大小,不会校验内容,这时候续传出来的文件可能会有拼接错误。
- 类似的工具比如wget,用
-c参数也能实现断点续传,原理和curl差不多。
内容的提问来源于stack exchange,提问作者the_velour_fog
相关产品推荐
相关产品推荐

