SydexaSydexa
Trang chủKhoá họcBài viết
Tại sao trình tải xuống thi thoảng lại bị kẹt ở mức 99%?
Frontend

Tại sao trình tải xuống thi thoảng lại bị kẹt ở mức 99%?

Hải Phương
|
09/11/2025
|
11 phút đọc

Sau một tuần làm việc vất vả, bạn quyết định thưởng cho mình một buổi tối cuối tuần xem phim hành động hai người của Nhật Bản, bộ phim khá hay 9/10, xứng đáng tranh cử Oscar. Bạn quyết định tải bộ phim đó xuống để sau này xem lại, khi tiến trình đạt đến 99%, bạn quyết định đi lấy cốc nước, nhưng khi quay lại nó vẫn dừng ở mức 99%. Bạn thử mở các trang web khác nhưng nó vẫn rất nhanh, còn tiến trình tải xuống vẫn chỉ ở mức 99%. Tại sao chứ??

Đừng tuyệt vọng, bấm vào từng hình để tôi giải thích cho bạn nguyên nhân tại sao nhé.

Thanh tiến trình mà bạn đang thấy thực chất là giả

Ví dụ, có hai chương trình tải xuống, cả hai đều mất 100 giây để hoàn tất. Tiến trình A hiện thị 99% trong 10 giây, với 1% cuối cùng mất 90 giây. Tiến trình B chạy đều đặn với tốc độ không đổi, mỗi giây đều chạy 1%. Bạn nghĩ chương trình nào nhanh hơn? Tất nhiên là A rồi.

Các trang web đã khai thác tâm lý con người, tuy tốc độ thực tế là như nhau, nhưng A lại cho chúng ta cảm giác nhanh hơn, khiến chúng ta có xu hướng nán lại chờ đợi. Bạn có thể tham khảo hai bài viết này, link tôi để cuối bài viết

Mô hình máy khách - máy chủ (Client-Server)

Khi bạn download tài nguyên trên Google drive, Fshare,.. thì bạn đang sử dụng phương thức này.

Hãy tượng tượng bạn (Client) vào một nhà hàng, bạn gọi người phục vụ (Network) đến và bắt đầu gọi món, người phục vụ sẽ đưa yêu cầu của bạn đến nhà bếp (Server), nhà bếp sẽ làm món ăn, sau đó đưa cho người phục vụ và cuối cùng bạn sẽ nhận được món ăn.

Quá trình download diễn ra như thế nào?

Giả sử bạn muốn tải filefile yuamikami.mov từ một trang web nào đó

Bước 1: Client gửi Yêu cầu (Request) Bạn bấm vào nút "Tải về" (Download). Ngay lập tức, trình duyệt của bạn (Client) gửi một thông điệp (gọi là HTTP Request) đến máy chủ (Server) đang lưu trữ file đó. Thông điệp có nội dung đại khái là: "Này Server, tôi muốn lấy file yuamikami.mov."

Bước 2: Server Xử lý và Phản hồi (Response) Server nhận được yêu cầu. Nó sẽ kiểm tra vài thứ:

  • File này có tồn tại không? (Có)
  • Người này (bạn) có được phép tải không? (Ví dụ: Bạn đã đăng nhập chưa? File này có phải là file riêng tư không?)
  • Nếu mọi thứ ổn, Server sẽ phản hồi lại: "OK, tôi sẽ gửi file cho bạn đây."

Bước 3: Truyền dữ liệu (Data Transfer) Đây là phần "download" mà bạn thấy:

  • Server "đọc" file baocao.pdf từ ổ cứng của nó và bắt đầu gửi đi như một luồng dữ liệu (data stream) liên tục, từ đầu file đến cuối file.
  • Trình duyệt của bạn (Client) nhận luồng dữ liệu này và ghi nó vào ổ cứng của bạn (thường là một file tạm như .crdownload hoặc .tmp).

Bước 4: Hoàn tất Khi Server gửi xong 100% dữ liệu, nó sẽ báo: "Hết rồi nhé." Trình duyệt của bạn nhận được tín hiệu này, kiểm tra file (quét virus, xác minh), và đổi tên file tạm thành yuamikami.mov hoàn chỉnh. Quá trình hoàn tất.

Khi bạn sử dụng phương thức này, bạn sẽ được tải file trực tiếp từ nguồn chính gốc, bạn biết chắc chắn 100% file bạn tải về là file gốc, không bị người khác chỉnh sửa.

