ลิงก์แม่เหล็ก BitTorrent ทำงานอย่างไร


157

เป็นครั้งแรกที่ผมใช้การเชื่อมโยงแม่เหล็ก อยากรู้ว่ามันทำงานอย่างไรฉันค้นหารายละเอียดและไม่พบคำตอบใด ๆ wiki กล่าวว่าxtหมายถึง "หัวข้อที่แน่นอน" และตามด้วยรูปแบบ ( btihในกรณีนี้) ด้วยแฮช SHA1 ฉันเห็น base32 ที่กล่าวถึงรู้ว่ามันเป็น 5 บิตต่อตัวละครและ 32 ตัวอักษรฉันพบว่ามันมีขนาด 160 บิตซึ่งมีขนาดเท่ากับ SHA1

ไม่มีที่ว่างสำหรับที่อยู่ IP หรืออะไรเลยเพียงแค่ SHA1 ดังนั้นไคลเอนต์ BitTorrent จะค้นหาไฟล์จริงได้อย่างไร ฉันเปิด URL Snooper เพื่อดูว่ามันเข้าชมหน้าเว็บ (โดยใช้ TCP) หรือทำการค้นหาหรือสิ่งที่คล้ายกัน แต่ไม่มีอะไรเกิดขึ้น ฉันไม่รู้ว่าลูกค้าค้นหาเพื่อนอย่างไร มันทำงานอย่างไร

นอกจากนี้ความยุ่งเหยิงของคืออะไร? มันเป็นแฮชของอาเรย์ของไฟล์ทั้งหมดที่แฮชด้วยกันไหม? อาจเป็นแฮชของไฟล์ทอเรนท์จริงที่ต้องการ (กำลังดึงข้อมูลบางอย่าง)?


ใน VM ฉันลองใช้ลิงก์แม่เหล็กกับ uTorrent (ซึ่งติดตั้งใหม่) และจัดการหาเพื่อนได้ เพื่อนคนแรกมาจากไหน? มันสดและไม่มีเพลงอื่น ๆ


3
สิ่งนี้เกี่ยวข้องกับการเขียนโปรแกรมหรือไม่
คริปทอน

คำตอบ:


156

ลิงค์แม่เหล็ก BitTorrent จะระบุฝนตกหนักโดยใช้1ค่า SHA-1 หรือค่าแฮช SHA-256 ที่ตัดทอนซึ่งเรียกว่า "infohash" นี่เป็นค่าเดียวกับที่เพื่อน (ลูกค้า) ใช้เพื่อระบุ torrents เมื่อสื่อสารกับตัวติดตามหรือเพื่อนอื่น ๆ ไฟล์ .torrent แบบดั้งเดิมประกอบด้วยโครงสร้างข้อมูลที่มีปุ่มระดับบนสุดสองปุ่มคือการannounceระบุตัวติดตามที่จะใช้สำหรับการดาวน์โหลดและinfoมีชื่อไฟล์และแฮชสำหรับฝนตกหนัก "infohash" คือแฮชของinfoข้อมูลที่เข้ารหัส

ลิงก์แม่เหล็กบางอันรวมถึงตัวติดตามหรือเว็บเมล็ด แต่พวกเขามักจะไม่ทำ ลูกค้าของคุณอาจไม่รู้อะไรเลยเกี่ยวกับฝนตกหนักยกเว้นอินโฟฮาชของมัน สิ่งแรกที่ต้องทำคือค้นหาเพื่อนอื่น ๆ ที่ดาวน์โหลดทอร์เรนต์ มันทำเช่นนี้โดยใช้เครือข่ายเพียร์ทูเพียร์2แยกกันทำงาน "ตารางแฮชแบบกระจาย" (DHT) DHT เป็นดัชนีกระจายขนาดใหญ่ซึ่งจับคู่ torrents (ที่ระบุโดย infohashes) ไปยังรายการเพียร์ (ระบุโดยที่อยู่ IP และพอร์ต) ที่เข้าร่วมในฝูงสำหรับฝนตกหนักนั้น (อัปโหลด / ดาวน์โหลดข้อมูลหรือข้อมูลเมตา)

