Télécharger un gros fichier sur une mauvaise connexion

30

Existe-t-il un outil existant, qui peut être utilisé pour télécharger de gros fichiers via une mauvaise connexion?

Je dois télécharger régulièrement un fichier relativement petit: 300 Mo, mais la connexion TCP lente (80-120 Ko / sec) se brise de manière aléatoire après 10-120 secondes. (C'est un réseau de grande entreprise. Nous avons contacté leurs administrateurs (travaillant depuis l'Inde) plusieurs fois, mais ils ne peuvent ou ne veulent rien faire.) Le problème pourrait être avec leurs proxys inverses / équilibreurs de charge.

Jusqu'à présent, j'utilisais une version modifiée de pcurl: https://github.com/brunoborges/pcurl

J'ai changé cette ligne:

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

pour ça:

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

J'ai dû ajouter --speed-limit 2048 --speed-time 10car la connexion se bloque généralement pendant des minutes lorsqu'elle échoue.

Mais récemment, même ce script ne peut pas se terminer.

Un problème est qu'il semble ignorer la -C -partie, donc il ne "continue" pas le segment après une nouvelle tentative. Il semble tronquer le fichier temporaire correspondant et recommencer depuis le début après chaque échec. (Je pense --rangeque les -Coptions et ne peuvent pas être utilisées ensemble.)

L'autre problème est que ce script télécharge tous les segments en même temps. Il ne peut pas avoir 300 segments, dont seulement 10 sont téléchargés à la fois.

Je pensais écrire un outil de téléchargement en C # dans ce but spécifique, mais s'il existe un outil existant, ou si la commande curl pouvait fonctionner correctement avec différents paramètres, alors je pourrais gagner du temps.

MISE À JOUR 1: Informations supplémentaires: La fonctionnalité de téléchargement parallèle ne doit pas être supprimée, car ils ont une limite de bande passante (80-120 Ko / s, principalement 80) par connexion, donc 10 connexions peuvent entraîner une accélération de 10 fois. Je dois terminer le téléchargement du fichier en 1 heure, car le fichier est généré toutes les heures.

Chaton accroupi
la source
4
La seule option pour accéder aux fichiers via FTP / HTTP? Vous ne pouvez pas utiliser quelque chose comme rsync(qui vous permettra de redémarrer les transferts)? lftppermet également de redémarrer automatiquement les transmissions.
Kusalananda
Oui, ils ont restreint tout accès à HTTPS à leurs serveurs il y a quelques années. BTW le serveur permet de redémarrer à une position spécifique, pcurl en fait usage.
Crouching Kitten
1
Vous recherchez un outil en ligne de commande pour l'écriture de scripts? Parce que sinon, j'utiliserais simplement FileZilla ou un client ftp / sftp similaire qui prend en charge le redémarrage d'un téléchargement.
Bakuriu
5
"un fichier relativement petit: 300 Mo" Ah, façon de me faire sentir vieux :)
Courses de légèreté avec Monica
4
Aussi, wow, c'est ... un réseau épouvantable.
Courses de légèreté avec Monica

Réponses:

33

lftp( Wikipedia ) est bon pour ça. Il prend en charge un certain nombre de protocoles, peut télécharger des fichiers à l'aide de plusieurs connexions parallèles simultanées (utile lorsque la perte de paquets n'est pas causée par la congestion) et peut reprendre automatiquement les téléchargements. Il est également scriptable.