Nhưng mô hình này cũng có vài điểm yếu:

  • Một nguồn duy nhất: Tốc độ tải của bạn sẽ bị giới hạn hoàn tải bởi tốc độ upload của server
  • Chia sẻ băng thông: Nếu server có băng thông upload là 1000 Mbps, nhưng có 1000 người cùng tải file, về lý thuyết mỗi người sẽ chỉ được 1 Mbps. Càng đông người tải, bạn tải càng chậm.

Nhưng hiện nay, các công ty lớn đã giải quyết vấn đề tắc nghẽn băng thông bằng cách sử dụng CDN (Content Delivery Network), thay vì 1 server ở Mỹ, họ sẽ đặt hàng trăm bản sao của file đó trên các server khác trên khắp thể giới (Singapore, Nhật Bản, Việt Nam,…). Khi bạn bấm “Download”, hệ thống sẽ tự động điều hướng bạn đến server gần nhất (ví dụ: Singapore). Kết quả bạn sẽ tải nhanh hơn rất nhiều và các server khác cũng không bị quá tải.

Mô hình P2P (Peer-to-Peer)

Bạn có thể tượng tượng bạn đến một bữa tiệc, bạn và những người khác sẽ mang món ăn đến và chia sẻ món ăn với người khác, mọi người đều “ngang hàng” với nhau. Bạn sẽ gặp phương thức này khi tải các file torrent.

Khi bạn tải xuống một tệp tin, bạn sẽ lấy nó từ hàng nghìn người dùng đã tải xuống tệpp đó, đồng thời tải xuống các phần nhỏ khác nhau của tệp. Sau khi tải xuống hoàn tất, các phần nhỏ sẽ được ghép lại để tạo thành tệp hoàn chỉnh.

Quá trình download diễn ra như thế nào?

Trước khi bắt đầu, chúng ta hãy làm quen với các thuật ngữ cơ bản:

  • Torrent: Tệp Torrent là một tệp chứa thông tin về tệp mà bạn muốn tải xuống, bao gồm tên tệp, kích thước và các máy chủ tracker. Tệp Torrent thường có đuôi .Torrent và thường có nhiều tệp rất nhỏ.
  • Tracker: Tracker là một máy chủ hoặc dịch vụ trung gian giúp theo dõi, quản lý các máy tính tham gia vào việc tải, chia sẻ dữ liệu trong mạng Torrent, ghi nhận hoạt động của bạn và giúp kết nối để trao đổi dữ liệu.
  • Seed: Người seed (hoặc seeders) là những người đã tải hoàn toàn một tệp Torrent và vẫn giữ nó để chia sẻ cho người khác. Họ đóng góp vào tốc độ tải xuống của người khác bằng cách đồng ý chia sẻ dữ liệu.
  • Swarm: Swarm là tập hợp của tất cả các seeder và leecher đang tham gia vào việc tải, chia sẻ một tệp Torrent cụ thể.
  • Client: Client là ứng dụng máy tính hoặc phần mềm mà bạn sử dụng để tải và chia sẻ tệp Torrent, ví dụ: uTorrent, BitTorrent, qBitTorrent,…

Ví dụ bạn sử dụng BitTorrent để tải một file 10GB.

Bước 0: "Tấm bản đồ" (File .torrent) Khi bạn bấm "tải torrent", bạn không tải file 10GB đó ngay. Bạn tải một file rất nhỏ (chỉ vài KB) có đuôi là .torrent. File này giống như một "tấm bản đồ". Nó chứa 2 thông tin:

  1. Thông tin về file: Tên file, kích thước, và quan trọng nhất là file 10GB này được chia thành 10.000 mảnh nhỏ (gọi là "pieces"), mỗi mảnh 1MB.
  2. Địa chỉ của "Người điều phối" (Tracker): Đây là một Server đặc biệt.

Bước 1: Liên lạc với Tracker (Người điều phối) Phần mềm của bạn (ví dụ: uTorrent, qBittorrent) đọc file .torrent, và liên lạc với Tracker. Nó nói: "Chào Tracker, tôi muốn tải file 10GB này. Hãy cho tôi danh sách những người khác cũng đang tải hoặc đang có file này."

