1 puan yazan GN⁺ 2025-06-15 | 1 yorum | WhatsApp'ta paylaş
  • Bu açık kaynak proje, Go diliyle uygulanmış bir BitTorrent istemcisi olup dosya indirme için temel mantığı doğrudan kendisi uygular
  • Bencode kodlama/kod çözme işlemlerini doğrudan yönetir ve güçlü hata doğrulama özellikleri içerir
  • .torrent dosyası ayrıştırma, info hash hesaplama, eşler arası iletişim gibi temel işlevleri kapsamlı biçimde destekler
  • Eşzamanlı indirme, dosya birleştirme ve blok düzeyinde depolama yönetimi gibi pratik kullanımı artıran özellikler içerir
  • Mevcut BitTorrent açık kaynak projeleriyle karşılaştırıldığında Go dilinin sadeliği, kod yapısının açıklığı ve modülerlik açısından güçlü yanlara sahiptir

Genel Bakış

Bu proje, Go diliyle doğrudan bir BitTorrent istemcisi uygular
BitTorrent protokolünü kullanan dosya indirme işlevini kendi geliştirdiği bir yapıyla sunar
Temel olarak torrent dosyası ayrıştırma, eş keşfi ve dosya indirme işlevlerini ele alır

Başlıca Özellikler

  • Bencode kodlama/kod çözme

    • String, integer, liste, sözlük dahil tüm Bencode türlerini destekler
    • Güçlü hata işleme ve veri doğrulama uygular
  • Torrent dosyası işleme

    • Hem tek dosyalı hem çok dosyalı torrentleri ayrıştırabilir
    • Info hash ve her parça için hash değerlerini çıkarır, tüm standart alanları destekler
  • Eş keşfi ve iletişim

    • HTTP tracker desteği
    • Eşler arası handshake protokolü uygulanmıştır
    • BitTorrent mesaj protokolünü ve eş bağlantısı yönetimini yürütür
  • İndirme özellikleri

    • Parça ve blok düzeyinde yönetim
    • Eşzamanlı indirme işlemleri
    • İndirme ilerlemesini izleme ve dosya birleştirme
    • Verimlilik için blok düzeyinde depolama yönetimi

Proje Yapısı

  • cmd/ : Komut satırı arayüzü ve çalıştırılabilir dosyalar
  • internal/
    • bencode/ : Bencode kodlama ve kod çözme işlevleri
    • torrent/ : Torrent dosyası ayrıştırma ve işleme
    • tracker/ : Tracker protokolü uygulaması
    • peer/ : Eşler arası iletişim işlevleri
    • download/ : İndirme yönetimi işlevleri
  • pkg/ : Dışa açılabilir paketler

Gereksinimler

  • Go 1.21 veya üzeri gerekir

Kullanım

  • Proje şu anda erken geliştirme aşamasında olduğundan, kullanım kılavuzu daha sonra eklenecektir

Geliştirme Durumu ve Planlar

  • Geliştirme şu anda aktif olarak sürüyor
  • Ayrıntılı geliştirme aşamaları checkpoint.md dosyasında kayıtlıdır
  • Gelecek planları:
    • Magnet bağlantısı desteği
    • Metadata exchange protokolü
    • DHT (dağıtık hash tablosu) desteği

Referans Belgeler

  • BitTorrent protokolü spesifikasyonu
  • Bencode spesifikasyonu

Projenin Önemi ve Güçlü Yanları

  • Bu proje, Go diline özgü sade sözdizimi ve eşzamanlılık avantajlarını kullanarak BitTorrent istemcisinin karmaşık unsurlarını açık biçimde modülerleştirerek uygular
  • Açık bir yapıya sahip olması, genişletilebilirlik ve bakım kolaylığı açısından hem öğrenme hem gerçek kullanım için avantaj sağlar
  • Nispeten erken aşamada olmasına rağmen BitTorrent protokolünün temel işlevlerini hızlıca hayata geçirmiştir

