Kötü bağlantı üzerinden büyük dosyayı indirin


30

Kötü bir bağlantı üzerinden büyük dosyaları indirmek için kullanılabilecek mevcut bir araç var mı?

Düzenli olarak küçük bir dosyayı indirmem gerekiyor: 300 MB, ancak yavaş (80-120 KBytes / sn) TCP bağlantısı 10-120 saniye sonra rasgele kesiliyor. (Bu büyük bir şirketin ağı. Yöneticileriyle (Hindistan'dan çalışarak) defalarca iletişim kurduk, ancak hiçbir şey yapamıyorlar ya da istemiyorlar.) Sorun ters vekilleri / yük dengeleyicileri ile ilgili olabilir.

Şimdiye kadar pcurl'nin değiştirilmiş bir versiyonunu kullandım: https://github.com/brunoborges/pcurl

Bu satırı değiştirdim:

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

buna:

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

Eklemek zorunda kaldım, --speed-limit 2048 --speed-time 10çünkü bağlantı çoğunlukla başarısız olduğunda dakikalarca kilitleniyor.

Ancak son zamanlarda bu senaryo bile tamamlanamıyor.

Bir sorun, -C -parçayı görmezden geldiği görülüyor , bu yüzden yeniden denemeden sonra segmenti "devam ettirmiyor". İlgili geçici dosyayı kısaltıyor ve her başarısızlıktan sonra baştan başlıyor gibi görünüyor. (Bence --rangeve -Cseçenekler birlikte kullanılamaz)

Diğer problem, bu betiğin tüm segmentleri aynı anda indirmesidir. Bir seferde yalnızca 10 tanesi indirilen 300 adet kesime sahip olamaz.

Bu amaç için bir indirme aracı C # dilinde yazmayı düşünüyordum, ancak mevcut bir araç varsa veya curl komutu farklı parametrelerle düzgün çalışabiliyorsa biraz zaman ayırabilirim.

GÜNCELLEME 1: Ek bilgi: Paralel indirme işlevi kaldırılmamalıdır, çünkü her bağlantı için bir bant genişliği sınırı vardır (80-120 Kbyte / sn, çoğunlukla 80), bu nedenle 10 bağlantı 10 kez hızlanmaya neden olabilir. Dosya indirmeyi 1 saat içinde bitirmeliyim, çünkü dosya saatlik üretiliyor.


4
Dosyalara FTP / HTTP üzerinden erişmek için tek seçenek var mı? Gibi bir şey kullanamazsınız rsync(transferleri yeniden başlatmanıza izin verecek)? lftpayrıca otomatik olarak aktarımların yeniden başlatılmasını sağlar.
Kusalananda

Evet, HTTPS'ye erişimini birkaç yıl önce sunucularına kısıtladılar. BTW sunucusu belirli bir konumda yeniden başlatmaya izin veriyor, pcurl bunu kullanıyor.
Crouching Kitten

1
Komut dosyası için bir komut satırı aracı mı arıyorsunuz? Çünkü aksi takdirde FileZilla'yı ya da indirmeyi yeniden başlatmayı destekleyen benzer bir ftp / sftp istemcisini kullanırdım.
Bakuriu

5
"nispeten küçük bir dosya: 300 MB" Ah, beni yaşlı hissettirmenin yolu :)
Monica

4
Ayrıca, vay, bu .. korkunç bir ağ.
Monica

Yanıtlar:


33

lftp( Wikipedia ) bunun için iyidir. Birkaç protokolü destekler, birkaç eşzamanlı paralel bağlantı kullanarak dosyaları indirebilir (tıkanıklıktan kaynaklanmayan çok fazla paket kaybı olduğunda faydalı olabilir) ve indirme işlemlerini otomatik olarak devam ettirebilir. Aynı zamanda komut dosyasıdır.

Buraya geldiğiniz ince ayarları da dahil olmak üzere (size kredi verir):

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

Teşekkür ederim. Bunu denedim, ancak paralel bağlantılar kullanmıyor gibi görünüyor: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

Ah, "net: timeout" ayarını kaldırdığımda, paralel oldu. Ancak bir süre sonra yavaşlar. Bence bağlantılar "asılmaya" başlar.
Crouching Kitten

1
net:idleAyarı ile mükemmel çalışır . Teşekkür ederim! Çözümü soruya ekleyeceğim.
Crouching Kitten

1
Lftp'nin torrent'i temel transfer protokolü olarak desteklediğini unutmayın. Kullanın. Desteklediği diğer tüm protokoller öbek başına hata algılamayı / düzeltmeyi desteklemiyor ve hata algılamasını sağlamak için TCP'ye güveniyor. Torrent'in TCP hata algılaması kullandığını, ancak bunun üzerinde dosyanın bütününün sha1 karmasını ve ağ üzerinden aktarılan her bloğu doğruladığını unutmayın. Tecrübelerime göre, 4G ağ üzerinden ezilen 4GB'lık bir film tipik olarak yaklaşık iki hash doğrulama hatasına sahipti - bu, TCP'nin, alınan paketin bozulmuş olsa bile hatasız olduğunu düşündüğü anlamına geliyor
slebetman

1
@slebetman, burada OP HTTPS kullanıyor. TLS, HMAC üzerinden ekstra bütünlük kontrolü (TCP’nin zayıf sağlama toplamı üzerinden) sağlar. Ayrıca HTTP, içeriği sağlama veya başlıklarıyla Content-MD5ve Digestbaşlıklarla daraltma desteğine sahiptir (bunları lftpdestekleyip desteklemediğini veya OP'nin durumunda kullanılıp kullanılmayacağını bilmiyorum ). Her durumda, torrent gibi görünmüyor OP için bir seçenek olacaktır.
Stéphane Chazelas

12

Senin durumunda sizin için bu test edemez, ancak kullandığınız olmamalıdır --rangeile -C -. İşte man sayfasının konuyla ilgili söylediklerini:

Kullanım -C -anlatmak için curlotomatik olarak transferini devam ettirmek için nasıl nerede / öğrenmek için. Daha sonra bunu bulmak için verilen çıktı / giriş dosyalarını kullanır.

Bunun yerine şunu deneyin:

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

Ayrıca, kabuklarınızı ayrıştırmaya çalışmadığı için değişkenlerinizi daima iki kez alıntılamanızı şiddetle tavsiye ederim. ( https://example.net/param1=one&param2=twoKabuğun, değeri böldüğü bir URL'yi düşünün &.)

Bu arada, 120 KB / s, yaklaşık 1.2 Mb / sn'dir; bu, dünyanın birçok yerinde tipik bir xDSL yükleme hızıdır. MB başına 10 saniye, bu nedenle tüm dosya için bir saatin biraz altında. Çok yavaş olmamakla birlikte, hızdan ziyade güvenilirlikle daha fazla ilgilendiğinizi takdir ediyorum.


2
Teşekkür ederim. Bu yaklaşım işe yarayabilir, ancak yavaştır, çünkü paralel olarak indirilmez. Bağlantı başına bir hız sınırlamaları var ve indirmeyi 1 saat içinde bitirmem gerekiyor, çünkü dosyayı saatlik olarak oluşturuyorlar. Sorunun güncellenmesi.
Crouching Kitten


4

Kutunun dışında: Bir mercek sürün ve bittorrent kullanın. Torrenti oluştururken blok boyutunu küçük yapın. Belli ki, dosyayı şifreleyin, böylece torrent'i bulabilen başka biri işe yarar bir şey alamaz.


1
Dosyaları torrent üzerinden dahili olarak dağıtan nadir bir kuruluştur.
RonJohn

5
Kesinlikle. Bağlantı gerçekten kötü olsa ve dosya bir şekilde zarar görse bile, düzgün çalışması gerekir. PRO-İPUCU: Şifreleyin, 'KimKardashianNude.mp4' olarak yeniden adlandırın ve binlerce kişinin bağlantıda size yardımcı olmasına izin verin. Otomatik, ücretsiz dağıtılmış yedekleme! :)
Eric Duminil

Linus'un kendisinin dediği gibi - "Sadece wimps teyp yedekleme kullanıyor: gerçek erkekler sadece önemli şeylerini
ftp'ye yüklüyorlar

@RonJohn Genel olarak kullanılmadığını biliyorum, ancak bu kullanılamayacağı anlamına gelmiyor. Bittorrent protokolü, kötü bağlantıların kurulmasında çok iyidir.
Loren Pechtel

@LorenPechtel limanları onaylaması için RISK için bir İş Emri, portları açmak için NOC için bir WO ve torrent istemcilerini kurmak için Linux ve Windows ekipleri için WO'lar ve hepsini izleyen başka bir WO (sadece onaylı dosyaları) transfer etti. Ve bunların hiçbiri HIPPA, PCI veya A Noktasından B Noktasına kadar gitmesi gereken bir dosyanın şimdi A Noktasından C, D, E, F, G, H, I ve J noktalarına gitmesi gerçeğini dikkate almaz. B noktasına gelmek. RISK bu nedenle onaylamıyor.
RonJohn

3

Önceki işimde de aynı problem vardı ((ofisten gelen) dengesiz bir bağlantıda 300GB + site dışı veritabanı yedeklemeleri hariç). Kullanıcıların dosya indirme işlemi yakl. Bağlantı kesilmeden önce 1 GB. Standart Windows kopyala / yapıştır dosyasını bir RDP bağlantısı üzerinden kullandıklarından, merak etmeyin.

Bulduğum şeylerden biri, VPN ayarlarımızın ağ kurulumuyla (özellikle MTU uzunluğu) tamamen uyumsuzluğuydu. İkincisi, Windows’un dosya fotokopi makinesinin İnternet’ten bir şeyler kopyalamak için yapılmamasıdır.

İlk çözümüm basit bir FTP sunucusuydu, ancak iletim süresi sorununu çözmedi (genellikle bağlantımızdaki 3-4 saat).

İkinci çözümüm, dosyaları doğrudan şirket içi NAS'a göndermek için Syncthing kullanmaktı . Yedeklemeler tamamlandıktan sonra her gece, Syncthing ihtiyaç duyduğumuz her şeyi ofisteki bir NAS'a gönderdi. Sadece 3 + saat iletim süresinin sorunu çözülmedi, aynı zamanda bir kriz olması durumunda verileri kurtarabilmek için 1-2 saatten de kurtuldum. Her sabah saat 8'de, dosyalar NAS'ta güncellenecekti ve yedeklerimizi hazırladık. Büyük dosyalarda bile (bir noktada neredeyse 700GB'lık bir veritabanı), henüz herhangi bir dosya bozulması veya başka sorunla karşılaşmadım.

Senkronizasyonun kurulumu ve yönetimi çok kolaydır ve tüm platformlar (hatta telefonlar için) mevcuttur ve kötü bağlantıları çok iyi kullanır. Bağlantı başarısız olursa, Syncthing birkaç dakika bekler ve tekrar dener.

Bir şeyleri senkronize etmek için yerel bir klasöre ihtiyacınız var, ancak dosyalarınız güncellendiklerinde neredeyse kullanılabilir olacak.

Senkronizasyonla ilgili bir başka iyi şey de, muhtemelen dosya genişliği probleminizin bir bölümünü çözerek ... dosyadaki değişiklikleri (diferansiyel bir yedeklemede olduğu gibi) senkronize etmek için ayarlanabilmesidir .


Senkronizasyondan bahsetmek için +1 - bir yedekleme için bir google drive / dropbox alternatifi
Edward Torvalds

1

Kötü bir bağlantı üzerinden dosyaları taşımak için eski okul çözümünü düşünebilirsiniz - zmodem .

Bu, 2400 baud, telefonları toplayan ve bağlantıyı bombalayan insanlarla normale döndüğü zaman modem haline geldi. Denemeye değer olabilir.


0

Kermit kullanarak deneyebilirsiniz :

Kermit protokolünü diğerlerinden ayıran özellik, her iki tür bilgisayar arasında - paket uzunluğu, paket kodlaması, pencere boyutu, karakter seti, hata bulma yöntemi, zaman aşımları arasındaki herhangi bir tür ve bağlantı kalitesine uyum sağlamaya olanak sağlayan geniş ayar yelpazesidir. duraklar. Diğer protokollerin çoğu yalnızca belirli bağlantı türlerinde veya niteliklerinde ve / veya belirli türdeki bilgisayarlarda veya benzeri dosya sistemlerinde çalışmak üzere tasarlanmıştır ve bu nedenle başka yerlerde yetersiz (veya hiç) çalışmamakta ve planlanmamışsa uyarlamak için az sayıda yöntem sunmaktadır. -durumlar için. Öte yandan, Kermit, herhangi bir bağlantıda başarılı bir dosya aktarımı ve mümkün olan en yüksek performansı elde etmenizi sağlar. "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.