ครั้งแรกที่ไคลเอนต์เข้าร่วมเครือข่าย DHT มันจะสร้าง ID 160 บิตแบบสุ่มจากพื้นที่เดียวกันกับอินฟอเรช จากนั้นจะบูตการเชื่อมต่อกับเครือข่าย DHT โดยใช้ที่อยู่ที่กำหนดรหัสตายตัวของไคลเอนต์ที่ควบคุมโดยผู้พัฒนาไคลเอ็นต์หรือไคลเอ็นต์ที่สนับสนุน DHT ที่พบก่อนหน้านี้ในฝูงฝนตกหนัก เมื่อมันต้องการที่จะมีส่วนร่วมในฝูงสำหรับฝนตกหนักที่กำหนดจะค้นหาเครือข่าย DHT สำหรับลูกค้าอื่น ๆ อีกหลายที่มี ID ที่ใกล้เคียง3เป็นไปได้ที่จะ infohash มันแจ้งลูกค้าเหล่านี้ว่าต้องการมีส่วนร่วมในฝูงและถามพวกเขาสำหรับข้อมูลการเชื่อมต่อของเพื่อนที่พวกเขารู้แล้วว่าใครมีส่วนร่วมในฝูง

เมื่อเพื่อนร่วมงานอัปโหลด / ดาวน์โหลดฝนตกหนักโดยเฉพาะพวกเขาพยายามที่จะบอกกันเกี่ยวกับเพื่อนอื่น ๆ ทั้งหมดที่พวกเขารู้ว่ามีส่วนร่วมในกลุ่มฝนตกหนักเหมือนกัน สิ่งนี้ช่วยให้เพื่อนรู้จักซึ่งกันและกันได้อย่างรวดเร็วโดยไม่ต้องติดตามหรือ DHT กับคำขอคงที่ เมื่อคุณเรียนรู้เกี่ยวกับเพื่อน ๆ จาก DHT แล้วลูกค้าของคุณจะสามารถสอบถามข้อมูลการเชื่อมต่อของเพื่อน ๆ ในเพอร์เฟ็กต์กลุ่มเพื่อนได้มากขึ้นเรื่อย ๆ จนกว่าคุณจะมีเพื่อนทั้งหมดที่คุณต้องการ

ในที่สุดเราสามารถขอเพื่อนเหล่านี้สำหรับinfoข้อมูลเมตาของ torrent ที่มีชื่อไฟล์และรายการแฮช เมื่อเราดาวน์โหลดข้อมูลนี้แล้วและยืนยันว่าถูกต้องโดยใช้ที่รู้จักinfohashเราอยู่ในตำแหน่งเดียวกันกับลูกค้าที่เริ่มต้นด้วย.torrentไฟล์ปกติและได้รับรายชื่อเพื่อนจากเครื่องมือติดตามที่รวมไว้

การดาวน์โหลดอาจเริ่มขึ้น

1โดยทั่วไปแล้วอินโฟฮิชจะถูกเข้ารหัสเป็นเลขฐานสิบหก แต่ลูกค้าเก่าบางรายใช้ฐาน 32 แทน v1 ( urn:btih:) ใช้การแยกย่อย SHA-1 โดยตรงในขณะที่ v2 ( urn:bimh:) เพิ่มคำนำหน้ามัลติแฮชเพื่อระบุอัลกอริทึมแฮชและความยาวการแยกย่อย
2มีเครือข่าย DHT หลักสองเครือข่าย: DHT ที่ง่ายกว่า "mainline" และโปรโตคอลที่ซับซ้อนยิ่งกว่าที่ Azureus ใช้
3ระยะทางวัดโดย XOR

อ่านเพิ่มเติม


1
โหนด bootstrap เช่นdht.transmission.comเพียงตัวติดตามหรือไม่ วิธีที่ฉันเข้าใจก็คือมันต้องติดตามรายชื่อเพื่อนต่อแฮชข้อมูลซึ่งเป็นสิ่งที่ตัวติดตามทำ
Kar

