16/09/2018, 18:18

Tìm hiểu về resume download

Vấn đề này mình đã gặp phải khá lâu. Nhưng hôm nay mới rảnh rỗi nhớ ra để viết về nó. Cũng đơn giản chỉ là chia sẻ với mọi người về những gì mình hiểu biết về vấn đề Resume download . Chả là từ khá lâu trước đây, một bạn đã từng là đồng nghiệp cũ ở công ty có PM hỏi mình đại loại rằng team của họ ...

Vấn đề này mình đã gặp phải khá lâu. Nhưng hôm nay mới rảnh rỗi nhớ ra để viết về nó. Cũng đơn giản chỉ là chia sẻ với mọi người về những gì mình hiểu biết về vấn đề Resume download. Chả là từ khá lâu trước đây, một bạn đã từng là đồng nghiệp cũ ở công ty có PM hỏi mình đại loại rằng team của họ làm về mảng mobile application. Họ trả về cho client một file có dung lượng khá lớn (~500MB). Và khách hàng của họ mong muốn là trong quá trình tải file xuống mà muốn tạm dừng hoặc không may mất kết nối mạng thì có thể tiếp tục tải lại file đó khi có kết nối mạng trở lại. Có thể làm được không? Và làm như thế nào? Với yêu cầu gì về phía client hoặc server? Thứ đầu tiên mình nghĩ khi được hỏi là thằng Internet Download Manager (IDM). Và đại loại là mình bảo với hắn rằng thằng IDM nó làm được. Nhưng tôi không biết nó làm như thế nào cả.

Sau đó, mình thấy vấn đề đó khá hay ho. Nên đã thử tìm hiểu với một vài từ khóa thì mình nhận ra rằng, việc resume download không phải là thằng IDM làm được mà chỉ đơn giản là thằng IDM hỗ trợ việc đó. Còn vấn đề có thể resume hay không lại là từ phía server. Vậy mà mình lại nghĩ do thằng IDM. Và mình cũng chợt nhớ ra là thi thoảng với một vài server IDM không hỗ trợ (hay không thể thì đúng hơn) resume download với status Resume capability: No. Đó là do server đó được cài đặt vô hiệu hóa việc resume.

Lan man thế cũng đủ rồi nhỉ? Mình sẽ nói sơ qua flow làm việc của IDM khi bắt đầu tải một file nhé (ý kiến và hiểu biết của cá nhân mình, nên có thể không chính xác lắm):

  1. IDM sẽ request lên server đó với đường dẫn của file cần tải.
  2. Sau khi nhận được response từ server. Nó kiểm tra xem có header Accept-Ranges: bytes hay không.
  3. Nếu có, thì server đó hỗ trợ resume. Và lần sau (nếu bạn đã tạm dừng và tải tiếp) nó sẽ gửi kèm một header Range: bytes=<Số lượng bytes đã tải được>- lên. Server sẽ trả về một status code là 206 Partial Content kèm header Content-Range: bytes <Số bytes bạn gửi lên>-<Số bytes của file - 1>/<Số bytes của file>

Để có thể dễ tưởng tượng hơn. Bây giờ chúng ta cùng đi thực nghiệm nhé. Mình dùng Ubuntu, nên chúng ta có thể sử dụng luôn package Wget với tùy chọn -c (--continue) để thử (không cần phải IDM). Phần chuẩn bị, chúng ta sẽ cài đặt NginX hoặc Apache2. Sau đó cho một file nặng nặng vào thư mục public của NginX (hoặc Apache - thường là /var/www/html). Do tốc độ truyền dữ liệu trong mạng local là rất nhanh nên chúng ta khó có thể xem chính xác được. Rất may là Wget có hỗ trợ limit rate (chúng ta sẽ sử dụng nó để giả lập tốc độ mạng).

Đầu tiên, chúng ta tải file với lệnh:

$ wget http://localhost/file.mp3 -c --limit-rate 500K

Rồi trong quá trình nó download, bạn bấm tổ hợp phím Ctrl+C để dừng. Rồi tiếp tục chạy lại lệnh trên để xem kết quả             </div>
            
            <div class=

0