Unduh file besar melalui koneksi yang buruk

30

Apakah ada alat yang ada, yang dapat digunakan untuk mengunduh file besar melalui koneksi yang buruk?

Saya harus secara teratur mengunduh file yang relatif kecil: 300 MB, tetapi koneksi TCP yang lambat (80-120 KBytes / detik) terputus secara acak setelah 10-120 detik. (Ini jaringan perusahaan besar. Kami menghubungi admin mereka (bekerja dari India) beberapa kali, tetapi mereka tidak bisa atau tidak ingin melakukan apa pun.) Masalahnya mungkin dengan proxy terbalik / penyeimbang muatan.

Sampai sekarang saya menggunakan versi modifikasi pcurl: https://github.com/brunoborges/pcurl

Saya mengubah baris ini:

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

untuk ini:

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

Saya harus menambahkan --speed-limit 2048 --speed-time 10karena koneksi sebagian besar hanya hang selama beberapa menit ketika gagal.

Tetapi baru-baru ini bahkan skrip ini tidak dapat diselesaikan.

Satu masalah adalah tampaknya mengabaikan -C -bagian, sehingga tidak "melanjutkan" segmen setelah coba lagi. Tampaknya memotong file temp terkait, dan mulai dari awal setelah masing-masing gagal. (Saya pikir opsi --rangedan -Ctidak dapat digunakan bersama-sama.)

Masalah lainnya adalah skrip ini mengunduh semua segmen secara bersamaan. Tidak dapat memiliki 300 segmen, yang hanya 10 diunduh pada satu waktu.

Saya sedang berpikir untuk menulis alat pengunduhan dalam C # untuk tujuan khusus ini, tetapi jika ada alat yang ada, atau jika perintah curl dapat bekerja dengan baik dengan parameter yang berbeda, maka saya dapat meluangkan waktu.

UPDATE 1: Info tambahan: Fungsionalitas unduhan paralel tidak boleh dihapus, karena mereka memiliki batas bandwidth (80-120 Kbytes / detik, kebanyakan 80) per koneksi, sehingga 10 koneksi dapat menyebabkan 10 kali percepatan. Saya harus menyelesaikan pengunduhan file dalam 1 jam, karena file dihasilkan setiap jam.

Crouching Kitten
sumber
4
Apakah satu-satunya pilihan untuk mengakses file melalui FTP / HTTP? Anda tidak dapat menggunakan sesuatu seperti rsync(yang akan memungkinkan Anda memulai kembali transfer)? lftpjuga memungkinkan untuk memulai kembali transmisi secara otomatis.
Kusalananda
Ya, mereka membatasi semua akses ke HTTPS ke server mereka beberapa tahun yang lalu. BTW server memungkinkan restart pada posisi tertentu, pcurl memanfaatkan itu.
Crouching Kitten
1
Anda mencari alat baris perintah untuk skrip? Karena kalau tidak, saya cukup menggunakan FileZilla atau klien ftp / sftp serupa yang mendukung memulai kembali unduhan.
Bakuriu
5
"file yang relatif kecil: 300 MB" Ah, cara untuk membuatku merasa tua :)
Lightness Races with Monica
4
Juga, wow, itu .. jaringan yang mengerikan.
Lightness Races dengan Monica

Jawaban:

33

lftp( Wikipedia ) bagus untuk itu. Ini mendukung sejumlah protokol, dapat mengunduh file menggunakan beberapa koneksi paralel bersamaan (berguna di mana ada banyak paket yang tidak disebabkan oleh kemacetan), dan dapat secara otomatis melanjutkan unduhan. Ini juga bisa skrip.

