BitTorrent mıknatıs bağlantıları nasıl çalışır?


157

İlk kez bir mıknatıs bağlantısı kullandım . Nasıl çalıştığını merak ederek, teknik özelliklere baktım ve cevap bulamadım. Wiki, xt"tam konu" anlamına gelir ve bunu btihbir SHA1 karmasıyla ( bu durumda) format takip eder . Bahsedilen base32'yi, karakter başına 5 bit ve 32 karakter olduğunu bilerek gördüm, tam olarak 160 bit tuttuğunu gördüm, bu da SHA1'in boyutu.

IP adresi ya da başka bir şey için yer yok, sadece bir SHA1. Peki BitTorrent istemcisi asıl dosyayı nasıl bulur? URL Snooper'ı bir sayfayı (TCP kullanarak) ziyaret edip etmediğini veya bir arama veya benzeri yapıp yapmadığını görmek için açtım, ancak hiçbir şey olmadı. Müşterinin akranları nasıl bulduğu hakkında hiçbir fikrim yok Bu nasıl çalışıyor?

Ayrıca, hash nedir? Birlikte tüm dosya karma bir dizi karma mı? Belki de gerekli gerçek torrent dosyasının bir karması (belirli bilgileri sıyırma)?


Bir VM'de, uTorrent (yeni kurulmuş) ile bir mıknatıs bağlantısı denedim ve akranları bulmayı başardı. İlk akran nereden geldi? Taze ve başka sel vardı.


3
Bu, programlama ile bile ilgili mi?
Kripton

Yanıtlar:


156

Bir BitTorrent mıknatıs bağlantısı 1 " SHA-1 veya" infohash "olarak bilinen kesik SHA-256 karma değerini kullanarak bir torrent tanımlar . Bu, eşlerin (istemcilerin) izleyicilerle veya diğer eşlerle iletişim kurarken torrentleri tanımlamak için kullandığı değerle aynıdır. Geleneksel bir .torrent dosyası, iki üst düzey anahtar içeren bir veri yapısı içerir: announceindirme için kullanılacak izleyiciyi / izleyicileri tanımlamak infove torrent için dosya adlarını ve karmaları içeren. "İnfohash" kodlanmış infoverinin karmasıdır .

Bazı mıknatıs bağlantıları izleyiciler veya ağ tohumları içerir, ancak genellikle içermezler. Müşteriniz, infohash dışında torrent hakkında hiçbir şey bilmiyor olabilir. İlk ihtiyacı olan torrent'i indiren diğer eşleri bulmak. Bunu, "dağıtılmış karma tablosu" (DHT) çalıştıran ayrı bir eşler arası ağ 2 kullanarak yapar . Bir DHT, torrentleri (infohashes tarafından tanımlanır), bu torrent için bir sürüme katılan (veri veya meta veri yükleme / indirme) akran listeleriyle (IP adresi ve bağlantı noktaları ile tanımlanır) eşleyen büyük bir dağıtılmış dizindir.

İstemci DHT ağına ilk kez katıldığında, bilgi alanlarıyla aynı alandan rastgele bir 160 bit kimlik oluşturur. Daha sonra, istemci geliştiricisi tarafından kontrol edilen istemcilerin sabit kodlu adreslerini veya daha önce bir torrent sürüsünde daha önce karşılaşılan DHT'yi destekleyen istemcileri kullanarak DHT ağına bağlantısını yeniden başlatır. Belirli bir torrent için bir sürüye katılmak istediğinde, DHT ağında kimlikleri infohash'a mümkün olduğunca yakın 3 olan diğer istemciler için arama yapar. Bu müşterilere sürüye katılmak istediklerini bildirir ve sürüye katıldıklarını zaten bildikleri akranlarının bağlantı bilgilerini ister.

Eşler belirli bir torrent yüklerken / indirirken, birbirlerine aynı torrent sürüsüne katılan tanıdıkları diğer tüm eşleri anlatmaya çalışırlar. Bu, eşlerin izleyiciyi veya DHT'yi sürekli isteklere maruz bırakmadan birbirlerini hızlı bir şekilde tanımalarını sağlar. DHT'den birkaç akran öğrendikten sonra, müşteriniz ihtiyaç duyduğunuz tüm akranlara sahip olana kadar torrentlerden daha fazla akranın bağlantı bilgilerini isteyebilir.

