Sıfırdan Doğrudan Uygulanan BitTorrent İstemcisi
(github.com/piyushgupta53)- 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
.torrentdosyası 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.mddosyası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
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
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.torrentgibi bir kullanım cümlesi eklenmesi öneriliyor. Eğertorrent.ParseFromUrlözelliği de eklenirse daha da iyi olur. Herkesin kendi “ruhsal yolculuğu” için böyle bir deneyim yaşaması değerlicodecrafters'ı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üş
Nedeni Windows 7 desteği. Go 1.21.4 ve altıyla yazılan projeler 2009'dan sonraki neredeyse tüm Windows sürümlerinde ve tüm bilgisayarlarda çalışırken, 1.21.5 ve üzeri kullanıldığında yalnızca modern bilgisayarlarda ve Windows 10 ile 11'de çalışıyor; bunun da özel bir avantajı yok
https://github.com/golang/go/issues/64622
README muhtemelen yapay zeka tarafından yazılmış. Asıl
go.moddosyasında Go sürümü 1.23.1 olarak belirtilmiş, yani sonuç olarak 1.23.1 veya üstü gerekiyorhttps://github.com/piyushgupta53/go-torrent-client/blob/6130f4e/go.mod#L3 https://go.dev/doc/modules/gomod-ref#go-notes
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ş
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ş
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
.torrentdosyalarını ayrıştırarak başladım ve bencoding'i kendim uygulamam gerekti. Arch Linux için bir.torrentindirince bunun beklediğim formata uymadığını,url-listgibi 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.torrentdosyasını başarıyla ayrıştırdımSonra 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
Ben şahsen ImGui wrapper'ı olan https://github.com/AllenDang/giu'yu tercih ediyorum
En çok özellik sunanı unison gibi görünüyor ama gerçekten yaygın kullanılıp kullanılmadığını bilmiyorum; ayrıca belgeleri oldukça yetersiz olabilir https://github.com/richardwilkes/unison
Gio yeni tarz bir GUI framework'ü ve Tailscale ile gotraceui'de kullanılıyor https://gioui.org
Wails, web geliştirme deneyimi varsa öğrenmesi kolay https://wails.io
GTK4 binding'leri de fena görünmüyor https://github.com/diamondburned/gotk4
Cogent Core da ilginç görünüyor ama ben onu Go yerine Odin diline geçmeden hemen önce kısa süre kullandım https://www.cogentcore.org/core
Fyne ise bana göre farklı bilgisayarlarda ve işletim sistemlerinde performans açısından çok sorun çıkardı ama yine de en bilinen GUI framework'ü https://fyne.io
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
.torrentdosyaları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ışıyorTabii 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