Di sini termasuk penyetelan halus yang Anda lakukan (kredit untuk Anda):

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
sumber
Terima kasih. Saya mencoba ini, tetapi tampaknya tidak menggunakan koneksi paralel: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, ketika saya menghapus pengaturan "net: timeout", itu menjadi paralel. Tapi itu melambat setelah beberapa saat. Saya pikir karena koneksi mulai "hang".
Crouching Kitten
1
Ini berfungsi sempurna dengan net:idlepengaturan. Terima kasih! Saya akan menambahkan solusi saya ke pertanyaan.
Crouching Kitten
1
Perhatikan bahwa lftp mendukung torrent sebagai protokol transfer yang mendasarinya. Gunakan. Semua protokol lain yang didukungnya tidak mendukung deteksi / koreksi kesalahan per-chunk dan mengandalkan TCP untuk menyediakan deteksi kesalahan. Perhatikan bahwa torrent menggunakan deteksi kesalahan TCP tetapi di atasnya memverifikasi hash sha1 seluruh file Anda dan juga setiap blok yang ditransfer melalui jaringan. Dalam pengalaman saya, film 4GB yang mengalir melalui jaringan 4G biasanya memiliki sekitar dua kesalahan verifikasi hash - ini berarti TCP menganggap paket yang diterima sebagai bebas kesalahan meskipun mereka rusak
slebetman
1
@slebetman, di sini OP menggunakan HTTPS. TLS memberikan pemeriksaan integritas ekstra (melalui checksum lemah TCP) melalui HMAC. HTTP juga memiliki dukungan untuk konten checksuming atau potongan dengan header Content-MD5dan Digest(meskipun saya tidak tahu apakah lftpmendukung mereka atau jika mereka akan digunakan dalam kasus OP). Bagaimanapun, itu tidak terlihat seperti torrent akan menjadi pilihan untuk OP.
Stéphane Chazelas
12

Saya tidak bisa menguji ini untuk Anda dalam situasi Anda, tetapi Anda tidak boleh menggunakannya --rangebersama -C -. Inilah yang dikatakan halaman manual tentang subjek:

Gunakan -C -untuk memberi tahu curlagar secara otomatis mencari tahu di mana / bagaimana melanjutkan transfer. Kemudian menggunakan file output / input yang diberikan untuk mencari tahu itu.

Coba ini sebagai gantinya:

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

Saya juga sangat menyarankan agar Anda selalu mengutip variabel Anda sehingga shell tidak akan mencoba untuk menguraikannya. (Pertimbangkan sebuah URL https://example.net/param1=one&param2=two, tempat shell akan membagi nilainya di &.)

Secara kebetulan, 120 KB / s adalah sekitar 1,2 Mb / s, yang merupakan kecepatan unggah xDSL pada banyak bagian dunia. 10 detik per MB, jadi sedikit di bawah satu jam untuk seluruh file. Tidak terlalu lambat, meskipun saya menghargai Anda lebih mementingkan keandalan daripada kecepatan.

roaima
sumber
2
Terima kasih. Pendekatan ini akan berhasil, tetapi lambat, karena tidak mengunduh secara paralel. Mereka memiliki batas kecepatan per koneksi, dan saya harus menyelesaikan unduhan dalam 1 jam, karena mereka setiap jam menghasilkan file. Memperbarui pertanyaan.
Crouching Kitten
4

Di luar kotak: Kenakan eyepatch dan gunakan bittorrent. Buat ukuran blok kecil ketika Anda membuat torrent. Jelas, mengenkripsi file sehingga siapa pun yang menemukan torrent tidak mendapat manfaat apa pun.

Loren Pechtel
sumber
1
Ini adalah perusahaan langka yang secara internal mendistribusikan file melalui torrent.
RonJohn
5
Persis. Bahkan jika koneksi benar-benar buruk dan file entah bagaimana rusak, itu akan berfungsi dengan baik. PRO-TIP: Enkripsi, ubah nama menjadi 'KimKardashianNude.mp4' dan biarkan ribuan orang membantu Anda dengan koneksi. Otomatis, cadangan yang didistribusikan secara gratis! :)
Eric Duminil
Seperti yang dikatakan Linus sendiri - "Hanya pengecut yang menggunakan backup tape: pria sejati hanya mengunggah barang-barang penting mereka di ftp, dan biarkan seluruh dunia memantulkannya;)"
ivanivan
@ RonJohn Saya tahu ini tidak biasa digunakan tetapi itu tidak berarti tidak bisa digunakan. Protokol bittorrent sangat bagus untuk bertahan dengan koneksi yang buruk.
Loren Pechtel
@LorenPechtel Perintah Kerja untuk RISIKO untuk menyetujui port, WO untuk NOC untuk membuka port, dan WO untuk Linux dan tim Windows untuk menginstal klien torrent, dan WO lain untuk memantau mereka semua sehingga hanya file yang disetujui yang sedang ditransfer. Dan tidak ada yang memperhitungkan HIPPA, PCI, atau fakta bahwa file yang seharusnya beralih dari Titik A ke Titik B sekarang beralih dari Titik A ke Titik C, D, E, F, G, H, I dan J sebelumnya sampai ke Poin B. RISIKO akan menolak karena alasan itu.
RonJohn
3