Son olarak, bu eşlerden infodosya adlarını ve karma listesini içeren torrentin meta verilerini isteyebiliriz . Bu bilgileri indirip bilinenleri kullanarak doğru olduğunu doğruladıktan sonra infohash, normal bir .torrentdosyayla başlayan ve dahil edilen izleyiciden bir eş listesi alan bir müşteriyle neredeyse aynı konumdayız .

İndirme işlemi başlayabilir.

1 Infohash genellikle onaltılı olarak kodlanır, ancak bazı eski istemciler bunun yerine base 32'yi kullanır. v1 ( urn:btih:) doğrudan SHA-1 özetini kullanır, v2 ( urn:bimh:) ise karma algoritmayı ve özet uzunluğunu tanımlamak için multihash öneki ekler .
2 İki birincil DHT ağı vardır: daha basit "ana hat" DHT ve Azureus tarafından kullanılan daha karmaşık bir protokol.
3 Mesafe XOR ile ölçülür.

Daha fazla okuma


1
Önyükleme düğümü, örneğin dht.transmission.com, yalnızca bir izleyici mi? Anladığım kadarıyla, bilgi karması başına eş listesini izlemesi gerekiyor - ki bu tam olarak bir izleyicinin yaptığı şey.
Kar

3
@Kate Tam olarak değil. Tipik bir DHT düğümü , DHT ağı "alanında" ona yakın olan bazı torrentler için eş listelerini saklar . Bir izleyici bunun yerine tanıdığı her torrent için eş listelerini depolamaya çalışır. Ayrıca, bootstrap DHT düğümleri özellikle herhangi bir torrent için eş listelerini depolamaz . Bunun yerine, genel ağa bağlanmanıza yardımcı olmak için yalnızca diğer DHT düğümlerinin listelerini dağıtırlar. Daha sonra ilgilendiğiniz akran listesiyle tipik bir DHT düğümü bulabilirsiniz.
Jeremy Banks

"Bazı mıknatıs bağlantıları izci veya web tohumları içerir" - Biraz kafam karıştı. Magnet tarif ettiğiniz gibi torrent dosyasını indirmek için kullanılıyor . Magnet URI spesifikasyonundan "kabul edilebilir kaynak" ve "izci" yi URI'da kodlanabilen bilgiler olarak görüyorum. Şimdi izleyici açıkça Bittorrent'e özgüdür ve büyük olasılıkla torrent dosyasında listelenen izleyicilere ek olarak kullanılacaktır. "Kabul edilebilir kaynak" torrent dosyasını indirmek için mi yoksa Torrent dosyası aracılığıyla indirilecek gerçek dosyalardan biri mi?
Frederick Nord

@FrederickNord Torrent istemcilerini desteklerken, ws=parametre gerçek verilerin bir BEP-19 web çekirdeği URL'sine işaret eder ve xs=parametre .torrentdosyanın kendisiyle birlikte bir URL'ye işaret eder. Bence bu, magnet:programın diğer kullanımlarıyla biraz tutarsız , ancak bu böyle. Herhangi bir istemcinin herhangi bir as=şey için kullanması durumunda ... belki de xs=IIRC için bir geri dönüş , ancak yaygın olarak desteklenmiyorsa unutuyorum.
Jeremy Banks

46

Akran bulma ve kaynak bulma (davanızdaki dosyalar) iki farklı şeydir.

JXTA'ya daha aşinayım, ancak tüm eşler arası ağlar aynı temel ilkeler üzerinde çalışır.

Gerçekleşmesi gereken ilk şey akran keşfi.

Akran Keşfi

Çoğu p2p ağı "tohumlanmış" ağlardır: ilk çalıştırıldığında, bir eş çalışan çalışanların listesini almak için iyi bilinen (sabit kodlu) bir adrese bağlanır. Başka bir gönderide dht.transmissionbt.combelirtildiği gibi bağlanmak gibi doğrudan tohumlama veya eşin diğer eş ağ adreslerinin yalnızca düz metin listesini veren bir adrese bağlandığı JXTA ile yapılan gibi dolaylı tohumlama olabilir.

İlk (birkaç) eş ile bağlantı kurulduktan sonra, bağlantı eş (diğer eşleri) (istek göndererek) bir keşif gerçekleştirir ve bunların bir tablosunu tutar. Diğer eşlerin sayısı büyük olabileceğinden, bağlantı eşi eşlerin Dağıtılmış Karma Tablosunun (DHT) yalnızca bir kısmını korur. Bağlanan eşin tablonun hangi bölümünü tutması gerektiğini belirleyen algoritma, Ağa bağlı olarak değişir. BitTorrent, 160 bit tanımlayıcı / anahtarlı Kademlia'yı kullanır.

