Große Datei über schlechte Verbindung herunterladen

30

Gibt es ein vorhandenes Tool, mit dem große Dateien über eine schlechte Verbindung heruntergeladen werden können?

Ich muss regelmäßig eine relativ kleine Datei herunterladen: 300 MB, aber die langsame (80-120 KByte / s) TCP-Verbindung wird nach 10-120 Sekunden zufällig unterbrochen. (Es handelt sich um ein Netzwerk eines großen Unternehmens. Wir haben mehrere Male mit den (aus Indien stammenden) Administratoren Kontakt aufgenommen, aber sie können oder wollen nichts tun.) Möglicherweise liegt das Problem bei ihren Reverse-Proxies / Load-Balancern.

Bisher habe ich eine modifizierte Version von pcurl verwendet: https://github.com/brunoborges/pcurl

Ich habe diese Zeile geändert:

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

dazu:

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} &

Ich musste hinzufügen, --speed-limit 2048 --speed-time 10weil die Verbindung meist nur für Minuten hängt, wenn es fehlschlägt.

Aber in letzter Zeit kann auch dieses Skript nicht abgeschlossen werden.

Ein Problem ist, dass es das -C -Teil zu ignorieren scheint , so dass es das Segment nach einem erneuten Versuch nicht "fortsetzt". Es scheint die zugehörige temporäre Datei abzuschneiden und nach jedem Fehler von vorne zu beginnen. (Ich denke , das --rangeund die -COptionen können nicht zusammen verwendet werden.)

Das andere Problem ist, dass dieses Skript alle Segmente gleichzeitig herunterlädt. Es kann nicht über 300 Segmente verfügen, von denen jeweils nur 10 heruntergeladen werden.

Ich dachte daran, ein Download-Tool in C # für diesen speziellen Zweck zu schreiben, aber wenn es ein vorhandenes Tool gibt oder der Befehl curl mit verschiedenen Parametern ordnungsgemäß funktionieren könnte, könnte ich etwas Zeit sparen.

UPDATE 1: Zusätzliche Informationen: Die Funktion zum parallelen Herunterladen sollte nicht entfernt werden, da für jede Verbindung eine Bandbreitenbeschränkung (80-120 KB / s, meistens 80) gilt, sodass 10 Verbindungen eine 10-fache Geschwindigkeit verursachen können. Ich muss den Dateidownload in 1 Stunde abschließen, da die Datei stündlich generiert wird.

Hockendes Kätzchen
quelle
4
Ist die einzige Möglichkeit, über FTP / HTTP auf die Dateien zuzugreifen? Sie können so etwas nicht verwenden rsync(wodurch Sie Übertragungen neu starten können)? lftpErmöglicht auch den automatischen Neustart von Übertragungen.
Kusalananda
Ja, sie haben vor einigen Jahren den gesamten Zugriff auf HTTPS auf ihre Server beschränkt. BTW der Server erlaubt einen Neustart an einer bestimmten Position, pcurl macht davon Gebrauch.
Crouching Kitten
1
Sie suchen ein Kommandozeilen-Tool für die Skripterstellung? Denn sonst würde ich einfach FileZilla oder einen ähnlichen FTP / SFTP-Client verwenden, der den Neustart eines Downloads unterstützt.
Bakuriu
5
"eine relativ kleine Datei: 300 MB" Ah, so dass ich mich alt fühle :)
Lightness Races mit Monica
4
Wow, das ist ein schreckliches Netzwerk.
Leichtigkeit Rennen mit Monica

Antworten:

33

lftp( Wikipedia ) ist dafür gut. Es unterstützt eine Reihe von Protokollen, kann Dateien über mehrere parallele Verbindungen herunterladen (nützlich, wenn ein großer Paketverlust nicht durch Überlastung verursacht wird) und das Herunterladen automatisch fortsetzen. Es ist auch skriptfähig.

