Tải tập tin lớn qua kết nối xấu


30

Có một công cụ hiện có, có thể được sử dụng để tải xuống các tệp lớn qua kết nối xấu?

Tôi phải thường xuyên tải xuống một tệp tương đối nhỏ: 300 MB, nhưng kết nối TCP chậm (80-120 KB / giây) bị ngắt ngẫu nhiên sau 10-120 giây. .

Cho đến bây giờ tôi đã sử dụng một phiên bản sửa đổi của pcurl: https://github.com/brunoborges/pcurl

Tôi đã thay đổi dòng này:

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

đến đây:

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

Tôi đã phải thêm --speed-limit 2048 --speed-time 10bởi vì kết nối chủ yếu chỉ bị treo trong vài phút khi nó không thành công.

Nhưng gần đây ngay cả kịch bản này không thể hoàn thành.

Một vấn đề là dường như bỏ qua -C -phần này, vì vậy nó không "tiếp tục" phân khúc sau khi thử lại. Nó dường như cắt ngắn tệp tạm thời liên quan và bắt đầu lại từ đầu sau mỗi lần thất bại. (Tôi nghĩ --range-Clựa chọn không thể được sử dụng cùng nhau.)

Vấn đề khác là tập lệnh này tải xuống tất cả các phân đoạn cùng một lúc. Nó không thể có 300 phân đoạn, trong đó chỉ có 10 đoạn được tải xuống cùng một lúc.

Tôi đã nghĩ đến việc viết một công cụ tải xuống bằng C # cho mục đích cụ thể này, nhưng nếu có một công cụ hiện có hoặc nếu lệnh curl có thể hoạt động chính xác với các tham số khác nhau, thì tôi có thể dành chút thời gian.

CẬP NHẬT 1: Thông tin bổ sung: Không nên xóa chức năng tải xuống song song, vì chúng có giới hạn băng thông (80-120 Kbytes / giây, chủ yếu là 80) cho mỗi kết nối, do đó 10 kết nối có thể gây tăng tốc 10 lần. Tôi phải hoàn thành việc tải xuống tệp trong 1 giờ, vì tệp được tạo hàng giờ.


4
Là lựa chọn duy nhất để truy cập các tệp qua FTP / HTTP? Bạn không thể sử dụng một cái gì đó như rsync(sẽ cho phép bạn khởi động lại chuyển)? lftpcũng cho phép tự động khởi động lại truyền.
Kusalananda

Có, họ đã hạn chế tất cả quyền truy cập vào HTTPS vào máy chủ của họ vài năm trước. BTW máy chủ cho phép khởi động lại ở vị trí cụ thể, pcurl sử dụng điều đó.
Ngọa mèo

1
Bạn đang tìm kiếm một công cụ dòng lệnh cho kịch bản? Bởi vì nếu không, tôi chỉ cần sử dụng FileZilla hoặc ứng dụng khách ftp / sftp tương tự hỗ trợ khởi động lại tải xuống.
Bakuriu

5
"một tệp tương đối nhỏ: 300 MB" Ah, cách khiến tôi cảm thấy già nua :)
Cuộc đua nhẹ nhàng với Monica

4
Ngoài ra, wow, đó là .. một mạng lưới kinh khủng.
Cuộc đua nhẹ nhàng với Monica

Câu trả lời:


33

lftp( Wikipedia ) là tốt cho điều đó. Nó hỗ trợ một số giao thức, có thể tải xuống các tệp bằng cách sử dụng một số kết nối song song đồng thời (hữu ích khi có nhiều mất gói không phải do tắc nghẽn) và có thể tự động tiếp tục tải xuống. Nó cũng có thể viết được.

Ở đây bao gồm cả tinh chỉnh bạn đã đưa ra (tín dụng cho bạn):

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

Cảm ơn bạn. Tôi đã thử điều này, nhưng dường như nó không sử dụng các kết nối song song: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'
Ngọa mèo

Ồ, khi tôi xóa cài đặt "net: timeout", nó trở nên song song. Nhưng nó chậm lại sau một lúc. Tôi nghĩ bởi vì các kết nối bắt đầu "treo".
Ngọa mèo

1
Nó hoạt động hoàn hảo với các net:idlethiết lập. Cảm ơn bạn! Tôi sẽ thêm giải pháp của mình cho câu hỏi.
Ngọa mèo