Kaynak Bulma

Bağlanan eş tarafından birkaç akran keşfedildiğinde, ikincisi kaynakların keşfi için birkaç istek gönderir. Mıknatıs bağlantıları bu kaynakları tanımlar ve bir kaynak için "imza" olacak şekilde inşa edilir ve tüm eşler arasında istenen içeriği benzersiz şekilde tanımladıklarını garanti eder. Bağlanan eş daha sonra mıknatıs bağlantısı / kaynağı için etrafındaki eşlere bir keşif isteği gönderir. DHT, kaynak için ilk olarak hangi akranların sorulması gerektiğini belirlemeye yardımcı olacak şekilde inşa edilmiştir (daha fazla bilgi için Wikipedia'da Kademlia'da okuyun). İstenen eş istenen kaynağı tutmuyorsa, genellikle sorguyu kendi DHT'sinden getirilen ek eşlere "iletir".

Sorgunun iletilebileceği "atlama" sayısı genellikle sınırlıdır; 4, JXTA tipi ağlarda olağan bir sayıdır.

Bir eş kaynağı tuttuğunda, tüm ayrıntılarıyla yanıt verir. Bağlanan eş daha sonra kaynağı tutan eşe bağlanabilir (doğrudan veya bir röle aracılığıyla - burada ayrıntılara girmeyeceğim) ve getirmeye başlayabilirim.

P2P ağlarındaki Kaynaklar / Hizmetler doğrudan ağ adreslerine bağlı değildir : dağıtılır ve bu yüksek düzeyde ölçeklenebilir ağların güzelliğidir.


Bu, çok fazla teknik jargon olmadan en özlü cevap olduğunu düşünüyorum. Teşekkürler.
desaivv

26

Ben de aynı soruyu merak ettim. İletim kodunu okurken, aşağıdakileri buldum libtrnasmission/tr-dht.c:

3248:     bootstrap_from_name( "dht.transmissionbt.com", 6881,
                               bootstrap_af(session) );