Ici, y compris le réglage fin que vous avez trouvé (crédits à vous):

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
la source
Merci. J'ai essayé, mais il ne semble pas utiliser de connexions parallèles: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, quand j'ai supprimé le paramètre "net: timeout", il est devenu parallèle. Mais cela ralentit après un certain temps. Je pense que les connexions commencent à "se bloquer".
Crouching Kitten
1
Cela fonctionne parfaitement avec le net:idlecadre. Merci! J'ajouterai ma solution à la question.
Crouching Kitten
1
Notez que lftp prend en charge torrent comme protocole de transfert sous-jacent. Utilise le. Tous les autres protocoles qu'il prend en charge ne prennent pas en charge la détection / correction d'erreurs par bloc et s'appuient sur TCP pour fournir une détection d'erreurs. Notez que torrent utilise la détection d'erreurs TCP mais en plus vérifie le hachage sha1 de tout votre fichier et également chaque bloc transféré sur le réseau. D'après mon expérience, un film de 4 Go torrenté sur un réseau 4G comporte généralement environ deux erreurs de vérification du hachage - cela signifie que TCP a considéré que le paquet reçu était exempt d'erreurs même s'il était corrompu
slebetman
1
@slebetman, ici l'OP utilise HTTPS. TLS fournit un contrôle d'intégrité supplémentaire (par rapport à la somme de contrôle faible de TCP) via HMAC. HTTP prend également en charge le total de contrôle du contenu ou des morceaux avec les en Content-MD5- Digesttêtes et (bien que je ne sais pas si les lftpprend en charge ou s'ils seraient utilisés dans le cas de l'OP). Dans tous les cas, il ne semble pas que torrent soit une option pour l'OP.
Stéphane Chazelas
12

Je ne peux pas tester cela pour vous dans votre situation, mais vous ne devriez pas l'utiliser --rangeavec -C -. Voici ce que la page de manuel a à dire sur le sujet:

Utilisez -C -pour indiquer curlpour savoir automatiquement où / comment reprendre le transfert. Il utilise ensuite les fichiers de sortie / d'entrée donnés pour comprendre cela.

Essayez plutôt ceci:

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

Je vous recommande également fortement de toujours citer deux fois vos variables pour que le shell n'essaye pas de les analyser. (Considérez une URL https://example.net/param1=one&param2=two, où le shell diviserait la valeur en &.)

Soit dit en passant, 120 Ko / s est d'environ 1,2 Mo / s, ce qui est une vitesse de téléchargement xDSL typique dans de nombreuses régions du monde. 10 secondes par Mo, donc un peu moins d'une heure pour tout le fichier. Pas si lent, bien que j'apprécie que vous vous souciez plus de la fiabilité que de la vitesse.

roaima
la source
2
Merci. Cette approche fonctionnerait, mais elle est lente, car elle ne se télécharge pas en parallèle. Ils ont une limite de vitesse par connexion, et je dois terminer le téléchargement en 1 heure, car ils génèrent toutes les heures le fichier. Mise à jour de la question.
Crouching Kitten
4

En dehors de la boîte: mettez un cache-œil et utilisez bittorrent. Réduisez la taille du bloc lorsque vous créez le torrent. Évidemment, cryptez le fichier pour que quiconque trouve le torrent n'ait rien d'utile.

Loren Pechtel
la source
1
C'est la société rare qui distribue en interne des fichiers sur torrent.
RonJohn
5
Exactement. Même si la connexion est vraiment mauvaise et que le fichier a été endommagé, cela devrait fonctionner correctement. CONSEIL DE PRO: cryptez-le, renommez-le en «KimKardashianNude.mp4» et laissez des milliers de personnes vous aider avec la connexion. Sauvegarde automatique et distribuée gratuite! :)
Eric Duminil
Comme l'a dit Linus lui-même - "Seuls les mauviettes utilisent la sauvegarde sur bande: les vrais hommes téléchargent simplement leurs trucs importants sur ftp, et laissent le reste du monde les refléter;)"
ivanivan
@ RonJohn Je sais que ce n'est pas couramment utilisé, mais cela ne signifie pas qu'il ne pourrait pas être utilisé. Le protocole bittorrent est très bon pour supporter les mauvaises connexions.
Loren Pechtel
@ LorenPechtel un bon de travail pour RISK pour approuver les ports, un WO pour le NOC pour ouvrir les ports, et des WO pour les équipes Linux et Windows pour installer les clients torrent, et un autre WO pour les surveiller tous afin que seuls les fichiers approuvés soient en cours transféré. Et rien de tout cela ne prend en compte HIPPA, PCI ou le fait qu'un fichier censé aller du point A au point B va maintenant du point A aux points C, D, E, F, G, H, I et J avant arriver au point B. RISQUE désapprouvera pour cette raison.
RonJohn
3

