Завантажте великий файл через погане з'єднання


30

Чи існує існуючий інструмент, який можна використовувати для завантаження великих файлів через погане з'єднання?

Мені доводиться регулярно завантажувати відносно невеликий файл: 300 Мб, але повільний (80-120 Кбайт / сек) TCP-з'єднання випадковим чином розривається через 10-120 секунд. (Це велика мережа компанії. Ми неодноразово зв'язувалися з їх адміністраторами (працюючи з Індії), але вони не можуть чи не хочуть нічого робити.) Проблема може полягати в їхніх зворотних проксі-серверах / балансирах навантаження.

До цього часу я використовував модифіковану версію pcurl: https://github.com/brunoborges/pcurl

Я змінив цей рядок:

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

до цього:

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

Мені довелося додати, --speed-limit 2048 --speed-time 10оскільки з'єднання здебільшого просто зависає хвилин, коли воно виходить з ладу.

Але останнім часом навіть цей сценарій неможливо виконати.

Одна проблема полягає в тому, що вона, здається, ігнорує -C -частину, тому вона не "продовжує" сегмент після повторного спроби. Здається урізати відповідний тимчасовий файл і розпочати з початку після кожного збою. (Я думаю, що параметри --rangeі -Cваріанти не можна використовувати разом.)

Інша проблема полягає в тому, що цей скрипт завантажує всі сегменти одночасно. Він не може мати 300 сегментів, з яких одночасно завантажується лише 10.

Я думав написати інструмент для завантаження в C # для цієї конкретної мети, але якщо є існуючий інструмент або якщо команда curl могла б нормально працювати з різними параметрами, я могла б витратити час.

ОНОВЛЕННЯ 1: Додаткова інформація: Функціонал паралельного завантаження не слід видаляти, оскільки вони мають обмеження пропускної здатності (80-120 Кбайт / сек, в основному 80) на з'єднання, тому 10 підключень можуть спричинити прискорення в 10 разів. Я маю закінчити завантаження файлу за 1 годину, тому що файл генерується щогодини.


4
Є єдиний варіант доступу до файлів через FTP / HTTP? Ви не можете використовувати щось на кшталт rsync(що дозволить вам перезапустити передачі)? lftpтакож дозволяє автоматично перезапустити передачі.
Kusalananda

Так, вони обмежили весь доступ до HTTPS до своїх серверів кілька років тому. BTW сервер дозволяє перезапустити в певному положенні, pcurl використовує це.
Присідання кошеня

1
Ви шукаєте інструмент командного рядка для сценаріїв? Тому що в іншому випадку я просто використовую FileZilla або подібний ftp / sftp клієнт, який підтримує перезапуск завантаження.
Бакуріу

5
"порівняно невеликий файл: 300 Мб" Ага, спосіб змусити мене відчувати себе старим :)
Легкість перегонів з Монікою

4
Крім того, вау, це .. жахлива мережа.
Легкі перегони з Монікою

Відповіді:


33

lftp( Вікіпедія ) для цього добре. Він підтримує ряд протоколів, може завантажувати файли за допомогою декількох паралельних паралельних з'єднань (корисно там, де велика втрата пакету, не викликаних перевантаженнями), і може автоматично відновити завантаження. Це також сценарій.

Тут, зокрема, точне налаштування, яке ви запропонували (кредити вам):

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

Дякую. Я спробував це, але, схоже, не використовуються паралельні з'єднання: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'
Скручування кошеня

О, коли я видалив налаштування "net: timeout", він став паралельним. Але через деякий час він сповільнюється. Я думаю, тому що зв’язки починають «зависати».
Присідання кошеня

1
Він чудово працює з net:idleналаштуванням. Дякую! Я додам своє рішення до питання.
Присідання кошеня

1
Зауважте, що lftp підтримує торрент як базовий протокол передачі. Використай це. Усі інші протоколи, які він підтримує, не підтримують виявлення / виправлення помилок за один час, а для виявлення помилок покладаються на TCP. Зверніть увагу, що торрент використовує виявлення помилок TCP, але поверх нього перевіряється хеш sha1 усього вашого файлу, а також кожного блоку, переданого по мережі. На моєму досвіді, у фільмі 4 Гб, що перебуває в мережі 4G, зазвичай є близько двох помилок перевірки хешу - це означає, що TCP вважає отриманий пакет помилковим, хоча вони були пошкоджені
slebetman

1
@slebetman, тут ОП використовує HTTPS. TLS забезпечує додаткову перевірку цілісності (через слабку контрольну суму TCP) через HMAC. Також HTTP має підтримку для перевірки вмісту чи фрагментів із заголовками Content-MD5та Digest(хоча я не знаю, lftpпідтримують чи вони, чи вони будуть використані у випадку ОП). У будь-якому випадку, схоже, торент не був би варіантом для ОП.
Стефан Шазелас

12

Я не можу перевірити це для вас у вашій ситуації, але ви не повинні використовувати --rangeз -C -. Ось що на цій сторінці має сказати довідкова сторінка:

Використовуйте, -C -щоб сказати, curlщоб автоматично з’ясувати, де / як відновити передачу. Потім він використовує задані вихідні / вхідні файли, щоб зрозуміти це.

Спробуйте це замість цього:

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

