Trình khách BitTorrent tự triển khai từ đầu
(github.com/piyushgupta53)- 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ínhinternal/bencode/: mã hóa/giải mã Bencodeinternal/torrent/: xử lý tệp torrentinternal/tracker/: hiện thực giao thức trackerinternal/peer/: giao tiếp peerinternal/download/: quản lý tải xuốngpkg/: 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 Specification và Bencode Specification
1 bình luận
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
.torrentVí dụ:
./go-torrent My-Linux-Distro-Wink-ISO.torrentThêm cả
torrent.ParseFromUrlnữ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ânHay 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
.torrenttrê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 đếnKhi 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
Hỗ trợ Windows 7 là một trong những lý do để ở lại các bản Go cũ. Dự án được tạo bằng Go 1.21.4 trở xuống sẽ chạy trên mọi bản Windows và máy tính sản xuất từ năm 2009 trở đi, nhưng nếu nâng lên v1.21.5 thì gần như không được lợi gì mà chỉ chạy trên máy tính mới hơn và Windows 10/11
https://github.com/golang/go/issues/64622
README có lẽ là do AI tạo ra. Tệp
go.modthực tế ghi phiên bản Go là 1.23.1[1], nghĩa là cần Go 1.23.1 trở lên[2][1] https://github.com/piyushgupta53/go-torrent-client/blob/6130...
[2] https://go.dev/doc/modules/gomod-ref#go-notes
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