Hier einschließlich der Feinabstimmung, die Sie vorgenommen haben (Dank an Sie):

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"'
Stéphane Chazelas
quelle
Vielen Dank. Ich habe es versucht, aber es scheint keine parallelen Verbindungen zu verwenden: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'
Crouching Kitten
Oh, als ich die Einstellung "net: timeout" entfernt habe, wurde es parallel. Aber es verlangsamt sich nach einer Weile. Ich denke, weil die Verbindungen anfangen zu "hängen".
Crouching Kitten
1
Es funktioniert perfekt mit der net:idleEinstellung. Vielen Dank! Ich werde meine Lösung der Frage hinzufügen.
Crouching Kitten
1
Beachten Sie, dass lftp Torrent als zugrunde liegendes Übertragungsprotokoll unterstützt. Benutze es. Alle anderen unterstützten Protokolle unterstützen keine Erkennung / Korrektur von Chunk-Fehlern und verlassen sich auf TCP, um die Fehlererkennung zu ermöglichen. Beachten Sie, dass Torrent die TCP-Fehlererkennung verwendet, aber zusätzlich den sha1-Hash Ihrer gesamten Datei und auch jeden über das Netzwerk übertragenen Block überprüft. Nach meiner Erfahrung ein 4 GB Film typischerweise um zwei Hash - Verifizierungsfehler haben über ein 4G - Netz torrented - das bedeutet TCP das empfangene Paket als Fehler , frei zu sein , auch wenn sie beschädigt wurden
slebetman
1
@slebetman, hier verwendet das OP HTTPS. TLS bietet eine zusätzliche Integritätsprüfung (über die schwache Prüfsumme von TCP) über HMAC. Auch HTTP unterstützt das Überprüfen von Inhalten oder Chunks mit den Headern Content-MD5und Digest(obwohl ich nicht weiß, ob diese lftpunterstützt werden oder ob sie im Fall des OP verwendet werden würden). Auf jeden Fall sieht es nicht so aus, als wäre Torrent eine Option für das OP.
Stéphane Chazelas
12

Ich kann dies in Ihrer Situation nicht für Sie testen, aber Sie sollten es nicht --rangemit verwenden -C -. Hier ist, was die Manpage zu diesem Thema zu sagen hat:

Verwenden Sie -C -diese Option, curlum automatisch herauszufinden, wo und wie die Übertragung fortgesetzt werden soll. Es verwendet dann die angegebenen Ausgabe- / Eingabedateien, um dies herauszufinden.

Versuchen Sie dies stattdessen:

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

Ich würde auch dringend empfehlen, dass Sie Ihre Variablen immer in doppelte Anführungszeichen setzen, damit die Shell nicht versucht, sie zu analysieren. (Betrachten Sie eine URL https://example.net/param1=one&param2=two, unter der die Shell den Wert aufteilen würde &.)

Übrigens sind 120 KB / s ungefähr 1,2 MB / s, was in vielen Teilen der Welt eine typische xDSL-Upload-Geschwindigkeit ist. 10 Sekunden pro MB, also etwas weniger als eine Stunde für die gesamte Datei. Nicht so langsam, obwohl ich es zu schätzen weiß, dass es Ihnen mehr um Zuverlässigkeit als um Geschwindigkeit geht.

Roaima
quelle
2
Vielen Dank. Dieser Ansatz würde funktionieren, ist aber langsam, da nicht gleichzeitig heruntergeladen wird. Sie haben eine Geschwindigkeitsbegrenzung pro Verbindung und ich muss den Download in 1 Stunde abschließen, da sie die Datei stündlich generieren. Aktualisieren der Frage.
Crouching Kitten
4

Außerhalb der Box: Setzen Sie eine Augenklappe auf und verwenden Sie Bittorrent. Machen Sie die Blockgröße klein, wenn Sie den Torrent erstellen. Verschlüsseln Sie die Datei natürlich, damit jeder andere, der den Torrent findet, nichts Nützliches bekommt.

Loren Pechtel
quelle
1
Es ist das seltene Unternehmen, das Dateien intern über Torrents verteilt.
RonJohn
5
Genau. Auch wenn die Verbindung wirklich schlecht ist und die Datei irgendwie beschädigt wurde, sollte es gut funktionieren. PRO-TIPP: Verschlüsseln Sie es, benennen Sie es in "KimKardashianNude.mp4" um und lassen Sie sich von Tausenden von Personen bei der Verbindung helfen. Automatisches, verteiltes Backup kostenlos! :)
Eric Duminil
Wie Linus selbst sagte - "Nur Weicheier verwenden Tape Backup: Echte Männer laden ihre wichtigen Sachen einfach auf FTP
hoch
@ RonJohn Ich weiß, dass es nicht allgemein verwendet wird, aber das bedeutet nicht, dass es nicht verwendet werden kann. Das Bittorrent-Protokoll ist sehr gut darin, schlechte Verbindungen zu ertragen.
Loren Pechtel
@LorenPechtel ein Arbeitsauftrag für das RISIKO, um die Ports zu genehmigen, eine WO für das NOC, um die Ports zu öffnen, und WOs für die Linux- und Windows-Teams, um die Torrent-Clients zu installieren, und eine weitere WO, um sie alle zu überwachen, damit nur genehmigte Dateien vorliegen übertragen. Dabei werden weder HIPPA, PCI noch die Tatsache berücksichtigt, dass eine Datei, die von Punkt A nach Punkt B verschoben werden soll, jetzt von Punkt A nach Punkt C, D, E, F, G, H, I und J übertragen wird Wenn Sie zu Punkt B kommen, wird RISK genau aus diesem Grund ablehnen.
RonJohn
3

