Scarica file di grandi dimensioni su una connessione errata


30

Esiste uno strumento esistente che può essere utilizzato per scaricare file di grandi dimensioni tramite una connessione errata?

Devo scaricare regolarmente un file relativamente piccolo: 300 MB, ma la connessione TCP lenta (80-120 KByte / sec) si interrompe in modo casuale dopo 10-120 secondi. (È una rete di una grande azienda. Abbiamo contattato i loro amministratori (che lavorano dall'India) più volte, ma non possono o non vogliono fare nulla.) Il problema potrebbe essere con i loro proxy inversi / bilanciamento del carico.

Fino ad ora ho usato una versione modificata di pcurl: https://github.com/brunoborges/pcurl

Ho cambiato questa linea:

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

a questa:

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

Ho dovuto aggiungere --speed-limit 2048 --speed-time 10perché la connessione si blocca principalmente per pochi minuti quando non riesce.

Ma recentemente anche questo script non può essere completato.

Un problema è che sembra ignorare la -C -parte, quindi non "continua" il segmento dopo un nuovo tentativo. Sembra troncare il relativo file temporaneo e iniziare dall'inizio dopo ogni errore. (Credo che il --rangee le -Copzioni non possono essere usati insieme.)

L'altro problema è che questo script scarica tutti i segmenti contemporaneamente. Non può avere 300 segmenti, di cui solo 10 vengono scaricati alla volta.

Stavo pensando di scrivere uno strumento di download in C # per questo scopo specifico, ma se esiste uno strumento esistente o se il comando curl potrebbe funzionare correttamente con parametri diversi, allora potrei risparmiare un po 'di tempo.

AGGIORNAMENTO 1: Informazioni aggiuntive: la funzionalità di download parallelo non deve essere rimossa, poiché hanno un limite di larghezza di banda (80-120 Kbyte / sec, principalmente 80) per connessione, quindi 10 connessioni possono causare una velocità 10 volte. Devo terminare il download del file in 1 ora, perché il file viene generato ogni ora.


4
È l'unica opzione per accedere ai file su FTP / HTTP? Non puoi usare qualcosa del genere rsync(che ti permetterà di riavviare i trasferimenti)? lftpconsente anche di riavviare automaticamente le trasmissioni.
Kusalananda

Sì, alcuni anni fa hanno limitato l'accesso a HTTPS ai loro server. A proposito il server consente il riavvio in una posizione specifica, pcurl ne fa uso.
Accovacciato Kitten

1
Stai cercando uno strumento da riga di comando per gli script? Perché altrimenti userei semplicemente FileZilla o un client ftp / sftp simile che supporti il ​​riavvio di un download.
Bakuriu,

5
"un file relativamente piccolo: 300 MB" Ah, un modo per farmi sentire vecchio :)
Lightness Races con Monica

4
Inoltre, wow, questa è ... una rete spaventosa.
Lightness Races con Monica

Risposte:


33

lftp( Wikipedia ) è buono per questo. Supporta numerosi protocolli, può scaricare file usando diverse connessioni parallele simultanee (utile dove c'è molta perdita di pacchetti non causata dalla congestione) e può riprendere automaticamente i download. È anche programmabile da script.

Qui inclusa la messa a punto che ti è venuta (crediti a te):

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"'

Grazie. Ci ho provato, ma non sembra usare connessioni parallele: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, quando ho rimosso l'impostazione "net: timeout", è diventato parallelo. Ma rallenta dopo un po '. Penso perché le connessioni iniziano a "bloccarsi".
Gattino accovacciato

1
Funziona perfettamente con l' net:idleimpostazione. Grazie! Aggiungerò la mia soluzione alla domanda.
Gattino accovacciato

1
Nota che lftp supporta torrent come protocollo di trasferimento sottostante. Usalo Tutti gli altri protocolli supportati non supportano il rilevamento / correzione degli errori per blocco e si basano su TCP per fornire il rilevamento degli errori. Nota che torrent utilizza il rilevamento degli errori TCP ma in cima verifica l'hash sha1 dell'intero file e anche ogni blocco trasferito sulla rete. Nella mia esperienza, un film di 4 GB trasmesso in streaming su una rete 4G in genere presenta circa due errori di verifica dell'hash - questo significa che TCP ha considerato il pacchetto ricevuto privo di errori anche se era corrotto
slebetman

1
@slebetman, qui l'OP utilizza HTTPS. TLS fornisce un ulteriore controllo di integrità (rispetto al checksum debole di TCP) tramite HMAC. Anche HTTP ha il supporto per il checksum di contenuti o blocchi con le intestazioni Content-MD5e Digest(anche se non so se lftpsupporta quelli o se verrebbero utilizzati nel caso del PO). In ogni caso, non sembra che il torrent sia un'opzione per l'OP.
Stéphane Chazelas,

12

Non posso provarlo per te nella tua situazione, ma non dovresti usarlo --rangecon -C -. Ecco cosa dice la pagina man sull'argomento:

Utilizzare -C -per indicare curlper scoprire automaticamente dove / come riprendere il trasferimento. Quindi utilizza i file di output / input forniti per capirlo.

Prova questo invece:

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

Consiglio vivamente anche di citare sempre due volte le variabili in modo che la shell non tenti di analizzarle. (Considera un URL https://example.net/param1=one&param2=two, in cui la shell dividerebbe il valore in &.)

Per inciso, 120 KB / s è di circa 1,2 Mb / s, che è una tipica velocità di upload xDSL in molte parti del mondo. 10 secondi per MB, quindi poco meno di un'ora per l'intero file. Non così lento, anche se apprezzo che tu sia più interessato all'affidabilità piuttosto che alla velocità.


2
Grazie. Questo approccio funzionerebbe, ma è lento, perché non si scarica in parallelo. Hanno un limite di velocità per connessione e devo terminare il download in 1 ora, perché generano il file ogni ora. Aggiornamento della domanda.
Gattino accovacciato


4

Fuori dagli schemi: indossa una benda sull'occhio e usa bittorrent. Riduci le dimensioni del blocco quando crei il torrent. Ovviamente, crittografa il file in modo che chiunque trovi il torrent non ottenga nulla di utile.


1
È la rara azienda che distribuisce internamente file su torrent.
Ron John

5
Esattamente. Anche se la connessione è davvero pessima e il file è stato danneggiato in qualche modo, dovrebbe funzionare correttamente. SUGGERIMENTO PRO: crittografalo, rinominalo in "KimKardashianNude.mp4" e lascia che migliaia di persone ti aiutino con la connessione. Backup distribuito automatico e gratis! :)
Eric Duminil,

Come ha detto lo stesso Linus - "Solo i WIMP usano il backup su nastro: i veri uomini caricano le loro cose importanti su ftp e lasciano che il resto del mondo rispecchi;)"
Ivanivan,

@RonJohn So che non è comunemente usato ma ciò non significa che non possa essere usato. Il protocollo bittorrent è molto bravo a sopportare connessioni errate.
Loren Pechtel,

@LorenPechtel un ordine di lavoro per RISK per l'approvazione delle porte, un WO per il NOC per aprire le porte e WO per i team Linux e Windows per installare i client torrent e un altro WO per monitorarli tutti in modo che vengano solo i file approvati trasferiti. E niente di tutto ciò tiene conto di HIPPA, PCI o del fatto che un file che dovrebbe andare dal punto A al punto B ora passi dal punto A ai punti C, D, E, F, G, H, I e J prima arrivare al punto B. RISCHIO non approverà proprio per questo motivo.
Ron John

3

Ho avuto lo stesso problema nel mio lavoro precedente (tranne con 300 GB + backup di database fuori sede su una connessione instabile (dall'ufficio)). Gli utenti hanno avuto gravi problemi durante il download di file di dimensioni maggiori di ca. 1 GB prima della connessione interrotta. Dal momento che hanno usato il file standard copia / incolla di Windows su una connessione RDP, non c'è da stupirsi.

Una cosa che ho scoperto è che le nostre impostazioni VPN erano completamente incompatibili con la configurazione della rete (principalmente la lunghezza dell'MTU). La seconda cosa è che la copiatrice di file di Windows NON è fatta per copiare materiale su Internet.

La mia prima soluzione è stata un semplice server FTP, tuttavia non ha risolto il problema dei tempi di trasmissione (spesso 3-4 ore sulla nostra connessione).

La mia seconda soluzione era usare Syncthing per inviare i file direttamente a un NAS interno. Ogni notte dopo il completamento dei backup, Syncthing ha inviato tutto il necessario a un NAS in ufficio. Non solo è stato risolto il problema del tempo di trasmissione di oltre 3 ore, ma sono stato risparmiato le 1-2 ore per il corriere dei dati in caso di crisi. Alle 8:00 ogni mattina, i file venivano aggiornati sul NAS e avevamo i nostri backup pronti. Anche con file di grandi dimensioni (a un certo punto un database di quasi 700 GB), non ho ancora riscontrato alcun danneggiamento di file o altri problemi ...

La sincronizzazione è molto semplice da configurare e gestire ed è disponibile per tutte le piattaforme (anche i telefoni) e ha un'ottima gestione delle connessioni errate. Se la connessione non riesce, la sincronizzazione attende semplicemente qualche minuto e riprova.

Hai bisogno di una cartella locale per sincronizzare le cose, ma i tuoi file saranno disponibili non appena saranno aggiornati.

Un altro aspetto positivo della sincronizzazione è che può essere impostato per sincronizzare solo le modifiche nel file (come in un backup differenziale) ... eventualmente risolvendo una parte del problema della larghezza di banda.


+1 per menzionare la sincronizzazione: un'alternativa a google drive / dropbox per i backup
Edward Torvalds,

1

Potresti prendere in considerazione una soluzione vecchia scuola per lo spostamento di file su una connessione scadente: zmodem .

Questo è stato sviluppato quando 2400 modem baud con persone che prendevano il telefono e bombardavano la connessione erano la norma. Potrebbe valere la pena provare.


0

Puoi provare a usare Kermit :

La caratteristica che distingue il protocollo Kermit dalla maggior parte degli altri è la sua vasta gamma di impostazioni per consentire l'adattamento a qualsiasi tipo e qualità di connessione tra due tipi di computer: lunghezza dei pacchetti, codifica dei pacchetti, dimensioni della finestra, set di caratteri, metodo di rilevamento degli errori, timeout , fa una pausa. La maggior parte degli altri protocolli sono progettati per funzionare solo su determinati tipi o qualità di connessioni, e / o tra determinati tipi di computer o come file system, e quindi funzionano male (o per niente) altrove e offrono pochi o nessun metodo per adattarsi a non pianificati -per situazioni. Kermit, d'altra parte, ti consente di ottenere con successo il trasferimento di file e le massime prestazioni possibili su qualsiasi connessione. "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.