BT9G LABS / เจาะลึก DHT #10
อธิบาย BEP 9 ut_metadata: การดึง Torrent Metadata จาก Peer
เข้าใจ lifecycle ของ BEP 9, metadata_size, request/data/reject, การแบ่ง piece, hash verification และการ schedule หลาย Peer
BT9G Labs / DHT Deep Dive #10. BEP 9 ทำให้ client ดึง info dictionary จาก Peer ได้โดยไม่ต้องมีไฟล์ .torrent อยู่ก่อน
สรุปแบบรวดเร็ว
- หัวข้อ: อธิบาย BEP 9 ut_metadata: การดึง Torrent Metadata จาก Peer
- คีย์เวิร์ดหลัก: BEP 9, ut_metadata, torrent metadata, metadata_size, BitTorrent extension
- เหมาะสำหรับ: วิศวกร backend, นักวิจัยโปรโตคอล, search engineer และผู้พัฒนา BitTorrent
- เป้าหมาย: อธิบายโปรโตคอลและสถาปัตยกรรมระบบอย่างแม่นยำพอที่จะนำไปใช้กับ discovery, metadata, indexing และ search pipeline ในระบบจริงได้
มุมมองระบบ
BEP 9 ส่งข้อมูลอะไร
ut_metadata ส่ง bencoded info dictionary ที่ใช้สร้าง Torrent metadata ไม่ได้ส่ง payload ของไฟล์ content ขนาด metadata ถูกแจ้งผ่าน extended handshake แล้วแบ่งเป็น piece ตามกติกาโปรโตคอล
สำหรับ indexer นี่หมายความว่าสามารถเปลี่ยน InfoHash จาก magnet หรือ DHT ให้เป็นชื่อ/file/size ได้โดยไม่ต้องดาวน์โหลด content ทั้งหมด
Lifecycle ของ message
Client request หมายเลข piece Peer อาจตอบ data หรือ reject เมื่อรับ piece แล้ว client ทำเครื่องหมายว่าเสร็จและขอชิ้นถัดไปจน metadata ครบ Timeout และ disconnect ต้องจัดการทั้งระดับ piece และระดับ Peer
ควรจำกัดจำนวน request inflight และ metadata_size สูงสุดเพื่อป้องกัน memory abuse
Verification เป็นสิ่งที่ข้ามไม่ได้
Metadata ที่ได้ครบยังไม่ได้แปลว่าถูกต้อง สำหรับ v1 raw bencoded info dictionary ต้องให้ SHA-1 ตรงกับ target InfoHash สำหรับ version อื่นต้องใช้กฎ hash ที่ถูกต้อง
ถ้า verify ไม่ผ่าน ห้ามเก็บเป็น metadata ที่ valid และควรบันทึก Peer source กับ failure reason
Scheduling ข้ามหลาย Peer
Swarm หนึ่งอาจมี Peer หลายตัวที่รองรับ ut_metadata Scheduler สามารถลอง candidate แบบขนานอย่างจำกัด เปลี่ยนไปยัง Peer อื่นเมื่อ piece ช้า หรือเลือก Peer ที่มีประวัติเร็วและเสถียร
ไม่ควรใช้ parallelism ไร้ขีดจำกัด เพราะ bottleneck มักอยู่ที่ socket, file descriptor, NAT หรือ bandwidth
ตัวอย่างการนำไปใช้
{"msg_type": 0, "piece": 0} // request
{"msg_type": 1, "piece": 0,
"total_size": 48321} // data header, followed by bytes
{"msg_type": 2, "piece": 0} // reject
บันทึกเชิงวิศวกรรมจาก BT9G Labs
สำหรับระบบทำดัชนีอย่าง BT9G ไม่ควรวัดความสำเร็จจากจำนวน packet หรือจำนวน InfoHash ที่มองเห็นเพียงอย่างเดียว ควรแยก content identity, network observation, acquisition state, verified metadata และ search document ออกจากกันเป็นชั้นข้อมูลที่ชัดเจน ข้อมูลจาก DHT หรือ Peer ควรเก็บ source และ timestamp เสมอ เพื่อให้วิเคราะห์ bottleneck ได้ตั้งแต่ discovery, connection, handshake, extension negotiation, metadata transfer, verification, storage ไปจนถึง indexing
ข้อผิดพลาดที่พบบ่อย
- คิดว่า BEP 9 ดาวน์โหลดไฟล์ content
- ไม่จำกัด metadata_size
- ยอมรับ metadata โดยไม่ verify hash
- เปิด connection จำนวนมากโดยไม่มี backpressure
บทความ BT9G Labs ที่เกี่ยวข้อง
- DHT Crawler ค้นพบ InfoHash อย่างไร: Active Lookup, Observation และการออกแบบอย่างรับผิดชอบ
- จาก Magnet Link ไปสู่ File Metadata: Flow ของ Peer และ Metadata แบบครบถ้วน
- BEP 10 Extension Protocol: BitTorrent Negotiate ฟีเจอร์ใหม่โดยไม่ทำลาย Compatibility
- Tracker vs DHT vs PEX: เปรียบเทียบสามกลไก Peer Discovery ของ BitTorrent
เอกสารอ้างอิง
บทความถัดไป: BEP 10 Extension Protocol: BitTorrent Negotiate ฟีเจอร์ใหม่โดยไม่ทำลาย Compatibility →
บทความนี้อธิบายโปรโตคอล BitTorrent แบบสาธารณะและแนวทางเชิงวิศวกรรม การสังเกตเห็น Swarm ใดไม่ได้หมายความว่าเนื้อหานั้นยังใช้งานได้ ถูกต้อง หรือได้รับอนุญาตให้เผยแพร่