1 điểm bởi GN⁺ 2025-06-15 | 1 bình luận | Chia sẻ qua WhatsApp
  • Go-Torrent là một triển khai trình khách BitTorrent được viết bằng Go, hiện thực các chức năng cốt lõi để tải tệp bằng giao thức BitTorrent
  • Phạm vi triển khai bao gồm phân tích tệp .torrent, khám phá peer, giao tiếp peer và tải tệp, đồng thời xử lý cả torrent một tệp và nhiều tệp
  • Bencode hỗ trợ các kiểu chuỗi, số nguyên, danh sách và từ điển, đồng thời bao gồm xử lý lỗi và chức năng xác thực
  • Tính năng tải xuống cung cấp quản lý mảnh (piece) và khối, tải xuống đồng thời, theo dõi tiến độ và quản lý lưu trữ ở mức khối
  • Dự án hiện vẫn đang được phát triển tích cực, và trong tương lai dự kiến sẽ hỗ trợ Magnet link, metadata exchange protocol và DHT

Các chức năng mà Go-Torrent triển khai

  • Go-Torrent là một triển khai trình khách BitTorrent được viết bằng Go
  • Hiện thực các chức năng cốt lõi để có thể tải tệp bằng giao thức BitTorrent
  • Phạm vi triển khai chính gồm có
    • Phân tích tệp torrent
    • Khám phá peer
    • Tải tệp

Bencode và xử lý tệp torrent

  • Mã hóa/giải mã Bencode hỗ trợ mọi kiểu Bencode
    • Chuỗi
    • Số nguyên
    • Danh sách
    • Từ điển
  • Bao gồm xử lý lỗi và xác thực
  • Xử lý tệp torrent hỗ trợ phân tích tệp .torrent
    • Torrent một tệp
    • Torrent nhiều tệp
  • Hỗ trợ tính toán info hash và trích xuất piece hash
  • Hỗ trợ các trường chuẩn của tệp torrent

Khám phá peer và giao tiếp

  • Hỗ trợ khám phá peer thông qua HTTP tracker
  • Hiện thực giao thức bắt tay peer
  • Bao gồm đầy đủ giao thức thông điệp BitTorrent
  • Cung cấp quản lý kết nối peer

Quản lý tải xuống và lưu trữ

  • Tính năng tải xuống bao gồm quản lý mảnh (piece) và khối
  • Có thể thực hiện nhiều lượt tải xuống đồng thời
  • Theo dõi tiến độ tải xuống
  • Hỗ trợ ghép tệp cho cả torrent một tệp và nhiều tệp
  • Quản lý lưu trữ hoạt động ở granularity mức khối

Cấu trúc, yêu cầu và trạng thái phát triển

  • Cấu trúc dự án được chia thành các package sau
    • cmd/: giao diện dòng lệnh và ứng dụng chính
    • internal/bencode/: mã hóa/giải mã Bencode
    • internal/torrent/: xử lý tệp torrent
    • internal/tracker/: hiện thực giao thức tracker
    • internal/peer/: giao tiếp peer
    • internal/download/: quản lý tải xuống
    • pkg/: package công khai
  • Yêu cầu là Go 1.21 trở lên
  • Cách cài đặt là clone kho lưu trữ rồi chạy go mod download
  • Tài liệu hướng dẫn sử dụng sẽ được bổ sung khi dự án hoàn thiện hơn
  • Trạng thái triển khai hiện tại có thể xem tại checkpoint.md
  • Các tính năng được lên kế hoạch gồm có
    • Hỗ trợ Magnet link
    • Metadata exchange protocol
    • Hỗ trợ DHT(Distributed Hash Table)
  • Tài liệu tham khảo là BitTorrent Protocol SpecificationBencode Specification