1
Lưu ý rằng lftp hỗ trợ torrent như giao thức truyền bên dưới. Sử dụng nó. Tất cả các giao thức khác mà nó hỗ trợ không hỗ trợ phát hiện / sửa lỗi theo từng đoạn và dựa vào TCP để cung cấp phát hiện lỗi. Lưu ý rằng torrent sử dụng phát hiện lỗi TCP nhưng trên đầu nó xác minh hàm băm sha1 của toàn bộ tệp của bạn và cả từng khối được truyền qua mạng. Theo kinh nghiệm của tôi, một bộ phim 4GB được xử lý qua mạng 4G thường có hai lỗi xác minh băm - điều này có nghĩa là TCP coi gói tin nhận được không có lỗi ngay cả khi chúng bị hỏng
slebetman

1
@slebetman, ở đây OP sử dụng HTTPS. TLS cung cấp kiểm tra tính toàn vẹn bổ sung (qua tổng kiểm tra yếu của TCP) thông qua HMAC. Ngoài ra HTTP có hỗ trợ kiểm tra nội dung hoặc khối với các tiêu đề Content-MD5Digesttiêu đề (mặc dù tôi không biết nếu lftphỗ trợ những nội dung đó hoặc nếu chúng sẽ được sử dụng trong trường hợp của OP). Trong mọi trường hợp, có vẻ như torrent sẽ là một tùy chọn cho OP.
Stéphane Chazelas

12

Tôi không thể kiểm tra điều này cho bạn trong tình huống của bạn, nhưng bạn không nên sử dụng --rangevới -C -. Đây là những gì trang người đàn ông nói về chủ đề này:

Sử dụng -C -để nói curlđể tự động tìm ra nơi / cách tiếp tục chuyển tiền. Sau đó, nó sử dụng các tệp đầu ra / đầu vào đã cho để tìm ra điều đó.

Hãy thử điều này thay thế:

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

Tôi cũng khuyên bạn nên luôn trích dẫn các biến của mình để shell không cố phân tích chúng. (Xem xét một URL https://example.net/param1=one&param2=two, trong đó trình bao sẽ phân chia giá trị tại &.)

Ngẫu nhiên, 120 KB / s xấp xỉ 1,2 Mb / giây, đây là tốc độ tải lên xDSL điển hình ở nhiều nơi trên thế giới. 10 giây mỗi MB, do đó, dưới một giờ cho toàn bộ tệp. Không quá chậm, mặc dù tôi đánh giá cao bạn quan tâm đến độ tin cậy hơn là tốc độ.


2
Cảm ơn bạn. Cách tiếp cận này sẽ hiệu quả, nhưng nó chậm, vì nó không tải xuống song song. Chúng có giới hạn tốc độ cho mỗi kết nối và tôi phải hoàn tất tải xuống sau 1 giờ, vì chúng tạo tệp hàng giờ. Cập nhật câu hỏi.
Ngọa mèo


4

Bên ngoài hộp: Đặt một cái bịt mắt và sử dụng bittorrent. Làm cho kích thước khối nhỏ khi bạn tạo torrent. Rõ ràng, mã hóa tệp để bất kỳ ai khác tìm thấy torrent không có gì hữu ích.


1
Đây là tập đoàn hiếm hoi phân phối nội bộ tệp trên torrent.
RonJohn

5
Chính xác. Ngay cả khi kết nối thực sự xấu và tập tin bị hỏng theo cách nào đó, nó vẫn hoạt động tốt. PRO-TIP: Mã hóa nó, đổi tên thành 'KimKardashianNude.mp4' và để hàng ngàn người giúp bạn kết nối. Tự động, phân phối sao lưu miễn phí! :)
Eric Duminil

Như chính Linus đã nói - "Chỉ những người phù thủy mới sử dụng sao lưu băng: những người đàn ông thực sự chỉ tải lên những thứ quan trọng của họ trên ftp, và để phần còn lại của thế giới phản chiếu nó;)"
ivanivan

@RonJohn Tôi biết nó không được sử dụng phổ biến nhưng điều đó không có nghĩa là nó không thể được sử dụng. Giao thức bittorrent rất tốt trong việc đưa ra các kết nối xấu.
Loren Pechtel