Lưu ý: Tracker không có file 10GB đó. Nó chỉ như một cuốn sổ điện thoại, biết ai đang ở trong "bữa tiệc" và họ đang có những "món ăn" (mảnh file) nào.

Bước 2: Gia nhập "Bầy đàn" (The Swarm) Tracker trả về cho bạn một danh sách các địa chỉ IP của những người khác (gọi là Peer - những người ngang hàng). Tất cả những người này gộp lại gọi là một Swarm (Bầy đàn).

Bước 3: "Mọi người vì tôi" (Downloading) Phần mềm của bạn bắt đầu kết nối trực tiếp với hàng chục, hàng trăm người trong danh sách đó và "hỏi" (request):

  • Hỏi Người A: "Bạn có mảnh số 1 không? Gửi cho tôi."
  • Hỏi Người B: "Bạn có mảnh số 2 không? Gửi cho tôi."
  • Hỏi Người C: "Bạn có mảnh số 100 không? Gửi cho tôi."

Bạn đang tải về các mảnh file từ rất nhiều người cùng một lúc. Đây là lý do tốc độ tải P2P có thể cực kỳ nhanh, vì bạn đang cộng gộp tốc độ upload của nhiều người khác.

Bước 4: "Tôi vì mọi người" (Uploading) Ngay khi bạn tải xong mảnh số 1 từ Người A, bạn không giữ nó cho riêng mình. Ngay lập tức, bạn "quảng cáo" cho bầy đàn: "Này mọi người, tôi có mảnh số 1 đây!"

Lúc này, Người D (cũng mới tham gia) có thể sẽ kết nối với bạn để tải mảnh số 1. Quan trọng: Bạn bắt đầu upload (chia sẻ) ngay cả khi bạn chưa tải xong 100%. Bạn vừa download mảnh 100, vừa upload mảnh 1.

Quá trình này cứ thế tiếp diễn, các mảnh nhỏ được trao đổi lung tung trong bầy đàn cho đến khi bạn có đủ 10.000 mảnh. Phần mềm sẽ tự động ghép chúng lại thành file 10GB hoàn chỉnh.

Tốc độ tải của P2P so với Client-Server có thể là rất là nhanh, càng nhiều người tải thì thời gian bạn nhận được file càng ngắn. Nhưng cũng có những vấn đề với P2P khi bạn tải các thành phần con từ những người khác, sẽ có trường hợp người dùng đó bị mất kết nối hoặc dữ liệu đã bị mất, lúc này phần mềm sẽ loại bỏ thành phần đó và thử tải xuống lại từ người khác.

P2P cũng có vài điểm yếu như:

  • Khi bạn lấy một thành phần từ người dùng có tốc độ upload “rùa bò” thì thời gian bạn lấy được thành phần đó là rất lâu.
  • Nếu file có ít người tải thì tốc độ tảu sẽ cực chậm, hoặc không thể tải được.
  • Địa chỉ IP của bạn sẽ bị phơi bày với tất cả những người trong mạng, file tải về cũng có thể sẽ bị nhiễm virus.

Lời kết:

Sẽ có nhiều nguyên nhân dẫn đến việc tiến trình tải xuống bị treo ở 99% tùy thuộc vào phương thức mà trang web bạn tải tài nguyên sử dụng. Ví dụ như người nắm giữ những thành phần nhỏ cuối cùng bạn cần lại có tốc độ mạng của những năm 2000, trình duyệt hoặc hệ điều hành đang ghép file hoặc đang quét virus,…

Hãy nhớ thanh tiến trình không phải lúc nào cũng đúng, vì vậy lần sau khi thấy thanh tiến trình 99% thì đừng vội, hãy nghỉ ngơi và đợi quá trình hoàn tất 100% nhé.

Tham khảo:

https://medium.com/@nikhilwadofficial/the-psychology-of-progress-bars-why-we-love-watching-them-fill-baf91210f316

https://www.newscientist.com/article/dn18754-visual-tricks-can-make-downloads-seem-quicker/

Ngoài ra nếu muốn đào sâu hơn nữa, học các kiến thức chuyên sâu thực tiễn hơn từ giảng viên là chuyên gia có hơn 10 năm kinh nghiệm frontend và từng là kỹ sư tại Shopee Singapo thì bạn có thể tham khảo khoá học React Nâng Cao bên dưới của Sydexa nha!