3
@ เคทไม่แน่นอน โหนด DHT ทั่วไปจะจัดเก็บรายการเพียร์สำหรับtorrents บางตัวที่อยู่ใกล้กับพื้นที่ "DHT" ในเครือข่าย DHT ตัวติดตามจะพยายามจัดเก็บรายการเพียร์สำหรับทุก torrent ที่รู้จัก นอกจากนี้ bootstrap โหนด DHT ไม่ได้จัดเก็บรายการเพียร์สำหรับtorrents ใด ๆโดยเฉพาะ แต่จะกระจายรายการของโหนด DHT อื่นเท่านั้นเพื่อช่วยคุณเชื่อมต่อกับเครือข่ายโดยรวม จากนั้นคุณสามารถค้นหาโหนด DHT ทั่วไปพร้อมรายชื่อเพียร์ที่คุณสนใจ
Jeremy Banks

"ลิงก์แม่เหล็กบางอันรวมถึงตัวติดตามหรือเมล็ดพันธุ์ทางเว็บ" - ฉันค่อนข้างสับสน Magnet กำลังใช้สำหรับการดาวน์โหลดไฟล์ torrentตามที่คุณอธิบาย จากข้อมูลจำเพาะ Magnet URI ฉันเห็น "แหล่งที่ยอมรับได้" และ "ตัวติดตาม" เป็นข้อมูลซึ่งสามารถเข้ารหัสได้ใน URI ตอนนี้ตัวติดตามนั้นเห็นได้ชัดคือ Bittorrent เจาะจงและน่าจะถูกใช้งานนอกเหนือไปจากตัวติดตามที่ระบุไว้ในไฟล์ torrent "แหล่งที่ยอมรับได้" หมายถึงการใช้เพื่อดาวน์โหลดไฟล์ torrentหรือ (หนึ่งใน) ไฟล์จริงที่จะดาวน์โหลดผ่านไฟล์ Torrent?
Frederick Nord

@FrederickNord ในการสนับสนุนไคลเอนต์ฝนตกหนักws=พารามิเตอร์จะชี้ไปที่ URL เมล็ดพันธุ์เว็บ BEP-19 ของข้อมูลจริงและxs=พารามิเตอร์ชี้ไปที่ URL ด้วย.torrentไฟล์นั้นเอง ฉันคิดว่านี่เป็นสิ่งที่ขัดแย้งกับการใช้magnet:รูปแบบอื่น ๆแต่นั่นเป็นวิธี ฉันลืมว่าลูกค้าใช้as=เพื่ออะไร ... อาจจะเป็นทางเลือกxs=แต่ IIRC ที่ไม่รองรับอย่างกว้างขวาง
Jeremy Banks

46

การค้นพบเพื่อนและการค้นพบทรัพยากร (ไฟล์ในกรณีของคุณ) เป็นสองสิ่งที่แตกต่างกัน

ฉันคุ้นเคยกับ JXTA มากกว่า แต่เครือข่ายเพียร์ทูเพียร์ทำงานบนหลักการพื้นฐานเดียวกัน

สิ่งแรกที่ต้องเกิดขึ้นคือการค้นพบเพื่อน

การค้นพบเพื่อน

เครือข่าย p2p ส่วนใหญ่เป็นเครือข่าย "seeded": เมื่อเริ่มต้นเพียร์จะเชื่อมต่อกับที่อยู่ที่รู้จักกันดี (ฮาร์ดโค้ด) เพื่อดึงรายชื่อเพื่อนที่กำลังทำงานอยู่ สามารถทำการหยอดเมล็ดโดยตรงเช่นการเชื่อมต่อกับ dht.transmissionbt.comที่กล่าวถึงในการโพสต์อื่นหรือการหว่านโดยอ้อมเช่นเดียวกับ JXTA ที่เพื่อนเชื่อมต่อกับที่อยู่ที่ส่งรายการข้อความธรรมดาของที่อยู่เครือข่ายเพียร์อื่นเท่านั้น

