1 puan yazan GN⁺ 2025-06-15 | 1 yorum | WhatsApp'ta paylaş
  • Go-Torrent, Go ile yapılmış bir BitTorrent istemcisi uygulaması olup, BitTorrent protokolünü kullanarak dosya indirmek için temel işlevleri hayata geçirir
  • Uygulama kapsamı .torrent dosyası ayrıştırma, peer keşfi, peer iletişimi ve dosya indirmeyi içerir; hem tek dosyalı hem de çok dosyalı torrent’leri işler
  • Bencode; string, integer, liste ve sözlük türlerini destekler, hata işleme ve doğrulama işlevlerini içerir
  • İndirme özelliği parça (piece) ve blok yönetimi, eşzamanlı indirme, ilerleme takibi ve blok düzeyinde kayıt yönetimi sunar
  • Proje hâlâ aktif olarak geliştirilmektedir; gelecekte Magnet link, metadata exchange protocol ve DHT desteği planlanmaktadır

Go-Torrent’ın uyguladığı özellikler

  • Go-Torrent, Go ile yazılmış bir BitTorrent istemcisi uygulamasıdır
  • BitTorrent protokolünü kullanarak dosya indirebilmek için temel işlevleri hayata geçirir
  • Başlıca uygulama kapsamı şöyledir
    • Torrent dosyası ayrıştırma
    • Peer keşfi
    • Dosya indirme

Bencode ve torrent dosyası işleme

  • Bencode kodlama/kod çözme tüm Bencode türlerini destekler
    • String
    • Integer
    • Liste
    • Sözlük
  • Hata işleme ve doğrulamayı içerir
  • Torrent dosyası işleme, .torrent dosyalarının ayrıştırılmasını destekler
    • Tek dosyalı torrent
    • Çok dosyalı torrent
  • Info hash hesaplama ve piece hash çıkarma desteklenir
  • Standart torrent dosyası alanlarını destekler

Peer keşfi ve iletişimi

  • HTTP tracker üzerinden peer keşfini destekler
  • Peer handshake protokolünü uygular
  • Tam BitTorrent mesaj protokolünü içerir
  • Peer bağlantı yönetimi sağlar

İndirme ve depolama yönetimi

  • İndirme özelliği parça (piece) ve blok yönetimini içerir
  • Birden fazla indirmeyi aynı anda gerçekleştirebilir
  • İndirme ilerlemesini takip eder
  • Hem tek dosyalı hem de çok dosyalı torrent’ler için dosya birleştirmeyi destekler
  • Depolama yönetimi blok düzeyinde granularity ile çalışır

Yapı, gereksinimler ve geliştirme durumu

  • Proje yapısı aşağıdaki paketlere ayrılır
    • cmd/: komut satırı arayüzü ve ana uygulama
    • internal/bencode/: Bencode kodlama/kod çözme
    • internal/torrent/: torrent dosyası işleme
    • internal/tracker/: tracker protokolü uygulaması
    • internal/peer/: peer iletişimi
    • internal/download/: indirme yönetimi
    • pkg/: herkese açık paketler
  • Gereksinim Go 1.21 veya üzeridir
  • Kurulum, depoyu klonladıktan sonra go mod download çalıştırılarak yapılır
  • Kullanım dokümantasyonu proje daha olgunlaştığında eklenecektir
  • Mevcut uygulama durumu checkpoint.md dosyasından görülebilir
  • Planlanan özellikler şunlardır
    • Magnet link desteği
    • Metadata exchange protocol
    • DHT (Distributed Hash Table) desteği
  • Başvuru kaynakları BitTorrent Protocol Specification ve Bencode Specification belgeleridir