6 kez dener, denemeler arasında 40 (!) Saniye bekler. Sanırım yapılandırma dosyalarını silerek ( ~/.config/transmissionunix'te) ve tüm iletişimi engelleyerek dht.transmissionbt.comve ne olduğunu görerek test edebilirsiniz (en az 240 saniye bekleyin).

Yani istemcinin başlamak için yerleşik bir bootstrap düğümü olduğu anlaşılıyor. Tabii ki, ağa girdikten sonra, artık bu önyükleme düğümüne ihtiyaç duymuyor.


9

Sonunda şartname buldum. İlk kez google yardım etmedi . (wiki ana site olan bittorrent.com'a bağlandı. Geliştiriciler bağlantısını tıkladım, sağdaki bittorrent.org sekmesine dikkat edin, o zaman kolaydı. Ne etiketlendiğini bilmediğinizde zor bulma bağlantıları ve birçok tıklar).

Tüm torrentlerin bir akran ağı var gibi görünüyor. İzleyicilerin akranlarını bulursunuz ve bunları oturumlar arasında tutarsınız. Ağ, akranları ve diğer şeyleri bulmanızı sağlar. Mıknatıs bağlantıları ile nasıl kullanıldığını okumamı engelledim, ancak yeni bir müşterinin eşleri nasıl bulduğu belirsiz. Belki bazıları pişirilir veya ağdaki ilk eşi almak için ev sunucularını veya istemciye yerleştirilmiş bilinen izleyicileri kullanırlar.


Ah, sanırım müşterileri bulmak için DHT'ye gitme konusunda haklıydım. "Herhangi bir izleyici belirtilmezse, istemci eş almak için DHT'yi (BEP 0005 [3]) KULLANMALIDIR."
Jeff Mercado

8

Sorunuzu cevaplamaya başladığımda, mıknatıs şemasının nasıl çalıştığını sorduğunuzu fark etmedim. Sadece bittorrent protokolüyle ilgili parçaların nasıl oluşturulduğunu bilmek istediğinizi düşündüm.


Mıknatıs uri'de listelenen karma, torrent'in base32 ile kodlanmış bilgi karma değeridir. Bilgi karması torrentin kodlanmış bilgi bloğunun sha1 karmasıdır.

Bu python kodu nasıl hesaplanabileceğini gösterir.

Elimde bir kodlayıcı olmadığından ve istemciden beklenenlerle eşleştiği için bunu test etmek için (çok saf) bir C # uygulaması yazdım.

static string CalculateInfoHash(string path)
{
    // assumes info block is last entry in dictionary
    var infokey = "e4:info";
    var offset = File.ReadAllText(path).IndexOf(infokey) + infokey.Length;
    byte[] fileHash = File.ReadAllBytes(path).Skip(offset).ToArray();
    byte[] bytes;
    using (SHA1 sha1 = SHA1.Create())
        bytes = sha1.ComputeHash(fileHash, 0, fileHash.Length - 1); // need to remove last 'e' to compensate for bencoding
    return String.Join("", bytes.Select(b => b.ToString("X2")));
}

Anladığım kadarıyla, bu karma izleyiciyi nasıl bulacağınızla ilgili herhangi bir bilgi içermez, müşterinin bunu başka yollarla (sağlanan ilan url'si) bulması gerekir. İzleyicide bir torrentden diğerini ayıran şey budur.

Bittorrent protokolü ile ilgili her şey hala izleyici etrafında dönüyor. Sürü arasında hala birincil iletişim aracıdır. Mıknatıs uri şeması, bittorrent tarafından kullanılmak üzere özel olarak tasarlanmamıştır. Herhangi bir P2P protokolü tarafından alternatif bir iletişim şekli olarak kullanılır. Bittorrent istemcileri, torrentleri artık .torrent dosyalarını indirmenize gerek kalmayacak şekilde tanımlamanın başka bir yolu olarak mıknatıs bağlantılarını kabul edecek şekilde uyarlanmıştır. Mıknatıs uri hala tristemci bulmak için bulmak için acker belirtmek gerekir . Diğer protokoller hakkında bilgi içerebilir, ancak bittorrent protokolü ile ilgisi yoktur. Bittorrent protokolü en sonunda izleyiciler olmadan çalışmayacaktır.


2
Bu yardımcı olmuyor. Ancak tüm torrent dosyasının infokey bloğunu atladığını mı söylüyorsunuz? Sorum akranları nasıl bulduğu ile ilgiliydi.

1
@ acidzombie24 Muhtemelen akranları bulmak için DHT kullanan dağıtılmış izleyiciler hakkında düşünüyorsunuz. Bunun mıknatıs bağlantıları ile ilgisi yoktur. ( en.wikipedia.org/wiki/… )
Alexander Sagen

2
@ Jeff M: Ama akranların listesini 'gönderen'. Bir bağlantı sadece onunla ilişkili bir izleyici yoktur. Akranları ne gönderdiğini anlamaya çalışıyordum.

1
+1. Ayrıca söz konusu mıknatıs bağlantısı tr (acker) belirtmez. Sadece th sha1 beni şaşırttı. Özellikle hiçbir torrent çalışan yeni bir kurulum kullanırken (ve herhangi bir eş bağlı değil) ve mıknatıs bağlantı eş bulmak. Onun büyüsü, nasıl çalıştığı hakkında hiçbir fikrim yok. Eşleri isteyebilecek bazı ev sunucusu olmalı. Ancak bu, bir karma arayan arkadaşlara sorgular gönderdiğim anlamına gelir ve müşteri çağrımı cevaplayana kadar mesajı birçok arkadaşına iletir mi?

1
Buna nasıl cevap vereceğinden emin değilim. Gördüğüm tüm mıknatıs urisleri her zaman izleyiciyi belirtir. Müşteriniz, bildiği genel izleyicilerin bir listesini deniyor olabilir ve biri bunu gerçekleştirir. İlişkili torrent listesi hangi izleyiciler olarak kullanılıyor? Nasıl görüntülenir? Bağlandığı izleyici ile mıknatıs bağlantısının kaynağı arasında herhangi bir ilişki var mı? Belki de DHT kullanan bir torrent? Aynı şey özel bir torrent için de geçerli mi? Yine, DHT'nin tam olarak nasıl çalıştığını bilmiyorum. Daha fazla bilgi bulabilir miyim bakalım.
Jeff Mercado

3

eş listesi muhtemelen istemciyi yükselten torrentden doldurulur (örneğin yükselten utorrent için bir torrent vardır). herkes aynı istemciyi kullandığı sürece, iyi olmalıdır çünkü yükseltmeyi paylaşmaktan başka seçeneğiniz yoktur.


Bu karma ve diğer akranları aramak için çok mantıklı bir yer. +1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.