เมื่อสร้างการเชื่อมต่อกับเพียร์แรก (ไม่กี่) เพียร์ที่เชื่อมต่อจะทำการค้นหาเพียร์อื่น (โดยส่งคำร้องขอ) และรักษาตารางของพวกเขา เนื่องจากจำนวนของเพียร์อื่นสามารถมีขนาดใหญ่เพียร์ที่เชื่อมต่อจะเก็บรักษาเฉพาะส่วนของ Distributed Hash Table (DHT) ของเพียร์เท่านั้น อัลกอริทึมในการพิจารณาว่าส่วนใดของตารางที่จุดเชื่อมต่อที่ควรรักษานั้นแตกต่างกันไปตามเครือข่าย BitTorrent ใช้ Kademlia พร้อมตัวระบุ / คีย์ 160 บิต

การค้นพบทรัพยากร

เมื่อเพียร์คู่เชื่อมต่อถูกค้นพบโดยเพียร์ที่เชื่อมต่อแล้วโพสต์จะส่งคำขอสองสามรายการเพื่อค้นหาทรัพยากรให้กับพวกเขา ลิงก์แม่เหล็กระบุแหล่งข้อมูลเหล่านั้นและสร้างขึ้นในลักษณะที่เป็น "ลายเซ็น" สำหรับทรัพยากรและรับประกันว่าพวกเขาจะระบุเนื้อหาที่ร้องขอโดยไม่ซ้ำกันในหมู่เพื่อนทั้งหมด เพียร์ที่เชื่อมต่อจะส่งคำขอค้นพบสำหรับลิงก์แม่เหล็ก / ทรัพยากรไปยังเพื่อนรอบ ๆ DHT นั้นสร้างขึ้นในลักษณะที่ช่วยในการพิจารณาว่าควรถามเพื่อนร่วมงานคนใดเกี่ยวกับทรัพยากรก่อน (อ่านเพิ่มเติมจาก Kademlia ใน Wikipedia เพื่ออ่านเพิ่มเติม) ถ้าเพียร์ที่ร้องขอไม่ได้เก็บทรัพยากรที่ร้องขอมันมักจะ "ส่งต่อ" แบบสอบถามไปยังเพียร์เพิ่มเติมที่ดึงมาจาก DHT ของตัวเอง

จำนวนของ "hops" แบบสอบถามสามารถส่งผ่านมักจะ จำกัด ; 4 เป็นหมายเลขปกติด้วยเครือข่ายประเภท JXTA

เมื่อเพียร์ถือทรัพยากรมันจะตอบกลับพร้อมรายละเอียดทั้งหมด จุดเชื่อมต่อจากนั้นสามารถเชื่อมต่อกับจุดยึดทรัพยากร (โดยตรงหรือผ่านทางรีเลย์ - ฉันจะไม่ลงรายละเอียดที่นี่) และเริ่มดึงมัน

ทรัพยากร / บริการในเครือข่าย P2P ไม่ได้เชื่อมต่อโดยตรงกับที่อยู่เครือข่าย: มีการแจกจ่ายและเป็นความงามของเครือข่ายที่ปรับขนาดได้เหล่านี้


ฉันคิดว่านี่เป็นคำตอบที่รวบรัดที่สุดโดยไม่มีศัพท์แสงทางเทคนิคมากมาย ขอบคุณ
desaivv

26

ฉันอยากรู้อยากเห็นด้วยคำถามเดียวกันตัวเอง การอ่านรหัสสำหรับการส่งข้อมูลฉันพบสิ่งต่อไปนี้ในlibtrnasmission/tr-dht.c:

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

มันลองมา 6 ครั้งรอ 40 (!) วินาทีระหว่างลอง ฉันเดาว่าคุณสามารถทดสอบได้โดยการลบไฟล์ปรับแต่ง ( ~/.config/transmissionบนยูนิกซ์) และบล็อกการสื่อสารทั้งหมดdht.transmissionbt.comและดูว่าเกิดอะไรขึ้น (รออย่างน้อย 240 วินาที)

ดังนั้นจึงปรากฏว่าไคลเอนต์มีโหนด bootstrap ในตัวเพื่อเริ่มต้นด้วย แน่นอนว่าเมื่อมันเข้าสู่เครือข่ายแล้วก็ไม่จำเป็นต้องใช้โหนดบูตสแตรปอีกต่อไป


