Klien BitTorrent yang Diimplementasikan Sendiri dari Nol
(github.com/piyushgupta53)- Go-Torrent adalah implementasi klien BitTorrent yang dibuat dengan Go, yang mengimplementasikan fungsi inti untuk mengunduh file menggunakan protokol BitTorrent
- Cakupan implementasinya mencakup parsing file .torrent, penemuan peer, komunikasi peer, hingga pengunduhan file, serta menangani torrent file tunggal maupun multi-file
- Bencode mendukung tipe string, integer, list, dan dictionary, serta mencakup penanganan kesalahan dan fungsi validasi
- Fitur unduhan menyediakan manajemen piece dan block, unduhan bersamaan, pelacakan progres, serta manajemen penyimpanan per block
- Proyek ini masih aktif dikembangkan, dan dukungan untuk Magnet link, metadata exchange protocol, serta DHT direncanakan ke depannya
Fitur yang Diimplementasikan Go-Torrent
- Go-Torrent adalah implementasi klien BitTorrent yang ditulis dalam Go
- Mengimplementasikan fungsi inti agar file dapat diunduh menggunakan protokol BitTorrent
- Cakupan implementasi utamanya adalah sebagai berikut
- Parsing file torrent
- Penemuan peer
- Pengunduhan file
Bencode dan Pemrosesan File Torrent
- Encoding/decoding Bencode mendukung semua tipe Bencode
- String
- Integer
- List
- Dictionary
- Mencakup penanganan kesalahan dan validasi
- Pemrosesan file torrent mendukung parsing file
.torrent- Torrent file tunggal
- Torrent multi-file
- Mendukung perhitungan info hash dan ekstraksi piece hash
- Mendukung field file torrent standar
Penemuan dan Komunikasi Peer
- Mendukung penemuan peer melalui HTTP tracker
- Mengimplementasikan protokol handshake peer
- Mencakup protokol pesan BitTorrent secara lengkap
- Menyediakan manajemen koneksi peer
Manajemen Unduhan dan Penyimpanan
- Fitur unduhan mencakup manajemen piece dan block
- Dapat menjalankan beberapa unduhan secara bersamaan
- Melacak progres unduhan
- Mendukung perakitan file untuk torrent file tunggal maupun multi-file
- Manajemen penyimpanan bekerja dengan granularitas per block
Struktur, Persyaratan, dan Status Pengembangan
- Struktur proyek dibagi ke dalam paket berikut
cmd/: antarmuka command-line dan aplikasi utamainternal/bencode/: encoding/decoding Bencodeinternal/torrent/: pemrosesan file torrentinternal/tracker/: implementasi protokol trackerinternal/peer/: komunikasi peerinternal/download/: manajemen unduhanpkg/: paket publik
- Persyaratannya adalah Go 1.21 atau lebih baru
- Instalasi dilakukan dengan meng-clone repository lalu menjalankan
go mod download - Dokumentasi penggunaan akan ditambahkan ketika proyek sudah lebih matang
- Status implementasi saat ini dapat dilihat di checkpoint.md
- Fitur yang direncanakan adalah sebagai berikut
- Dukungan Magnet link
- Metadata exchange protocol
- Dukungan DHT(Distributed Hash Table)
- Referensinya adalah BitTorrent Protocol Specification dan Bencode Specification
1 komentar
Opini Hacker News
Bagus sekali. Namun karena inputnya tidak tepercaya, sebaiknya batasi ukuran alokasi dinamis di decoder bencode
Input berbahaya dari file torrent atau respons announce bisa meminta alokasi yang sangat besar saat parsing string, sehingga mendorong klien ke kondisi denial of service. Torrent yang dibuat dengan benar tidak mungkin berisi string yang lebih panjang daripada sisa panjang input, jadi tampaknya aman jika sisa panjang input dijadikan batas atas
Saya suka karena terlihat rapi dan sederhana. Akan bagus jika README menyertakan satu baris contoh penggunaan untuk benar-benar mengunduh file
.torrentContoh:
./go-torrent My-Linux-Distro-Wink-ISO.torrentAkan lebih baik lagi jika ditambahkan juga
torrent.ParseFromUrl, dan proyek seperti ini memang layak dicoba sekali sebagai latihan pribadiKeren. Di codecrafters ada challenge yang sedikit memandu proses ini dan juga menyediakan pengujian. Saya sempat mencobanya sedikit selama satu bulan gratis, dan itu menyenangkan
https://app.codecrafters.io/courses/bittorrent/overview
Keren. Saya juga pernah memikirkan hal seperti ini. Saya penasaran seberapa sulitnya, dan sejauh mana ini bisa dianggap “selesai”. Saya juga penasaran apakah ini menangani DHT, Magnet, dan berbagai fungsi NAT traversal
Titik yang selalu membuat saya buntu adalah saya tidak tahu daftar fitur apa saja yang diperlukan untuk membuat klien yang begitu saja bekerja pada sebagian besar torrent yang beredar. Sepertinya ada puluhan protokol terkait torrent, dan saya bahkan tidak tahu masing-masing melakukan apa, apalagi daftar lengkapnya
Memang sulit. Butuh hampir sebulan untuk mempelajari cara kerja protokol dan bencoding, membangun model mental, lalu menulis kode sebenarnya
Magnet dan DHT belum ditambahkan
Tingkat kesulitannya sangat bergantung pada pengalaman, kefasihan dengan bahasa pemrograman yang digunakan, dan sikap bereksperimen. Sebagai referensi, saya juga mulai membuat klien Bittorrent dengan Go minggu lalu, dan dalam satu minggu sudah mencapai sekitar 80% dari proyek yang diposting ini
Namun saya punya banyak pengalaman dengan Go, pengetahuan protokol dan jaringan yang cukup, dan eksperimen sudah hampir menjadi kebiasaan kedua bagi saya
Jika tertarik, spesifikasi inti Bittorrent sebenarnya cukup pendek dan bisa dengan mudah dibaca serta dipahami dalam sekitar satu jam: https://www.bittorrent.org/beps/bep_0003.html
Di “sekitar” Bittorrent ada banyak hal seperti ekstensi protokol, tetapi sejauh yang saya lihat, tingkat dukungannya berbeda-beda di tiap klien. Misalnya Protocol Encryption sebenarnya lebih mirip obfuscation; klien lebih dulu mencoba berkomunikasi dengan cara itu, lalu jika gagal akan kembali ke protokol biasa tergantung pengaturan
Untuk sekadar mengunduh distro Linux, misalnya Debian, dari file
.torrentdi situs web, jalurnya relatif lurus. Filenya satu, ada tracker, ada banyak peer yang memakai protokol biasa, dan jika berada di balik NAT, masih cukup mungkin meski tidak menerima koneksi masukKetika secara alami masuk ke konten area abu-abu, Anda mungkin ingin mem-parse tautan Magnet, menemukan peer lewat DHT, dan juga mengimplementasikan UPnP untuk mencoba memetakan port secara otomatis di modem. Meski begitu, ini juga bisa dibangun satu per satu secara iteratif. Semakin banyak fiturnya, semakin besar kemungkinan menemukan lebih banyak peer dan bertukar data dengan sukses
Karena saya bukan pengembang Go, saya penasaran kenapa memakai Go 1.21 yang sudah lama. Apakah ada alasan harus tetap di versi lama?
Edit: sepertinya dukungannya dihentikan 10 bulan lalu
Dukungan Windows 7 adalah salah satu alasan untuk tetap memakai rilis Go lama. Proyek yang dibuat dengan Go 1.21.4 atau lebih rendah akan berjalan di semua rilis Windows dan komputer yang dibuat sejak 2009, tetapi jika naik ke v1.21.5, tanpa banyak manfaat, proyek hanya akan berjalan di komputer yang lebih baru serta Windows 10/11
https://github.com/golang/go/issues/64622
README tampaknya mungkin dihasilkan oleh AI. File
go.modsebenarnya mencantumkan versi Go 1.23.1[1], yang berarti membutuhkan Go 1.23.1 atau lebih baru[2][1] https://github.com/piyushgupta53/go-torrent-client/blob/6130...
[2] https://go.dev/doc/modules/gomod-ref#go-notes
Sangat keren. Mengingatkan saya pada masa kuliah. Kami melakukan ini sebagai proyek akhir di kelas jaringan Georgia Tech
Kodenya sudah lama hilang, tetapi pelajaran yang saya dapat waktu itu masih tertinggal. Proyek seperti ini juga cara yang bagus untuk mempelajari bahasa baru
Ini jenis proyek yang bagus untuk dicoba. Saya juga pernah membuat yang mirip, dan melihat encoder/decoder bencode buatan orang lain membuat saya rendah hati
Ini juga cara yang bagus untuk mengeksplorasi fitur bahasa. Tentu saja, mencoba mengejar semua fitur library besar itu cukup sia-sia, dan menurut saya kompatibilitas antar-klien pun memang sudah kurang
Saya penasaran apakah ada rencana memublikasikan dokumentasi tentang proses implementasinya. Secara pribadi, saya lebih tertarik pada itu daripada kodenya sendiri
Karena tidak banyak materi yang membahas secara mendalam pendekatan atau proses implementasi berbagai aspek protokol
Saya penasaran apakah v2 dan mutable torrents juga dikerjakan. Tolong, semoga ada yang mengimplementasikan mutable torrents
Mendukung tautan Magnet?
Edit: oh, ternyata itu fitur yang direncanakan