Klien BitTorrent yang Diimplementasikan Sendiri dari Scratch
(github.com/piyushgupta53)- Proyek open source ini adalah klien BitTorrent yang diimplementasikan dengan bahasa Go, dengan logika dasar pengunduhan file yang dibangun sendiri
- Menangani encoding/decoding Bencode secara langsung dan mencakup fitur validasi error yang kuat
- Mendukung secara komprehensif fitur inti seperti parsing file .torrent, perhitungan info hash, dan komunikasi antar-peer
- Mencakup fitur yang meningkatkan kegunaan nyata seperti pengunduhan paralel, perakitan file, dan manajemen penyimpanan per blok
- Dibandingkan open source BitTorrent yang sudah ada, proyek ini unggul dalam kesederhanaan bahasa Go, kejelasan struktur kode, dan modularisasi
Ikhtisar
Proyek ini mengimplementasikan klien BitTorrent secara langsung dengan bahasa Go
Menyediakan kemampuan mengunduh file menggunakan protokol BitTorrent dalam bentuk pengembangan mandiri
Secara utama, proyek ini menangani parsing file torrent, penemuan peer, dan pengunduhan file
Fitur utama
-
Encoding/decoding Bencode
- Mendukung semua tipe Bencode seperti string, integer, list, dan dictionary
- Menerapkan penanganan error yang kuat serta validasi data
-
Pemrosesan file torrent
- Dapat mem-parsing torrent file tunggal maupun multi-file
- Mendukung semua field standar, termasuk ekstraksi info hash dan hash tiap piece
-
Penemuan dan komunikasi peer
- Mendukung tracker HTTP
- Mengimplementasikan protokol handshake antar-peer
- Menjalankan protokol pesan BitTorrent dan manajemen koneksi peer
-
Fitur pengunduhan
- Manajemen berbasis piece dan blok
- Pemrosesan pengunduhan paralel
- Pelacakan progres unduhan dan perakitan file
- Menyediakan efisiensi melalui manajemen penyimpanan per blok
Struktur proyek
- cmd/ : antarmuka baris perintah dan file eksekusi
- internal/
- bencode/ : fungsi encoding dan decoding Bencode
- torrent/ : parsing dan pemrosesan file torrent
- tracker/ : implementasi protokol tracker
- peer/ : fungsi komunikasi antar-peer
- download/ : fungsi manajemen unduhan
- pkg/ : kumpulan package yang dapat diekspos ke luar
Persyaratan
- Memerlukan Go 1.21 atau lebih baru
Cara penggunaan
- Saat ini proyek masih dalam tahap awal pengembangan, panduan penggunaan akan ditambahkan kemudian
Status dan rencana pengembangan
- Pengembangan saat ini berlangsung aktif
- Tahap pengembangan yang lebih rinci dicatat dalam file checkpoint.md
- Rencana ke depan:
- Dukungan Magnet link
- Protokol pertukaran metadata
- Dukungan DHT (Distributed Hash Table)
Dokumen referensi
- Spesifikasi protokol BitTorrent
- Spesifikasi Bencode
Pentingnya proyek dan keunggulan
- Proyek ini memanfaatkan sintaks sederhana dan konkurensi khas bahasa Go untuk mengimplementasikan elemen kompleks klien BitTorrent dengan modularisasi yang jelas
- Strukturnya jelas sehingga unggul dalam skalabilitas dan kemudahan pemeliharaan, memberi manfaat baik untuk pembelajaran maupun penerapan nyata
- Meskipun masih berada pada tahap yang relatif awal, proyek ini telah dengan cepat mewujudkan fitur inti protokol BitTorrent
1 komentar
Komentar Hacker News
Ada saran agar ukuran alokasi memori dinamis di decoder bencode dibatasi. Karena nilai input yang masuk dari file torrent atau announce tidak bisa dipercaya, input berbahaya bisa meminta alokasi yang sangat besar dan memicu penolakan layanan (DoS). Untuk parsing string, batas atas yang tepat bisa ditetapkan ke panjang input yang tersisa, karena torrent yang valid tidak mungkin memiliki string yang lebih panjang daripada sisa panjang file
Proyeknya terlihat rapi dan simpel, jadi enak dilihat. Akan bagus kalau ada contoh penggunaan satu baris di README. Misalnya menambahkan kalimat yang menunjukkan cara pakai seperti
./go-torrent My-Linux-Distro-Wink-ISO.torrent. Akan lebih mantap lagi kalau fiturtorrent.ParseFromUrljuga ditambahkan. Pengalaman seperti ini layak dicoba semua orang sebagai “perjalanan spiritual” masing-masingMemperkenalkan challenge serupa yang disediakan codecrafters. Dalam proses ini mereka membantu alur pengerjaan dan pengujian, dan saya pernah mencobanya gratis selama sebulan, cukup menyenangkan
https://app.codecrafters.io/courses/bittorrent/overview
Dari sudut pandang orang yang bukan developer Go, saya penasaran kenapa menggunakan versi lama Go 1.21. Apakah ada alasan khusus untuk tetap memakai versi lawas? Setelah dicek, dukungannya ternyata sudah dihentikan 10 bulan lalu
Karena dukungan Windows 7. Proyek yang ditulis dengan Go 1.21.4 atau lebih rendah bisa berjalan di hampir semua Windows dan hampir semua komputer sejak 2009, tetapi jika memakai 1.21.5 atau lebih baru, programnya hanya berjalan di komputer modern dengan Windows 10 dan 11 tanpa manfaat khusus
https://github.com/golang/go/issues/64622
README-nya kemungkinan besar ditulis oleh AI. File go.mod yang sebenarnya menetapkan versi Go ke 1.23.1, jadi hasilnya perlu 1.23.1 atau lebih baru
https://github.com/piyushgupta53/go-torrent-client/blob/6130f4e/go.mod#L3 https://go.dev/doc/modules/gomod-ref#go-notes
Proyek yang benar-benar keren. Waktu kuliah saya pernah mengerjakan ini sebagai tugas akhir di kelas jaringan Georgia Tech. Kodenya memang sudah hilang, tapi pelajarannya membekas seumur hidup. Proyek seperti ini memang cara yang sangat bagus untuk mempelajari bahasa baru
Ada yang bertanya apakah magnet link didukung.
Edit: ternyata itu fitur yang akan ditambahkan nanti
Saya penasaran bagaimana ini dibuat. Apakah melihat spesifikasi protokol secara langsung, atau mengacu ke implementasi lain? Saya selalu penasaran bagaimana orang mengimplementasikan hal seperti ini dari nol
https://www.bittorrent.org/beps/bep_0003.html
Ekstensi tambahannya ada di
https://www.bittorrent.org/beps/bep_0000.html
Penting untuk memecah pekerjaan menjadi unit yang sangat kecil dan memeriksa hasilnya sendiri satu per satu. Misalnya saya mulai dari parsing file
.torrent, yang berarti harus mengimplementasikan bencoding sendiri. Setelah mengunduh.torrentuntuk Arch Linux, ternyata formatnya tidak valid dan muncul key tak terduga sepertiurl-list. Setelah saya telusuri, ternyata itu terkait bep_0019. Pada akhirnya saya berhasil mem-parsing file.torrentDebian LinuxSetelah itu saya juga mengimplementasikan request HTTP announce tracker dan protokol peer. Protokol peer cukup sulit, dan pendekatan eksperimental sangat membantu. Saya menghapus announce URL dari torrent Debian agar benar-benar tidak ada peers, lalu menambahkan klien saya sendiri secara manual ke KTorrent untuk mengamati pesan yang dipertukarkan, kemudian menyesuaikan kode saya berdasarkan hasil itu. Ada sangat banyak trial and error serta proses debugging
Beberapa detail protokol memang sulit ditemukan di dokumen resmi, jadi sesekali saya bertanya ke ChatGPT, dan implementasi antar-klien juga sedikit berbeda sehingga algoritme detailnya tidak terlalu jelas. Misalnya blok mana yang harus diambil, peer mana yang dipilih untuk koneksi, dan bagaimana choke/unchoke bekerja, semua itu tidak terdokumentasi rapi. Pencarian web sangat membantu
Selain itu, situs https://wiki.theory.org/Main_Page juga punya informasi yang berguna
Saat ini sudah sampai tahap bisa melakukan download/upload penuh dengan KTorrent. Berikutnya yang masih perlu dibuat adalah algoritme untuk mendapatkan peer dari tracker, memilih blok yang akan diunduh, dan menyimpannya ke file
Kalau ingin tahu proses yang lebih detail, silakan tanya kapan saja
Bertanya seberapa sulit menambahkan GUI. Jarang melihat contoh implementasi GUI di Go
Secara pribadi saya suka https://github.com/AllenDang/giu, wrapper untuk ImGui
Yang paling kaya fitur tampaknya unison, tetapi saya tidak tahu apakah benar-benar banyak dipakai, dan dokumentasinya sepertinya sangat minim https://github.com/richardwilkes/unison
Gio adalah framework GUI dengan pendekatan baru, dipakai di Tailscale dan gotraceui https://gioui.org
Wails mudah dipelajari kalau punya pengalaman web development https://wails.io
Binding GTK4 juga terlihat cukup bagus https://github.com/diamondburned/gotk4
Cogent Core juga tampak menarik, tetapi saya hanya sempat mencobanya sebentar sebelum beralih ke bahasa Odin dari Go https://www.cogentcore.org/core
Secara pribadi saya sering mengalami masalah performa Fyne di berbagai komputer dan OS, tetapi bagaimanapun itu framework GUI yang paling terkenal https://fyne.io
Saya tertarik dengan proyek seperti ini dan sempat berpikir untuk mencobanya. Saya penasaran seberapa sulit, seberapa matang hasilnya, dan apakah fitur kompleks seperti DHT, Magnet, NAT traversal sudah diimplementasikan. Saya bahkan tidak terlalu tahu daftar fitur minimum yang wajib ada untuk bisa mencakup hampir semua torrent yang beredar. Protokol terkait torrent juga sangat banyak, jadi saya bahkan tidak tahu daftar lengkapnya maupun fungsi masing-masing protokol
Tingkat kesulitannya sangat bergantung pada pengalaman, penguasaan bahasa, dan sikap eksperimental. Sebagai contoh, saya sendiri baru mulai membuat klien Bittorrent dengan Go minggu lalu, dan dalam seminggu sudah mencapai sekitar 80% dari proyek yang dibagikan di sini. Karena saya sudah cukup paham Go, protokol, dan jaringan, serta terbiasa bereksperimen, progresnya jadi cepat
Spesifikasi resmi Bittorrent sendiri sangat singkat, jadi bisa dibaca dan dipahami dalam sekitar satu jam https://www.bittorrent.org/beps/bep_0003.html
Tetapi di sekelilingnya ada sangat banyak protokol ekstensi, dan dukungan tiap klien pun berbeda-beda. Misalnya, banyak yang pertama-tama mencoba enkripsi protokol, yang sebenarnya lebih mirip obfuscation, lalu kalau gagal baru memakai protokol biasa
Kalau tujuan Anda hanya mengunduh dari file
.torrentresmi seperti distro Linux, tingkat kesulitannya jelas lebih rendah. Biasanya hanya satu file, ada tracker, dan kebanyakan peer memakai protokol standar, jadi bahkan di lingkungan NAT pun tetap bisa bekerja tanpa harus membuka port internalTentu saja, kalau ingin menangani torrent umum, terutama yang lebih “abu-abu”, Anda perlu menambahkan parsing magnet link, DHT untuk penemuan peer, dan UPnP untuk pemetaan port otomatis. Namun semua itu tetap bisa diimplementasikan bertahap per fitur. Makin banyak fitur, makin banyak peer yang bisa ditemukan dan ditukar datanya dengan sukses
Cukup menantang, dan saya butuh hampir sebulan untuk memahami protokol dan cara kerja bencoding, membentuk gambaran arsitektur keseluruhan di kepala, lalu menulis kodenya. Magnet dan DHT masih belum didukung
Ada yang bertanya apakah v2 dan mutable torrents sudah diimplementasikan. Mereka juga menyampaikan harapan agar mutable torrents benar-benar didukung