1 yorum

 
GN⁺ 2025-06-15
Hacker News yorumları
  • Harika. Ancak güvenilmeyen girdi söz konusu olduğundan bencode decoder içinde dinamik ayırma boyutunu sınırlamak iyi olur.
    Torrent dosyasındaki ya da announce yanıtındaki kötü niyetli girdi, string ayrıştırılırken çok büyük bir ayırma isteyerek istemciyi hizmet reddi durumuna sokabilir. Düzgün hazırlanmış bir torrent, kalan girdi uzunluğundan daha uzun bir string içeremeyeceğine göre, kalan girdi uzunluğunu üst sınır yapmak uygun görünüyor.

  • Temiz ve basit göründüğü için hoşuma gitti. README’ye bir .torrent dosyasını gerçekten indiren tek satırlık kullanım örneği eklemek iyi olur.
    Örn: ./go-torrent My-Linux-Distro-Wink-ISO.torrent
    Ek olarak torrent.ParseFromUrl de eklenirse daha da iyi olur; bu tür projeler herkesin kendini geliştirmek için bir kez denemeye değer.

  • Güzel. codecrafters’ta bu süreci biraz yönlendiren ve testler de sağlayan bir challenge var. Ücretsiz bir ay boyunca biraz denedim, eğlenceliydi.
    https://app.codecrafters.io/courses/bittorrent/overview

  • Harika. Ben de böyle bir şeyi düşünmüştüm. Ne kadar zor olduğunu ve ne ölçüde “tamamlanmış” sayılabileceğini merak ediyorum. DHT, Magnet ve her türlü NAT traversal özelliğini de ele alıyor mu, onu da merak ediyorum.
    Benim hep takıldığım nokta, gerçek dünyada dolaşan torrent’lerin çoğunda doğrudan çalışan bir istemci yapmak için gereken özellik listesinin ne olduğunu bilmemekti. Torrent ile ilgili onlarca protokol var gibi görünüyor; tam liste bir yana, her birinin ne yaptığını bile pek bilmiyorum.

    • Kesinlikle zordu. Protokolün ve bencoding’in nasıl çalıştığını öğrenmek, kafamda bir model oluşturmak ve ardından gerçek kodu yazmaya başlamak neredeyse bir ay sürdü.
      Magnet ve DHT henüz eklenmedi.

    • Zorluk; deneyime, kullandığın programlama diline aşinalığına ve deney yapma tavrına büyük ölçüde bağlı. Örneğin ben de geçen hafta Go ile bir Bittorrent istemcisi yapmaya başladım ve bir haftada yayımlanan projenin yaklaşık %80’ine geldim.
      Ancak Go deneyimim fazla, protokol ve ağ bilgim oldukça iyi, deney yapmak da neredeyse ikinci doğam hâline gelmiş durumda.

      İlgileniyorsan Bittorrent’in çekirdek spesifikasyonu aslında oldukça kısa; yaklaşık bir saatte kolayca okuyup anlayabilirsin: https://www.bittorrent.org/beps/bep_0003.html

      Bittorrent’in “çevresinde” protokol uzantıları gibi pek çok şey var, ancak şimdiye kadar gördüğüm kadarıyla destek düzeyi istemciden istemciye değişiyor. Örneğin Protocol Encryption pratikte daha çok obfuscation’a yakın; önce bu yöntemle iletişim kurmayı dener, olmazsa ayara bağlı olarak normal protokole geri döner.

      Bir web sitesindeki .torrent dosyasıyla Linux dağıtımı, örneğin Debian indirmek nispeten doğrusal bir iş. Tek bir dosya var, tracker var, normal protokolü kullanan çok sayıda peer var ve NAT arkasındaysan bağlantı kabul etmeden de bir ölçüde mümkün.

      Doğal olarak gri alan içeriklere girince Magnet linklerini ayrıştırmak, DHT ile peer bulmak ve modemde portu otomatik eşlemek için UPnP de uygulamak isteyebilirsin. Yine de bunlar da yinelemeli olarak tek tek eklenebilir. Ne kadar çok özellik olursa, daha fazla peer bulma ve başarılı şekilde veri alışverişi yapma olasılığı o kadar artar.

  • Go geliştiricisi olmadığım için soruyorum: Neden eski Go 1.21 kullanılıyor, merak ettim. Eski sürümde kalmak için bir sebep var mı?
    Düzeltme: 10 ay önce desteği kesilmiş gibi görünüyor.

  • Çok güzel. Üniversite günlerimi hatırlattı. Georgia Tech’teki ağ dersinin final projesi olarak bunu yapmıştık.
    Kodu yıllar önce kaybettim ama o zaman öğrendiğim dersler hâlâ duruyor. Böyle projeler yeni bir dil öğrenmek için de iyi bir yöntem.

  • Denemesi güzel türden bir proje. Ben de benzer bir şey yapmıştım; başkalarının yaptığı bencode encoder/decoder’lara bakınca tevazu kazandım.
    Dil özelliklerini incelemek için de iyi bir yol. Elbette büyük kütüphanelerin tüm özelliklerini yakalamaya çalışmak epey boş bir çaba; istemciler arası uyumluluğun da zaten yetersiz olduğunu düşünüyorum.

  • Uygulama sürecine dair dokümantasyon yayımlama planı olup olmadığını merak ediyorum. Şahsen kodun kendisinden çok o taraf ilgimi çekiyor.
    Çünkü protokolün çeşitli yönlerini uygulama yaklaşımını ya da sürecini derinlemesine ele alan çok fazla kaynak yok.

  • v2 ve mutable torrents da yapıldı mı, merak ediyorum. Lütfen biri mutable torrents’ı uygulasın.

  • Magnet linklerini destekliyor mu?
    Düzeltme: Ah, planlanan özellikmiş.

    • Henüz değil. Yakında eklemeyi planlıyorum.