通过错误的连接下载大文件


30

有没有可用的现有工具,可以通过错误的连接下载大文件?

我必须定期下载一个相对较小的文件:300 MB,但是慢速(80-120 KB /秒)的TCP连接会在10-120秒后随机中断。(这是一个大公司的网络。我们多次联系了他们的管理员(在印度工作),但他们不能或不想做任何事情。)问题可能出在他们的反向代理/负载平衡器上。

到目前为止,我使用的是pcurl的修改版本:https : //github.com/brunoborges/pcurl

我更改了这一行:

curl -s --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &

对此:

curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
    --retry-max-time 0 -C - --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &

我必须添加,--speed-limit 2048 --speed-time 10因为连接失败时大部分时间只会挂起几分钟。

但是最近,即使这个脚本也无法完成。

一个问题是它似乎忽略了该-C -零件,因此它在重试后不会“继续”该段。似乎会截断相关的临时文件,并在每次失败后从头开始。(我认为--range-C选项不能一起使用。)

另一个问题是此脚本同时下载所有段。它不能有300个段,一次只能下载10个。

我当时正在考虑为此目的用C#编写下载工具,但是如果有现有工具,或者curl命令可以在不同的参数下正常工作,那么我可以节省一些时间。

更新1:附加信息:不应删除并行下载功能,因为每个连接具有带宽限制(80-120 KB /秒,主要是80),因此10个连接可以使速度提高10倍。我必须在1小时内完成文件下载,因为该文件每小时生成一次。


4
是通过FTP / HTTP访问文件的唯一选择吗?您不能使用类似的东西rsync(它将让您重新开始传输)?lftp还允许自动重启传输。
Kusalananda

是的,几年前,他们将所有对HTTPS的访问都限制在其服务器上。顺便说一句,服务器允许在特定位置重新启动,pcurl会利用它。
蹲着的小猫,

1
您是否正在寻找用于脚本编写的命令行工具?因为否则我将只使用FileZilla或支持重启下载的类似ftp / sftp客户端。
巴库里

5
“一个相对较小的文件:300 MB”啊,让我觉得老的方式:)
Lightness与Monica赛跑

4
另外,哇,那是一个令人震惊的网络。
与莫妮卡(Monica)

Answers:


33

lftp维基百科)对此很有帮助。它支持多种协议,可以使用多个并发并行连接下载文件(在由于拥塞而导致大量数据包丢失的情况下很有用),并且可以自动恢复下载。也可以编写脚本。

这里包括您想出的微调(贷记给您):

lftp -c 'set net:idle 10
         set net:max-retries 0
         set net:reconnect-interval-base 3
         set net:reconnect-interval-max 3
         pget -n 10 -c "https://host/file.tar.gz"'

谢谢。我试过了,但是似乎没有使用并行连接:lftp -e 'set net:timeout 15; set net:max-retries 0; set net:reconnect-interval-base 3; set net:reconnect-interval-max 3; pget -n 10 -c "https://host/file.tar.gz"; exit'
蹲下的小猫

哦,当我删除“ net:timeout”设置时,它变成并行的。但是过了一会儿它变慢了。我认为是因为连接开始“挂起”。
卧虎藏龙的小猫

1
它与net:idle设置完美配合。谢谢!我将解决方案添加到该问题中。
卧虎藏龙的小猫

1
请注意,lftp支持torrent作为基础传输协议。用它。它支持的所有其他协议不支持每块错误检测/纠正,而是依靠TCP提供错误检测。请注意,torrent使用TCP错误检测,但在其最上层会验证整个文件的sha1哈希值以及网络上传输的每个块。在我的经验,4GB电影torrented在4G网络通常有前后两个哈希验证错误-这意味着TCP认为收到的数据包是无错,即使他们被损坏
slebetman

1
@slebetman,此处OP使用HTTPS。TLS通过HMAC提供了额外的完整性检查(通过TCP的弱校验和)。HTTP还支持使用Content-MD5Digest头对内容或块进行校验和(尽管我不知道是否lftp支持这些内容或块,或者在OP的情况下是否会使用它们)。无论如何,torrent都不是OP的选择。
斯特凡Chazelas

12

在您遇到的情况下,我无法为您测试此情况,但您不应将其--range与一起使用-C -。这是手册页关于此主题的内容:

使用 -C -告诉curl自动找出/如何恢复转让。然后,它使用给定的输出/输入文件来解决这一问题。

尝试以下方法:

curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
    --retry-max-time 0 -C - -o "${FILENAME}.part${i}" "${URL}" &