1 yorum

 
GN⁺ 2025-06-15
Hacker News görüşleri
  • bencode çözücüsünde dinamik bellek ayırma boyutunu sınırlamanın iyi olacağı yönünde bir öneri iletilmiş. Torrent dosyasından ya da announce üzerinden gelen girdiler güvenilir olmadığı için, kötü niyetli bir girdi çok büyük bir ayırma isteği yaparak hizmet reddine (DoS) yol açabilir. String ayrıştırmada uygun üst sınır, kalan girdi uzunluğu olarak belirlenebilir; düzgün bir torrent, dosyada kalan uzunluktan daha uzun bir string içeremez

    • Bu uyarıyı yapılacaklar listesine ekledim
  • Proje temiz ve sade görünüyor, bu hoşuma gitti. Readme'ye tek satırlık bir kullanım örneği eklenirse iyi olabilir. Örneğin ./go-torrent My-Linux-Distro-Wink-ISO.torrent gibi bir kullanım cümlesi eklenmesi öneriliyor. Eğer torrent.ParseFromUrl özelliği de eklenirse daha da iyi olur. Herkesin kendi “ruhsal yolculuğu” için böyle bir deneyim yaşaması değerli

    • Öneri için minnettarım
  • codecrafters'ın sunduğu benzer bir challenge tanıtılıyor. Bu süreçte ilerlemeyi ve testleri destekliyor; bir ay ücretsiz denedim ve oldukça eğlenceliydi
    https://app.codecrafters.io/courses/bittorrent/overview

  • Go geliştiricisi olmayan biri olarak neden eski Go 1.21 sürümünün kullanıldığı merak ediliyor. Özellikle eski bir sürümde ısrar etmek için bir neden olup olmadığı soruluyor. Bakınca desteğinin 10 ay önce sona erdiği görülmüş

  • Gerçekten harika bir proje. Üniversitede Georgia Tech ağ dersi için bunu dönem sonu projesi olarak yapmıştık; kodu kaybettim ama öğrendiklerim ömür boyu kaldı. Böyle projeler yeni bir dili öğrenmek için çok iyi bir yöntem

  • Magnet link desteği olup olmadığı soruluyor.
    Edit: Bunun ileride eklenecek bir özellik olduğu öğrenilmiş

    • Henüz desteklenmiyor ama yakında eklenecek
  • Bunu nasıl yaptığını merak ediyor. Protokol spesifikasyonuna doğrudan mı baktın, yoksa başka uygulamalardan mı yararlandın diye soruyor. İnsan böyle bir şeyi sıfırdan nasıl uygular, bunu hep merak etmiş

    • İlginç biçimde ben de yakın zamanda Go ile kendi Bittorrent istemcimi yapmaya başladım. Kişisel olarak kod yazarken AI/LLM kullanmayı tercih etmiyorum; amacım gerçekten kendim öğrenmek. Yaptığım ilk şey Bittorrent protokolünün resmi spesifikasyonunu bulmak oldu. Aslında spesifikasyon sanıldığından daha basit ama biraz yetersiz
      https://www.bittorrent.org/beps/bep_0003.html
      Ek uzantılar ise
      https://www.bittorrent.org/beps/bep_0000.html
      İşi çok küçük parçalara bölüp sonucu tek tek doğrulamak önemli. Örneğin .torrent dosyalarını ayrıştırarak başladım ve bencoding'i kendim uygulamam gerekti. Arch Linux için bir .torrent indirince bunun beklediğim formata uymadığını, url-list gibi beklenmedik anahtarlar içerdiğini gördüm. Bunun ne olduğunu araştırınca bep_0019 ile ilgili olduğunu öğrendim. Sonunda Debian Linux .torrent dosyasını başarıyla ayrıştırdım
      Sonra tracker announce HTTP isteğini ve peer protokolünü uyguladım. Peer protokolü epey zordu ve deneysel yaklaşım çok yardımcı oldu. Debian torrent'inden announce URL'sini kaldırıp hiç peer olmayacak şekilde ayarladım, sonra KTorrent'te kendi istemcimi manuel ekleyip gidip gelen mesajları gözlemledim; ardından kodumu buna göre düzelttim. Çok fazla deneme-yanılma ve debugging süreci yaşandı
      Bazı protokol ayrıntılarını resmi belgelerde bir türlü bulamadığım için küçük şeyleri zaman zaman ChatGPT'ye sordum; ayrıca her istemci biraz farklı uyguladığı için ayrıntılı algoritmalar net değil. Hangi blokların alınacağı, hangi peer'lerle bağlanılacağı, choke/unchoke'un nasıl çalıştığı gibi konular düzgün şekilde belgelenmemiş. Web'de arama yapmak çok yardımcı oluyor
      Ek olarak https://wiki.theory.org/Main_Page sitesinde de yararlı bilgiler var
      Şu anda KTorrent ile tam indirme/yükleme yapabilecek aşamadayım. Sırada tracker'dan peer alma, indirilecek blokları seçme ve dosyaya yazma algoritmasını geliştirmek var
      Sürecin daha ayrıntılı taraflarını merak edersen istediğin zaman sorabilirsin
  • GUI eklemenin ne kadar zor olduğu soruluyor. Go'da GUI yapımına dair çok fazla örnek görmediğini söylüyor

  • Böyle bir projeyle ilgilendiğini ve bir ara denemeyi düşündüğünü söylüyor. Ne kadar zor olduğu, ne kadar tamamlanmış sayılabileceği ve DHT, Magnet, NAT traversal gibi karmaşık özelliklerin uygulanıp uygulanmadığı merak ediliyor. Piyasadaki torrentlerin neredeyse tamamını kapsamak için gerçekten gerekli özelliklerin neler olduğu bile tam bilinmiyor. Torrent tarafında o kadar çok protokol var ki, tam listenin ne olduğu ve her birinin ne işe yaradığı bile belirsiz

    • Zorluk seviyesi deneyime, dil hakimiyetine ve deneysel çalışma tarzına göre çok değişiyor. Örneğin ben de geçen hafta Go ile bir Bittorrent istemcisi yapmaya başladım ve bir hafta içinde burada paylaşılan projenin yaklaşık %80'ine ulaştım. Go, protokoller ve ağ konusunda bilgim fazla; ayrıca deneme yapmaya alışkın olduğum için hızlı ilerledim
      Resmi Bittorrent spesifikasyonu gerçekten çok kısa; bir saat içinde okunup anlaşılabilir https://www.bittorrent.org/beps/bep_0003.html
      Ama etrafındaki genişletme protokolleri çok fazla ve her istemcinin destek düzeyi farklı. Örneğin çoğu istemci önce protokol şifrelemeyi (aslında obfuscation) deniyor, olmazsa normal protokole geçiyor
      Eğer amacın Linux dağıtımı gibi resmi .torrent dosyalarından sadece indirme yapmaksa zorluk belirgin biçimde daha düşük. Genelde tek dosya oluyor, tracker mevcut oluyor ve peer'lerin çoğu standart protokol kullandığı için NAT ortamında bile iç port açmadan yeterince çalışıyor
      Tabii daha genel kullanım, özellikle gri alandaki torrentler hedefleniyorsa magnet link ayrıştırma, peer keşfi için DHT ve otomatik port eşleme için UPnP gibi özellikleri adım adım eklemek gerekiyor. Ama bunlar da özelliğe göre bölünüp tek tek uygulanabilir. Özellik sayısı arttıkça daha fazla peer bulunur ve başarılı veri alışverişi olasılığı artar

    • Oldukça zorlayıcıydı; protokolü ve bencoding yöntemini öğrenip genel mimariyi kafamda oturttuktan sonra kodu yazmam neredeyse bir ay sürdü. Magnet ve DHT henüz desteklenmiyor

  • v2 ve mutable torrents'in uygulanıp uygulanmadığı soruluyor. Özellikle mutable torrents'in mutlaka uygulanması isteniyor