9

ในที่สุดฉันก็พบสเปค เป็นครั้งแรกที่ความช่วยเหลือของ Google ไม่ได้ (วิกิเชื่อมโยงกับ bittorrent.com ซึ่งเป็นเว็บไซต์หลักฉันคลิกลิงค์นักพัฒนาสังเกตแท็บ bittorrent.org ทางด้านขวาแล้วมันง่ายจากที่นั่นลิงค์หายากของมันเมื่อคุณไม่รู้ว่ามีอะไรติดป้ายไว้มากมาย คลิกออกไป)

ดูเหมือนว่า torrents ทั้งหมดจะมีเครือข่ายของคนรอบข้าง คุณค้นหาเพื่อนจากแทร็กเกอร์และคุณเก็บไว้ระหว่างเซสชัน เครือข่ายช่วยให้คุณค้นหาเพื่อนและสิ่งอื่น ๆ ฉันไม่ได้อ่านว่ามันใช้กับลิงก์แม่เหล็กอย่างไรแต่ดูเหมือนว่ามันไม่ได้กำหนดว่าลูกค้าใหม่จะพบกับเพื่อนได้อย่างไร บางทีบางคนก็อบเข้าหรือพวกเขาใช้เซิร์ฟเวอร์ภายในบ้านของพวกเขาหรือติดตามที่รู้จักกันฝังลงในไคลเอนต์เพื่อรับเพียร์แรกในเครือข่าย


อ่าฉันเดาว่าถูกต้องแล้วที่ DHT เพื่อค้นหาลูกค้า "หากไม่มีการระบุตัวติดตามไคลเอ็นต์ควรใช้ DHT (BEP 0005 [3]) เพื่อรับเพื่อน"
Jeff Mercado

8

เมื่อฉันเริ่มตอบคำถามของคุณฉันไม่รู้ว่าคุณกำลังถามว่าระบบแม่เหล็กทำงานอย่างไร แค่คิดว่าคุณอยากรู้ว่าชิ้นส่วนที่เกี่ยวข้องกับโปรโตคอล bittorrent นั้นถูกสร้างขึ้นมาได้อย่างไร


แฮชที่อยู่ในแม่เหล็ก uri คือแฮชข้อมูลของ torrent ที่เข้ารหัสใน base32 แฮชข้อมูลคือแฮช sha1 ของบล็อกข้อมูล bencoded ของ torrent

รหัสไพ ธ อนนี้แสดงให้เห็นถึงวิธีการคำนวณ

ฉันเขียนการใช้ C # (ไร้เดียงสามาก) เพื่อทดสอบสิ่งนี้เนื่องจากฉันไม่มีเครื่องมือเขียนรหัสในมือและมันตรงกับสิ่งที่คาดหวังจากลูกค้า

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")));
}

ตามที่ฉันเข้าใจแล้วแฮชนี้ไม่ได้รวมข้อมูลใด ๆ เกี่ยวกับวิธีการค้นหาตัวติดตามไคลเอ็นต์จำเป็นต้องค้นหาสิ่งนี้ผ่านวิธีการอื่น ๆ (URL ประกาศที่มีให้) นี่คือสิ่งที่แยกแยะฝนตกหนักตัวหนึ่งจากตัวติดตามอื่น

ทุกอย่างที่เกี่ยวข้องกับโปรโตคอล bittorrent ยังคงหมุนรอบตัวติดตาม มันยังคงเป็นวิธีการสื่อสารหลักในหมู่ฝูง รูปแบบแม่เหล็ก uri ไม่ได้ถูกออกแบบมาโดยเฉพาะสำหรับการใช้งานโดย bittorrent มันถูกใช้โดยโปรโตคอล P2P ใด ๆ ที่เป็นรูปแบบทางเลือกในการสื่อสาร ไคลเอนต์ Bittorrent ดัดแปลงเพื่อยอมรับการเชื่อมโยงแม่เหล็กเป็นอีกวิธีหนึ่งในการระบุ torrents ในแบบที่คุณไม่จำเป็นต้องดาวน์โหลดไฟล์ .torrent อีกต่อไป แม่เหล็ก uri ยังคงต้องระบุtracker เพื่อค้นหามันดังนั้นลูกค้าอาจเข้าร่วม มันสามารถมีข้อมูลเกี่ยวกับโปรโตคอลอื่น ๆ แต่ไม่เกี่ยวข้องกับโปรโตคอล bittorrent ท้ายที่สุดโปรโตคอล bittorrent จะไม่ทำงานหากไม่มีตัวติดตาม


