1 poin oleh GN⁺ 2025-06-15 | 1 komentar | Bagikan ke WhatsApp
  • 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 utama
    • internal/bencode/: encoding/decoding Bencode
    • internal/torrent/: pemrosesan file torrent
    • internal/tracker/: implementasi protokol tracker
    • internal/peer/: komunikasi peer
    • internal/download/: manajemen unduhan
    • pkg/: 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

 
GN⁺ 2025-06-15
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 .torrent
    Contoh: ./go-torrent My-Linux-Distro-Wink-ISO.torrent
    Akan lebih baik lagi jika ditambahkan juga torrent.ParseFromUrl, dan proyek seperti ini memang layak dicoba sekali sebagai latihan pribadi

  • Keren. 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 .torrent di 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 masuk

      Ketika 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

  • 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

    • Belum. Akan segera ditambahkan