Ich hatte das gleiche Problem in meinem vorherigen Job (außer bei externen Datenbank-Backups mit mehr als 300 GB auf einer (vom Büro aus) instabilen Verbindung). Benutzer hatten schwerwiegende Probleme beim Herunterladen von Dateien, die größer als ca. 1 GB, bevor die Verbindung unterbrochen wurde. Kein Wunder, da sie die Standard-Windows-Datei zum Kopieren und Einfügen über eine RDP-Verbindung verwendeten.

Eine Sache, die ich herausfand, war, dass unsere VPN-Einstellungen vollständig nicht mit dem Netzwerk-Setup übereinstimmten (hauptsächlich die MTU-Länge). Die zweite Sache ist, dass der Windows-Dateikopierer NICHT zum Kopieren von Dingen über das Internet gedacht ist.

Meine erste Lösung war ein einfacher FTP-Server, der jedoch das Problem der Übertragungszeit nicht löste (häufig 3-4 Stunden bei unserer Verbindung).

Meine zweite Lösung bestand darin, mit Syncthing die Dateien direkt an ein internes NAS zu senden. Jede Nacht nach Abschluss der Backups schickte Syncthing alles, was wir brauchten, zurück zu einem NAS im Büro. Das Problem der mehr als 3-stündigen Übertragungszeit wurde nicht nur gelöst, es wurden mir auch 1 bis 2 Stunden Zeit gespart, um die Daten im Falle einer Krise zu übermitteln. Jeden Morgen um 8:00 Uhr wurden die Dateien auf dem NAS aktualisiert, und wir hatten unsere Backups fertig. Selbst bei großen Dateien (an einer Stelle eine Datenbank mit fast 700 GB) habe ich noch keine Dateibeschädigung oder andere Probleme ...

Syncthing ist sehr einfach einzurichten und zu verwalten, für alle Plattformen (auch für Telefone) verfügbar und kann sehr gut mit schlechten Verbindungen umgehen. Wenn die Verbindung fehlschlägt, wartet Syncthing einfach ein paar Minuten und versucht es erneut.

Sie benötigen einen lokalen Ordner, mit dem Sie die Daten synchronisieren können, aber Ihre Dateien sind fast verfügbar, sobald sie aktualisiert werden.

Eine weitere gute Sache bei der Synchronisierung ist, dass sie so eingestellt werden kann, dass nur die Änderungen in der Datei synchronisiert werden (wie bei einer differenziellen Sicherung). Dies kann möglicherweise einen Teil Ihres Bandbreitenproblems lösen.

Tylon Foxx
quelle
+1 für die Erwähnung von Syncthing - eine Google Drive / Dropbox-Alternative für Backups
Edward Torvalds
1

Sie könnten eine alte Lösung für das Verschieben von Dateien über eine miese Verbindung in Betracht ziehen - zmodem .

Dies wurde entwickelt, als 2400-Baud-Modems, bei denen die Telefonhörer abgenommen und die Verbindung abgebombt wurde, die Norm waren. Könnte einen Versuch wert sein.

BoredBsee
quelle
0

Sie könnten versuchen, Kermit zu verwenden :

Das Merkmal, das das Kermit-Protokoll von den meisten anderen unterscheidet, ist sein breiter Einstellungsbereich, der die Anpassung an jede Art und Qualität der Verbindung zwischen zwei Arten von Computern ermöglicht - Paketlänge, Paketkodierung, Fenstergröße, Zeichensatz, Fehlererkennungsmethode, Zeitüberschreitung pausiert. Die meisten anderen Protokolle funktionieren nur auf bestimmten Arten oder Qualitäten von Verbindungen und / oder zwischen bestimmten Arten von Computern oder ähnlichen Dateisystemen und funktionieren daher an anderer Stelle schlecht (oder gar nicht) und bieten nur wenige oder gar keine Methoden zur Anpassung an ungeplante Situationen -für Situationen. Mit Kermit hingegen können Sie eine erfolgreiche Dateiübertragung und die höchstmögliche Leistung für jede Verbindung erzielen. "

Wallace Howery
quelle