接続不良で大きなファイルをダウンロードする


30

悪い接続で大きなファイルをダウンロードするために使用できる既存のツールはありますか?

300 MBの比較的小さなファイルを定期的にダウンロードする必要がありますが、低速(80〜120 Kバイト/秒)の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接続が失敗した場合、ほとんどの場合接続が数分間ハングするだけなので、追加する必要がありました。

しかし最近、このスクリプトでさえ完了できません。

1つの問題は、-C -部品を無視しているように見えるため、再試行後にセグメントを「継続」しないことです。関連する一時ファイルを切り捨て、失敗するたびに最初から開始するようです。(オプション--range-Cオプションは一緒に使用できないと思います。)

もう1つの問題は、このスクリプトがすべてのセグメントを同時にダウンロードすることです。300個のセグメントを持つことはできません。そのうち10個のみが一度にダウンロードされます。

この特定の目的のためにC#でダウンロードツールを作成することを考えていましたが、既存のツールがある場合、またはcurlコマンドが異なるパラメーターで適切に機能する場合は、時間を割くことができます。

更新1:追加情報:並列ダウンロード機能は、接続ごとに帯域幅の制限(80〜120 Kバイト/秒、主に80)があるため、削除しないでください。したがって、10接続で10倍の速度が向上します。ファイルは1時間ごとに生成されるため、ファイルのダウンロードは1時間で完了する必要があります。


4
FTP / HTTP経由でファイルにアクセスする唯一のオプションはありますか?次のようなものは使用できませんrsync(転送を再開できますか?)lftpまた、送信を自動的に再開することもできます。
クサラナナンダ

はい、数年前にHTTPSへのすべてのアクセスをサーバーに制限していました。ところで、サーバーは特定の位置での再起動を許可します。pcurlはそれを利用します。
しゃがみ子猫

1
スクリプト用のコマンドラインツールをお探しですか?それ以外の場合は、ダウンロードの再開をサポートするFileZillaまたは同様のftp / sftpクライアントを使用するだけです。
バクリウ

5
「比較的小さなファイル:300 MB」ああ、私を古く感じさせる方法:)
モニカとの軽さのレース

4
また、すごい、それはぞっとするようなネットワークです。
ライトネスレース、モニカと

回答:


33

lftpWikipedia)はそのために役立ちます。多数のプロトコルをサポートし、複数の同時並列接続を使用してファイルをダウンロードでき(輻輳が原因ではない多くのパケット損失がある場合に便利)、ダウンロードを自動的に再開できます。スクリプトも可能です。

ここにあなたが思いついた微調整を含みます(あなたへのクレジット):

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ハッシュと、ネットワーク経由で転送される各ブロックを検証することに注意してください。私の経験では、4Gネットワーク上torrented 4GBの映画は、典型的には約2つのハッシュ検証エラーを持っている- TCPは、受信したパケットは、それらが破損したにもかかわらず、エラーフリーであると考えられ、この手段
slebetman

1
@slebetman、ここではOPはHTTPSを使用します。TLSは、HMAC経由で(TCPの弱いチェックサムを介した)追加の整合性チェックを提供します。また、HTTPはContent-MD5Digestヘッダーとヘッダーを使用してコンテンツまたはチャンクのチェックサムをサポートします(lftpこれらをサポートするかどうか、またはOPのケースで使用されるかどうかはわかりません)。いずれにせよ、急流がOPのオプションになるようには見えません。
ステファンシャゼラス

12

私はあなたの状況であなたのためにこれをテストすることはできませんが、使用してはならない--range-C -。この件に関するmanページの内容は次のとおりです。

を使用 -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}" &

また、シェルが変数を解析しないように、常に変数を二重引用符で囲むことを強くお勧めします。(https://example.net/param1=one&param2=twoシェルが値をで分割するURLを検討してください&。)

ちなみに、120 KB / sは約1.2 Mb / sであり、これは世界の多くの地域での典型的なxDSLアップロード速度です。MBあたり10秒なので、ファイル全体で1時間弱です。それほど遅くはありませんが、速度よりも信頼性を重視していることに感謝しています。


2
ありがとうございました。このアプローチは機能しますが、並行してダウンロードしないため、時間がかかります。接続ごとに速度制限があり、1時間ごとにファイルを生成するため、1時間でダウンロードを完了する必要があります。質問を更新します。
かがめる子猫


4

箱の外:眼帯をつけてbittorrentを使用します。トレントを作成するときにブロックサイズを小さくします。明らかに、急流を見つけた他の誰かが何も役に立たないように、ファイルを暗号化します。


1
内部で急流を介してファイルを配布するのはまれな企業です。
ロンジョン

5
まさに。接続が本当に悪く、ファイルが何らかの理由で破損した場合でも、正常に機能するはずです。PRO-TIP:暗号化して、名前を 'KimKardashianNude.mp4'に変更し、何千人もの人々が接続を手伝うようにします。無料の自動分散バックアップ!:)
エリックドゥミニル