@LorenPechtel Lệnh làm việc để RISK phê duyệt các cổng, WO cho NOC để mở các cổng và WO cho các nhóm Linux và Windows để cài đặt các máy khách torrent và một WO khác để giám sát tất cả các tệp được phê duyệt chuyển nhượng. Và không ai trong số đó tính đến HIPPA, PCI hoặc thực tế là một tệp được cho là đi từ Điểm A đến Điểm B hiện đang đi từ Điểm A đến Điểm C, D, E, F, G, H, I và J trước đó đến điểm B. RỦI RO sẽ không chấp nhận vì lý do đó.
RonJohn

3

Tôi đã gặp vấn đề tương tự trong công việc trước đây của tôi (ngoại trừ các bản sao lưu cơ sở dữ liệu ngoại vi 300GB + trên một kết nối không ổn định (từ văn phòng)). Người dùng đã gặp sự cố nghiêm trọng khi tải xuống tệp lớn hơn khoảng. 1 GB trước khi kết nối kết nối. Vì họ đã sử dụng tệp sao chép / dán Windows tiêu chuẩn qua kết nối RDP, không có gì lạ.

Một điều tôi phát hiện ra là các cài đặt VPN của chúng tôi hoàn toàn không khớp với thiết lập mạng (chủ yếu là độ dài MTU). Điều thứ hai là máy photocopy tệp của Windows KHÔNG được tạo để sao chép nội dung qua internet.

Giải pháp đầu tiên của tôi là một máy chủ FTP đơn giản, tuy nhiên, nó không giải quyết được vấn đề về thời gian truyền (thường là 3-4 giờ trên kết nối của chúng tôi).

Giải pháp thứ hai của tôi là sử dụng Syncthing để gửi các tệp trực tiếp tới một NAS đường phố. Mỗi đêm sau khi sao lưu xong, Syncthing đã gửi mọi thứ chúng tôi cần trở lại một NAS trong văn phòng. Không chỉ vấn đề về thời gian truyền hơn 3 giờ đã được giải quyết, mà tôi còn được dùng 1-2 giờ để chuyển phát dữ liệu nếu có khủng hoảng. Vào lúc 8 giờ sáng mỗi ngày, các tệp sẽ được cập nhật trên NAS và chúng tôi đã sẵn sàng sao lưu. Ngay cả với các tệp khổng lồ (tại một thời điểm cơ sở dữ liệu gần 700 GB), tôi vẫn chưa gặp phải bất kỳ sự cố hỏng tệp nào hoặc các vấn đề khác ...

Syncthing rất dễ cài đặt và quản lý và có sẵn cho tất cả các nền tảng (ngay cả điện thoại) và xử lý rất tốt các kết nối xấu .. nếu kết nối không thành công, Syncthing chỉ cần đợi vài phút và thử lại.

Bạn cần một thư mục cục bộ để đồng bộ hóa mọi thứ, nhưng các tệp của bạn sẽ có sẵn gần như ngay khi chúng được cập nhật.

Một điều tốt nữa về đồng bộ hóa, đó là nó có thể được đặt thành chỉ đồng bộ hóa các thay đổi trong tệp (như trong bản sao lưu vi sai) ... có thể giải quyết một phần vấn đề băng thông của bạn.


+1 để đề cập đến đồng bộ hóa - một thay thế ổ đĩa / hộp google để sao lưu
Edward Torvalds

1

Bạn có thể xem xét một giải pháp trường học cũ để di chuyển các tệp qua kết nối tệ hại - zmodem .

Điều này đã được phát triển trở lại khi 2400 modem baud với những người nhấc điện thoại và ném bom kết nối là chuẩn mực. Có thể đáng thử.


0

Bạn có thể thử sử dụng Kermit :

Tính năng phân biệt giao thức Kermit với hầu hết các giao thức khác là phạm vi cài đặt rộng để cho phép thích ứng với mọi loại và chất lượng kết nối giữa hai loại máy tính - độ dài gói, mã hóa gói, kích thước cửa sổ, bộ ký tự, phương pháp phát hiện lỗi, thời gian chờ , tạm dừng. Hầu hết các giao thức khác được thiết kế để chỉ hoạt động trên một số loại hoặc chất lượng kết nối nhất định và / hoặc giữa các loại máy tính nhất định hoặc như hệ thống tệp, do đó hoạt động kém (hoặc hoàn toàn không) ở bất kỳ nơi nào khác và cung cấp một số phương pháp để thích ứng với không có kế hoạch -cho các tình huống. Mặt khác, Kermit cho phép bạn đạt được chuyển tập tin thành công và hiệu suất cao nhất có thể trên bất kỳ kết nối nào. "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.