J'ai eu le même problème dans mon travail précédent (sauf avec 300 Go + sauvegardes de base de données hors site sur une connexion instable (depuis le bureau)). Les utilisateurs ont eu de graves problèmes pour télécharger des fichiers plus gros qu'environ. 1 Go avant que la connexion ne s'éteigne. Puisqu'ils ont utilisé le fichier standard copier / coller de Windows sur une connexion RDP, pas étonnant.

Une chose que j'ai découvert, c'est que nos paramètres VPN étaient complètement incompatibles avec la configuration du réseau (principalement la longueur MTU). La deuxième chose est que le copieur de fichiers de Windows n'est PAS fait pour copier des trucs sur Internet.

Ma première solution était un simple serveur FTP, cependant, cela n'a pas résolu le problème du temps de transmission (souvent 3-4 heures sur notre connexion).

Ma deuxième solution consistait à utiliser Syncthing pour envoyer les fichiers directement à un NAS interne. Chaque nuit, une fois les sauvegardes terminées, Syncthing a envoyé tout ce dont nous avions besoin à un NAS du bureau. Non seulement le problème de plus de 3 heures de transmission a été résolu, mais j'ai été épargné les 1-2 heures pour envoyer les données par courrier en cas de crise. À 8 h tous les matins, les fichiers étaient mis à jour sur le NAS et nous avions nos sauvegardes prêtes. Même avec des fichiers énormes (à un moment donné, une base de données de près de 700 Go), je n'ai pas encore rencontré de corruption de fichier ou d'autres problèmes ...

Syncthing est très facile à configurer et à gérer et est disponible pour toutes les plates-formes (même les téléphones), et a une très bonne gestion des mauvaises connexions .. si la connexion échoue, Syncthing attend simplement quelques minutes et réessaye.

Vous avez besoin d'un dossier local pour synchroniser les choses, mais vos fichiers seront disponibles presque dès qu'ils seront mis à jour.

Une autre bonne chose à propos de la synchronisation, c'est qu'elle peut être configurée pour synchroniser uniquement les modifications dans le fichier (comme dans une sauvegarde différentielle) ... en résolvant éventuellement une partie de votre problème de bande passante.

Tylon Foxx
la source
+1 pour avoir mentionné la synchronisation - une alternative google drive / dropbox pour les sauvegardes
Edward Torvalds
1

Vous pourriez envisager une solution à l'ancienne pour déplacer des fichiers sur une connexion moche - zmodem .

Cela a été développé à l'époque où les modems à 2400 bauds avec des gens prenant les téléphones et bombardant la connexion étaient la norme. Ça pourrait valoir la peine d'essayer.

BoredBsee
la source
0

Vous pouvez essayer d'utiliser Kermit :

La caractéristique qui distingue le protocole Kermit de la plupart des autres est sa large gamme de paramètres pour permettre l'adaptation à tout type et qualité de connexion entre deux types d'ordinateurs - longueur de paquet, encodage de paquet, taille de fenêtre, jeu de caractères, méthode de détection d'erreur, délais d'attente , marque une pause. La plupart des autres protocoles sont conçus pour fonctionner uniquement sur certains types ou qualités de connexions, et / ou entre certains types d'ordinateurs ou des systèmes de fichiers similaires, et fonctionnent donc mal (ou pas du tout) ailleurs et offrent peu ou pas de méthodes pour s'adapter aux imprévus -pour les situations. Kermit, quant à lui, vous permet de réussir le transfert de fichiers et les meilleures performances possibles sur une connexion donnée. "

Wallace Howery
la source