ライナス自身が言ったように-「弱虫だけがテープバックアップを使用します。本物の男性はFTPに重要なものをアップロードするだけで、世界中にそれをミラーリングさせます;)」
ivanivan

@RonJohn私はそれが一般的に使用されていないことを知っていますが、それはそれが使用できなかったことを意味しません。bittorrentプロトコルは、接続不良に耐えるのに非常に優れています。
ローレンペクテル

@LorenPechtelは、RISKがポートを承認するための作業命令、NOCがポートを開くためのWO、LinuxおよびWindowsチームがトレントクライアントをインストールするためのWO、および承認されたファイルのみが監視されるようにすべてを監視する別のWO転送されました。HIPPA、PCI、またはポイントAからポイントBに移動するはずのファイルが、ポイントAからポイントC、D、E、F、G、H、I、Jに移動するという事実は考慮されていません。ポイントBに到達すると、リスクはまさに​​その理由で不承認となります。
ロンジョン

3

以前の仕事でも同じ問題が発生しました((オフィスからの)不安定な接続での300GB以上のオフサイトデータベースバックアップを除く)。ユーザーは約を超えるファイルをダウンロードする重大な問題がありました。接続が完了する前に1 GB。彼らはRDP接続で標準のWindowsコピー/貼り付けファイルを使用したので、当然です。

私が発見したことの1つは、VPN設定がネットワーク設定(主にMTU長)と完全に一致していないことです。2つ目は、Windowsのファイルコピーは、インターネット経由でコピーするためのものではないということです。

私の最初の解決策は単純なFTPサーバーでしたが、送信時間の問題(多くの場合、接続で3〜4時間)は解決しませんでした。

2番目の解決策は、Syncthingを使用して、ファイルを社内NASに直接送信することでした。バックアップの完了後、毎晩、Syncthingは必要なものすべてをオフィスのNASに送り返しました。3時間以上の送信時間の問題が解決されただけでなく、危機が発生した場合にデータを宅配するために1〜2時間を節約しました。毎朝午前8時にファイルがNASで更新され、バックアップの準備が整いました。巨大なファイル(ある時点ではほぼ700GBのデータベース)であっても、ファイルの破損やその他の問題はまだ発生していません...

Syncthingのセットアップと管理は非常に簡単で、すべてのプラットフォーム(携帯電話も含む)で使用できます。また、接続が失敗した場合、Syncthingは数分待ってから再試行します。

同期にはローカルフォルダーが必要ですが、ファイルは更新されるとすぐに使用可能になります。

syncthingのもう1つの良いは、ファイルの変更のみを同期化するように設定できることです(差分バックアップなど)。おそらく帯域幅の問題の一部を解決します。


syncthingに言及するための+1-バックアップ用のGoogleドライブ/ドロップボックスの代替
Edward Torvalds

1

お粗末な接続(zmodem)を介してファイルを移動するための旧式のソリューションを検討するかもしれません。

これは、2400ボーモデムで電話を取り、接続を爆撃することが一般的だったときに開発されました。試してみる価値があります。


0

Kermitを使用してみてください:

Kermitプロトコルを他のほとんどのプロトコルと区別する機能は、パケットの長さ、パケットのエンコード、ウィンドウサイズ、文字セット、エラー検出方法、タイムアウトなど、2種類のコンピューター間のあらゆる種類と接続の品質への適応を可能にする幅広い設定です、一時停止します。他のほとんどのプロトコルは、特定の種類または品質の接続でのみ、および/または特定の種類のコンピューター間または同様のファイルシステム間でのみ動作するように設計されているため、他の場所ではうまく機能しない(またはまったく機能しない) -状況のため。一方、Kermitを使用すると、任意の接続でファイル転送を成功させ、最高のパフォーマンスを実現できます。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.