React Nâng Cao - Chuyên Sâu với Tối Ưu Hiệu Năng
Khóa học React từ cơ bản đến nâng cao với chuyên gia. Trở thành Senior React Developer với Sydexa.
SydexaSydexa Team

Bài viết liên quan

Đừng đổ lỗi cho tối ưu hiệu năng nữa: Ứng dụng của bạn giật lag, có thể là do thiết kế sản phẩm quá tệ
Frontend
17/03/2026 · 8 phút đọc

Đừng đổ lỗi cho tối ưu hiệu năng nữa: Ứng dụng của bạn giật lag, có thể là do thiết kế sản phẩm quá tệ

Chắc hẳn mỗi khi chúng ta code xong một trang web và deploy lên production thì có một điều chúng ta khá quan tâm là Tối ưu hiệu năng (Performance Optimization). Trên mạng có nhiều bài viết chứa những thuật ngữ nghe rất đao to búa lớn: * Sử dụng Virtual List (danh sách ảo) để tối ưu việc render danh sách dài... * Sử dụng Web Worker để đẩy các tính toán phức tạp ra khỏi luồng chính (main thread)... * Sử dụng WASM để viết lại thuật toán lõi... Sau khi viết vài bài về tối ưu hiệu năng, cũng nh

Chi tiết bài viết
Chuyện gì thực sự xảy ra ở trình duyệt sau khi nhấn F5?
Frontend
11/03/2026 · 11 phút đọc

Chuyện gì thực sự xảy ra ở trình duyệt sau khi nhấn F5?

Trong lập trình frontend, "làm mới trang" trông có vẻ là một thao tác đơn giản, nhưng ẩn sau đó là một luồng phối hợp phức tạp giữa giao tiếp mạng (network communication), chiến lược cache (caching strategy) và engine render (rendering engine). Đặc biệt là khi nhấn F5, nó không phải là "tải lại hoàn toàn", cũng không phải là "dùng trực tiếp cache ở local", mà là một cơ chế xác thực thông minh nằm giữa hai trạng thái này. Để thực sự làm chủ các kỹ năng tối ưu hóa hiệu năng và debug frontend, bạn

Chi tiết bài viết
Server DTO: Nên giữ nguyên hay chuyển đổi?
Frontend
04/03/2026 · 12 phút đọc

Server DTO: Nên giữ nguyên hay chuyển đổi?

Trong các dự án mà Backend và Frontend được phát triển hoàn toàn tách biệt, chắc hẳn không ít lần chúng ta phải đau đầu với câu hỏi: "Dữ liệu server trả về thì nên xài luôn hay phải xào nấu lại?". Nếu dạo quanh các diễn đàn công nghệ hay đọc các bài thảo luận trên mạng, bạn sẽ thấy cuộc tranh luận về cách xử lý dữ liệu từ API này dường như chưa bao giờ có hồi kết. Cốt lõi của vấn đề luôn xoay quanh hai luồng quan điểm cực kỳ quen thuộc: "Dữ liệu backend trả về sao thì cứ tận dụng nguyên xi như

Chi tiết bài viết
Đừng lạm dụng useMemo nữa! Đây mới là Best Practice chuẩn xác dành cho bạn
Frontend
25/02/2026 · 12 phút đọc

Đừng lạm dụng useMemo nữa! Đây mới là Best Practice chuẩn xác dành cho bạn

useMemo là một React Hook giúp chúng ta ghi nhớ kết quả tính toán giữa các lần render để tối ưu hiệu năng trong một số trường hợp. Tuy nhiên, có một thực trạng đang diễn ra: người không biết thì chẳng bao giờ dùng, còn người đã biết thì lại lạm dụng nó ở mọi lúc, mọi nơi. Bài viết này sẽ giúp bạn hiểu rõ thực sự thì trong những trường hợp nào chúng ta mới nên sử dụng useMemo. Cú pháp tổng quát: useMemo hoạt động như thế nào? Ở lần render đầu tiên, useMemo sẽ thực thi hàm calculateValue (khôn

Chi tiết bài viết
Sydexa
Sydexa
SydexaSydexa

Nền tảng học lập trình với animation trực quan và bài tập tương tác, giúp bạn hiểu sâu thay vì chỉ đọc lý thuyết.

Sydexa FanpageBackend GroupFrontend Group

We learn, We share, We grow

Powered By
Cộng đồng System Design Việt Nam

contact@sydexa.com
0971489013