我也强烈建议您始终对变量加双引号,以使Shell不会尝试解析它们。(考虑一个URL https://example.net/param1=one&param2=two,shell将在其中拆分值&。)

顺便说一下,120 KB / s约为1.2 Mb / s,这是世界许多地方的典型xDSL上传速度。每MB 10秒,因此整个文件不到一小时。并不是那么慢,尽管我很欣赏您更关心可靠性而不是速度。


2
谢谢。这种方法可以工作,但是很慢,因为它不是并行下载的。它们每个连接都有速度限制,我必须在1小时内完成下载,因为它们每小时都会生成文件。更新问题。
蹲着的小猫,


4

在盒子外面:戴上眼罩并使用bittorrent。创建种子文件时,将块大小减小。显然,对文件进行加密可以使其他任何人在搜索torrent时都无用。


1
这是在内部通过torrent分发文件的罕见公司。
罗恩·约翰(RonJohn)

5
究竟。即使连接确实很差并且文件由于某种原因被损坏,它也可以正常工作。专业提示:对其进行加密,将其重命名为“ KimKardashianNude.mp4”,并让成千上万的人帮助您进行连接。免费的自动分布式备份!:)
埃里克·杜米尼尔

正如莱纳斯本人所说的那样-“只有w夫使用磁带备份:真正的男人只会将自己的重要内容上传到ftp上,然后让世界其他地方进行镜像;)”
ivanivan

@RonJohn我知道它不常用,但这并不意味着它不能使用。bittorrent协议非常擅长解决不良连接。
罗伦·佩希特尔

@LorenPechtel:一份有RISK批准端口的工作单,一个有NOC打开端口的WO,有一个Linux和Windows团队的WO来安装torrent客户端,另一个有WOW监视它们,以便仅批准文件转入。而且这些都没有考虑到HIPPA,PCI或应该从A点到B点的文件现在已经从A点转到C,D,E,F,G,H,I和J的事实出于这个原因,风险将被拒绝。
罗恩·约翰(RonJohn)

3

我在上一份工作中遇到了同样的问题(除了在(从办公室)不稳定的连接上进行300GB +的异地数据库备份外)。用户在下载大于大约文件的文件时遇到严重问题。拔出连接前1 GB。由于他们通过RDP连接使用了标准的Windows复制/粘贴文件,因此也就不足为奇了。

我发现的一件事是,我们的VPN设置与网络设置完全不匹配(主要是MTU长度)。第二件事是Windows的文件复印机不是用于通过Internet复制内容的。

我的第一个解决方案是一个简单的FTP服务器,但是它没有解决传输时间的问题(在我们的连接上通常需要3-4小时)。

我的第二个解决方案是使用Syncthing将文件直接发送到内部NAS。备份完成后的每个晚上,Syncthing会将我们需要的一切发送回办公室中的NAS。不仅解决了3个小时以上的传输时间问题,而且在发生危机时,我还节省了1-2个小时的时间来保证数据传输速度。每天早上8点,文件将在NAS上更新,我们已经准备好备份。即使有巨大的文件(某个时候几乎有700GB的数据库),我还没有遇到任何文件损坏或其他问题...

同步很容易设置和管理,并且适用于所有平台(甚至电话),并且可以很好地处理不良连接。如果连接失败,同步只需等待几分钟,然后重试。

您确实需要一个本地文件夹来将内容同步到其中,但是文件几乎在更新后即可使用。

同步的另一个好处是,可以将其设置为仅同步文件中的更改(例如差异备份中的...)……可能可以解决部分带宽问题。


+1提及同步-备用的Google驱动器/收件箱替代品
Edward Torvalds

1

您可能会考虑使用老式的解决方案来通过糟糕的连接-zmodem移动文件。

这是早在2400个波特调制解调器被人们接起电话并炸毁连接的情况下发展起来的。可能值得一试。


0

您可以尝试使用Kermit

Kermit协议与其他大多数协议的区别在于它的设置范围广,可以适应任何两种计算机之间的任何类型和质量的连接-包长度,包编码,窗口大小,字符集,错误检测方法,超时,暂停。大多数其他协议被设计为仅在某些种类或质量的连接上和/或在某些种类的计算机或类似文件系统之间起作用,因此在其他地方工作不佳(或根本不起作用),并且几乎没有提供任何方法来适应计划外的情况。 -针对情况。另一方面,Kermit允许您在任何给定的连接上实现成功的文件传输和最高的性能。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.