Saya memiliki masalah yang sama pada pekerjaan saya sebelumnya (kecuali dengan 300GB + backup database di luar kantor pada koneksi yang tidak stabil (dari kantor)). Pengguna memiliki masalah serius mengunduh file yang lebih besar dari kira-kira. 1 GB sebelum koneksi terkoneksi. Karena mereka menggunakan file copy / paste standar Windows melalui koneksi RDP, tidak heran.

Satu hal yang saya temukan, adalah bahwa pengaturan VPN kami sepenuhnya tidak cocok dengan pengaturan jaringan (terutama panjang MTU). Yang kedua adalah bahwa mesin fotokopi file Windows TIDAK dibuat untuk menyalin barang-barang melalui internet.

Solusi pertama saya adalah server FTP sederhana, namun, itu tidak menyelesaikan masalah waktu transmisi (seringkali 3-4 jam pada koneksi kami).

Solusi kedua saya adalah menggunakan Syncthing untuk mengirim file langsung ke NAS internal . Setiap malam setelah cadangan selesai, Syncthing mengirim semua yang kami butuhkan kembali ke NAS di kantor. Tidak hanya masalah waktu transmisi 3+ jam diselesaikan, tetapi saya juga diberikan waktu 1-2 jam untuk mengirimkan data jika ada krisis. Pada jam 8 pagi setiap pagi, file-file akan diperbarui pada NAS, dan kami memiliki cadangan kami siap. Bahkan dengan file besar (pada satu titik database hampir 700GB), saya belum mengalami korupsi file atau masalah lain ...

Syncthing sangat mudah diatur dan dikelola dan tersedia untuk semua platform (bahkan telepon), dan memiliki penanganan koneksi buruk yang sangat baik .. jika koneksi gagal, Syncthing hanya menunggu beberapa menit dan mencoba lagi.

Anda memang perlu folder lokal untuk menyinkronkan sesuatu, tetapi file Anda akan tersedia segera setelah mereka diperbarui.

Hal baik lainnya tentang sinkronisasi, adalah bahwa hal itu dapat diatur untuk hanya menyinkronkan perubahan dalam file (seperti dalam cadangan diferensial) ... mungkin menyelesaikan bagian dari masalah bandwidth Anda.

Tylon Foxx
sumber
+1 untuk menyebutkan sinkronisasi - alternatif drive google / dropbox untuk cadangan
Edward Torvalds
1

Anda mungkin mempertimbangkan solusi old-school untuk memindahkan file melalui koneksi yang buruk - zmodem .

Ini dikembangkan kembali ketika 2400 modem baud dengan orang-orang mengangkat telepon dan membom koneksi adalah norma. Bisa dicoba.

BoredBsee
sumber
0

Anda dapat mencoba menggunakan Kermit :

Fitur yang membedakan protokol Kermit dari kebanyakan yang lain adalah berbagai pengaturannya untuk memungkinkan adaptasi terhadap segala jenis dan kualitas koneksi antara dua jenis komputer - panjang paket, pengkodean paket, ukuran jendela, kumpulan karakter, metode deteksi kesalahan, batas waktu , jeda. Sebagian besar protokol lain dirancang untuk bekerja hanya pada jenis atau kualitas koneksi tertentu, dan / atau antara jenis komputer tertentu atau sistem file sejenis, dan karenanya bekerja dengan buruk (atau tidak sama sekali) di tempat lain dan menawarkan sedikit jika ada metode untuk beradaptasi dengan yang tidak direncanakan -Untuk situasi. Kermit, di sisi lain, memungkinkan Anda untuk mencapai transfer file yang sukses dan kinerja setinggi mungkin pada koneksi yang diberikan. "

Wallace Howery
sumber