web-dev-qa-db-fra.com

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

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 lenteur (80-120 Ko/sec) TCP se brise de manière aléatoire après 10-120 secondes (c'est le réseau d'une 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} &

Je devais ajouter --speed-limit 2048 --speed-time 10 car la connexion se bloque généralement pendant quelques minutes lorsqu'elle échoue.

Mais récemment, même ce script ne peut pas être terminé.

Un problème est qu'il semble ignorer le -C - part, 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 que le --range et le -C les options 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.

31
Crouching Kitten

lftp ( Wikipedia ) est bon pour cela. 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"'
35

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

Utilisation -C - pour dire à curl de trouver 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 afin 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 l'ensemble du fichier. Pas si lent, bien que j'apprécie que vous vous souciez plus de la fiabilité que de la vitesse.

12
roaima

Vous avez peut-être plus de chance avec wget --continue:

wget --continue ${URL}

Voir aussi https://www.cyberciti.biz/tips/wget-resume-broken-download.html

8
Alex338207

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.

4
Loren Pechtel

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 de téléchargement de fichiers plus gros qu'env 1 Go avant que la connexion ne s'éteigne. Puisqu'ils ont utilisé le fichier copier/coller standard 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 renvoyé tout ce dont nous avions besoin à un NAS au bureau. Non seulement le problème de plus de 3 heures de transmission a été résolu, mais j'ai été épargné le 1-2 heures pour envoyer les données en cas de crise. À 8 heures du matin, 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 rencontrez une 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 définie sur uniquement synchroniser les modifications dans le fichier (comme dans une sauvegarde différentielle) ... éventuellement en résolvant une partie de votre problème de bande passante.

3
Tylon Foxx

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 qui prenaient les téléphones et bombardaient la connexion étaient la norme. Ça pourrait valoir la peine d'essayer.

1
BoredBsee

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, d'autre part, vous permet de réussir le transfert de fichiers et les meilleures performances possibles sur une connexion donnée. "

0
Wallace Howery