1 bình luận

 
GN⁺ 2025-06-15
Các ý kiến trên Hacker News
  • Tuyệt vời. Tuy nhiên, vì đây là đầu vào không đáng tin cậy, nên có lẽ nên giới hạn kích thước cấp phát động trong bộ giải mã bencode
    Đầu vào độc hại trong tệp torrent hoặc phản hồi announce có thể yêu cầu cấp phát rất lớn trong lúc phân tích chuỗi, đẩy client vào tình trạng từ chối dịch vụ. Với một torrent được tạo đúng, chuỗi không thể dài hơn phần đầu vào còn lại, nên lấy độ dài đầu vào còn lại làm giới hạn trên có vẻ ổn

  • Trông gọn gàng và đơn giản, rất thích. Sẽ hay hơn nếu README có một dòng ví dụ sử dụng để thực sự tải xuống một tệp .torrent
    Ví dụ: ./go-torrent My-Linux-Distro-Wink-ISO.torrent
    Thêm cả torrent.ParseFromUrl nữa thì càng tốt; những dự án kiểu này ai cũng đáng thử một lần như một bài rèn luyện bản thân

  • Hay quá. codecrafters có một thử thách hướng dẫn phần nào quy trình này và cung cấp cả bài kiểm thử. Tôi đã thử một chút trong tháng miễn phí và thấy khá thú vị
    https://app.codecrafters.io/courses/bittorrent/overview

  • Hay đấy. Tôi cũng từng nghĩ đến việc làm thứ như vậy. Tò mò không biết nó khó đến mức nào, và có thể coi là “hoàn thiện” đến đâu. Cũng muốn biết có xử lý cả DHT, Magnet và đủ loại tính năng vượt NAT không
    Điểm tôi luôn bị kẹt là không biết danh sách tính năng cần có để tạo một client có thể chạy được với phần lớn torrent đang lưu hành thực tế là gì. Có vẻ có đến hàng chục giao thức liên quan đến torrent, và tôi thậm chí không rõ từng cái làm gì, chưa nói đến danh sách đầy đủ

    • Đúng là khó thật. Mất gần một tháng để học cách giao thức và bencoding hoạt động, xây dựng mô hình trong đầu, rồi mới viết mã thực tế
      Magnet và DHT thì vẫn chưa thêm

    • Độ khó phụ thuộc rất nhiều vào kinh nghiệm, mức độ quen thuộc với ngôn ngữ lập trình đang dùng, và thái độ sẵn sàng thử nghiệm. Để tham khảo, tôi cũng mới bắt đầu viết client Bittorrent bằng Go tuần trước, và sau một tuần đã đạt khoảng 80% so với dự án được đăng
      Tuy vậy, tôi có nhiều kinh nghiệm với Go, có kiến thức khá tốt về giao thức và mạng, và việc thử nghiệm gần như đã thành bản năng thứ hai

      Nếu quan tâm, đặc tả cốt lõi của Bittorrent thực ra khá ngắn, có thể đọc và hiểu dễ dàng trong khoảng một giờ: https://www.bittorrent.org/beps/bep_0003.html

      Xung quanh Bittorrent có nhiều thứ như các phần mở rộng giao thức, nhưng theo những gì tôi thấy đến giờ thì mức hỗ trợ khác nhau tùy client. Ví dụ Protocol Encryption thực chất gần giống che giấu hơn; client sẽ thử giao tiếp theo cách đó trước, nếu không được thì tùy cấu hình sẽ quay về giao thức thường

      Nếu chỉ tải một bản phân phối Linux, chẳng hạn Debian, bằng tệp .torrent trên website thì tương đối thẳng thắn. Đó là một tệp đơn, có tracker, có nhiều peer dùng giao thức thường, và nếu bạn ở sau NAT thì vẫn có thể phần nào hoạt động mà không cần nhận kết nối đến

      Khi tự nhiên bước vào vùng nội dung xám hơn, bạn có thể sẽ muốn phân tích liên kết Magnet, tìm peer bằng DHT, và triển khai cả UPnP để tự động ánh xạ cổng trên modem. Dù vậy, những thứ này cũng có thể được xây dần từng phần theo vòng lặp. Càng có nhiều tính năng, khả năng tìm được nhiều peer hơn và trao đổi thành công càng cao

  • Tôi không phải lập trình viên Go nên muốn hỏi: vì sao lại dùng Go 1.21 cũ như vậy? Có lý do nào phải ở lại phiên bản cũ không?
    Sửa: hình như nó đã hết hỗ trợ từ 10 tháng trước

  • Rất hay. Làm tôi nhớ thời đại học. Tôi từng làm cái này như đồ án cuối kỳ trong môn mạng ở Georgia Tech
    Mã thì đã mất từ lâu, nhưng những bài học khi đó vẫn còn. Những dự án kiểu này cũng là cách tốt để học một ngôn ngữ mới

  • Đây là kiểu dự án rất đáng thử. Tôi cũng từng làm một thứ tương tự, và đã thấy khiêm tốn hơn khi nhìn vào bộ mã hóa/giải mã bencode do người khác viết
    Nó cũng là cách hay để khám phá các tính năng của ngôn ngữ. Tất nhiên, cố bắt kịp mọi tính năng của các thư viện lớn là việc khá vô vọng, và tôi nghĩ khả năng tương thích giữa các client vốn đã thiếu rồi

  • Không biết có kế hoạch công bố tài liệu về quá trình triển khai không. Cá nhân tôi quan tâm phần đó hơn cả bản thân mã nguồn
    Vì không có nhiều tài liệu đi sâu vào cách tiếp cận hay quy trình triển khai các khía cạnh khác nhau của giao thức

  • Không biết đã làm v2 và mutable torrents chưa. Làm ơn, mong ai đó triển khai mutable torrents đi

  • Có hỗ trợ liên kết Magnet không?
    Sửa: à, hóa ra là tính năng dự kiến

    • Hiện thì chưa. Sắp tới sẽ thêm