Я також настійно рекомендую вам завжди двічі цитувати свої змінні, щоб оболонка не намагалася їх розібрати. (Розглянемо URL-адресу https://example.net/param1=one&param2=two, де оболонка розділила б значення на &.)

Між іншим, 120 Кб / с становить приблизно 1,2 Мб / с, що є типовою швидкістю завантаження xDSL у багатьох частинах світу. 10 секунд на МБ, тобто трохи менше години для всього файлу. Не так повільно, хоча я ціную, що ви більше переймаєтесь надійністю, а не швидкістю.


2
Дякую. Цей підхід спрацював би, але він повільний, оскільки не завантажується паралельно. Вони мають обмеження швидкості на з'єднання, і я повинен закінчити завантаження за 1 годину, оскільки вони щогодини генерують файл. Оновлення питання.
Присідання кошеня


4

Поза межами коробки: надіньте очний годинник і використовуйте бітторент. Зробіть розмір блоку невеликим під час створення торрента. Очевидно, зашифруйте файл, щоб той, хто знайшов торрент, не отримав нічого корисного.


1
Це рідкісна корпорація, яка внутрішньо поширює файли через торрент.
RonJohn

5
Саме так. Навіть якщо з'єднання дійсно погано і файл якось пошкоджений, він повинен працювати добре. PRO-ПОРАД: Зашифруйте його, перейменуйте його на "KimKardashianNude.mp4", і дозвольте тисячам людей допомогти вам у з'єднанні. Автоматичне, розподілене резервне копіювання безкоштовно! :)
Ерік Дюмініл

Як сказав сам Лінус - "Тільки відмовники використовують резервну копію стрічки: справжні чоловіки просто завантажують свої важливі речі на ftp, а решта світу нехай це віддзеркалює;)"
Іваніван

@RonJohn Я знаю, що це не часто використовується, але це не означає, що його не можна використовувати. Протокол bittorrent дуже добре налаштовує погані зв’язки.
Лорен Печтел

@LorenPechtel Робочий наказ щодо ризику затвердив порти, WO для NOC для відкриття портів, WO для команд Linux та Windows для встановлення клієнтів-торентів та інший WO для моніторингу їх усіх так, щоб тільки затверджені файли були передано. І ніщо з цього не враховує HIPPA, PCI або той факт, що файл, який повинен був перейти від точки A до точки B, зараз переходить від точки A до пунктів C, D, E, F, G, H, I і J раніше потрапляння до пункту B. РИЗИК не спричинить саме цієї причини.
RonJohn

3

У моєї попередньої роботи у мене була така сама проблема (за винятком резервного копіювання бази даних 300 ГБ + на нестабільному з'єднанні (з офісу)) Користувачі мали серйозні проблеми із завантаженням файлу, що перевищує прибл. 1 Гб перед тим, як з'єднання вимкнено. Оскільки вони використовували стандартний файл копіювання / вставки Windows через з'єднання RDP, не дивно.

Я дізнався одне, що наші налаштування VPN повністю не відповідали налаштуванням мережі (в основному довжина MTU). Друга річ, що копіювач файлів Windows НЕ створений для копіювання матеріалів через Інтернет.

Першим моїм рішенням був простий FTP-сервер, однак це не вирішило проблеми часу передачі (часто 3-4 години на нашому з'єднанні).

Моє друге рішення полягало в тому, щоб використовувати Syncthing для надсилання файлів безпосередньо в домашній NAS. Щовечора після того, як резервні копії були завершені, Syncthing надсилав все необхідне назад до NAS в офіс. Не тільки було вирішено проблему 3+ годин передачі часу, але я пошкодував 1-2 години, щоб передати дані, якщо виник криза. О 8 годині ранку файли будуть оновлюватися в NAS, і ми готові резервні копії. Навіть з величезними файлами (в один момент майже 700 ГБ бази даних) я ще не мав жодних пошкоджень файлів чи інших проблем ...

Syncthing дуже простий у налаштуванні та керуванні, і він доступний для всіх платформ (навіть телефонів) і має дуже гарне поводження з поганими з’єднаннями.

Для синхронізації речей вам потрібна локальна папка, але ваші файли стануть доступними майже після їх оновлення.

Ще одна гарна річ, що стосується синхронізації - це те, що вона може бути налаштована лише на синхронізацію змін у файлі (як, наприклад, у диференціальній резервній копії) ... можливо, вирішення частини вашої проблеми пропускної здатності.


+1 за згадку про синхронізацію - альтернатива диска Google / папки для резервних копій
Едвард Торвальдс

1

Ви можете розглянути рішення старої школи для переміщення файлів через паршиве з'єднання - zmodem .

Це було розроблено ще коли 2400 бод-модемів із людьми піднімали телефони та бомбардували зв’язок, було нормою. Можливо, варто спробувати.


0

Ви можете спробувати використати Kermit :

Особливістю, яка відрізняє протокол Kermit від більшості інших, є його широкий діапазон налаштувань, що дозволяє адаптуватись до будь-якого виду та якості зв'язку між будь-якими двома видами комп'ютерів - довжиною пакету, кодуванням пакета, розміром вікна, набором символів, методом виявлення помилок, тайм-аутами , паузи. Більшість інших протоколів розроблені для роботи лише на певних видах або якостях з'єднань та / або між певними типами комп'ютерів або подібних файлових систем, а тому працюють погано (або зовсім не є) в інших місцях і пропонують небагато, якщо якісь методи адаптуються до незапланованих -для ситуацій. Kermit, з іншого боку, дозволяє досягти успішної передачі файлів і максимально високої продуктивності на будь-якому даному з'єднанні. "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.