2
มันไม่ได้ช่วยอะไร แต่คุณกำลังบอกว่ามันแฮ็กไฟล์ทอเรนท์ทั้งหมดข้ามการบล็อก infokey หรือไม่ คำถามของฉันเกี่ยวกับวิธีพบเพื่อน

1
@ acidzombie24 คุณอาจคิดถึงเครื่องมือติดตามแบบกระจายซึ่งใช้ DHT เพื่อค้นหาเพื่อน สิ่งนี้ไม่เกี่ยวข้องกับลิงก์แม่เหล็ก ( en.wikipedia.org/wiki/… )
Alexander Sagen

2
@Jeff M: แต่สิ่งที่ 'ส่ง' รายการเพื่อนกลับ ลิงค์เป็นเพียงลิงค์ที่ไม่มีตัวติดตามที่เกี่ยวข้อง ฉันพยายามที่จะคิดออกว่าสิ่งที่ส่งกลับเพื่อน

1
+1 นอกจากนี้ลิงก์แม่เหล็กในคำถามไม่ได้ระบุ tr (acker) เฉพาะ tha1 ซึ่งทำให้ฉันสับสน โดยเฉพาะอย่างยิ่งเมื่อฉันใช้การติดตั้งใหม่โดยไม่ต้องใช้ torrents (และไม่ได้เชื่อมต่อกับเพื่อน ๆ ) และให้ลิงค์แม่เหล็กค้นหาเพื่อน ความมหัศจรรย์ของมันฉันไม่รู้ว่ามันทำงานอย่างไร ต้องมีโฮมเซิร์ฟเวอร์ที่สามารถขอเพื่อนร่วมงานได้ แต่นั่นหมายความว่าฉันส่งข้อความค้นหาไปยังเพื่อนที่กำลังมองหาแฮชและลูกค้าส่งข้อความไปยังเพื่อนหลายคนจนกว่าจะมีคนตอบรับสายของฉัน

1
ฉันไม่แน่ใจว่าจะตอบอย่างไร uris แม่เหล็กทั้งหมดที่ฉันเคยเห็นระบุตัวติดตามเสมอ อาจเป็นลูกค้าของคุณที่พยายามดูรายชื่อเครื่องมือติดตามสาธารณะที่ลูกค้ารู้จัก ตัวติดตาม torrent รายการใดที่เชื่อมโยงกับการใช้งาน มันแสดงอย่างไร? มีความสัมพันธ์ระหว่างตัวติดตามที่เชื่อมต่อกับและที่มาของลิงก์แม่เหล็กหรือไม่? อาจเป็นฝนตกหนักที่ใช้ DHT? ทำงานเหมือนกันสำหรับทอร์เรนต์ส่วนตัวหรือไม่ อีกครั้งฉันไม่รู้ว่า DHT ทำงานอย่างไร ฉันจะดูว่าฉันสามารถหาข้อมูลเพิ่มเติมใด ๆ
Jeff Mercado

3

รายชื่อของคนรอบข้างอาจมาจากฝนตกหนักที่อัพเกรดลูกค้า (เช่นมีฝนตกหนักสำหรับ utorrent ที่อัพเกรดมัน) ตราบใดที่ทุกคนใช้ไคลเอนต์เดียวกันมันก็คงดีเพราะคุณไม่มีทางเลือกนอกจากจะแบ่งปันการอัพเกรด


นั่นเป็นสถานที่ที่มีเหตุผลมากในการค้นหาแฮชและเพียร์อื่น ๆ +1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.