หมวดหมู่: Python

BitTorrent: BdecodeBitTorrent: Bdecode

Bdecode คือกระบวนการ แปลงกลับข้อมูล (Decoding/Deserialization) ที่ถูกเข้ารหัสด้วยรูปแบบ Bencode (Bencoding) ให้กลับมาเป็น Data Structure ดั้งเดิม (เช่น String, Integer, List, Dictionary) ที่โปรแกรมสามารถอ่านและประมวลผลได้

Bencode เป็นรูปแบบการจัดเก็บและเข้ารหัสข้อมูลหลักของโปรโตคอล BitTorrent (คล้ายกับ JSON หรือ XML แต่เรียบง่ายกว่าและรองรับ Binary Data ได้ดี) ข้อมูลที่ต้องผ่านกระบวนการ Bdecode ได้แก่

  • ไฟล์ .torrent: แกะอ่าน Metadata ภายใน เช่น announce (URL ของ Tracker), piece length, รายชื่อไฟล์, ขนาดไฟล์ และค่า Hash ชิ้นส่วน
  • Tracker Responses: ถอดรหัสข้อมูลที่ Tracker ส่งกลับมา เช่น รายการ IP ของ Peers, จำนวน Seeders/Leechers
  • DHT Messages: ถอดรหัสแพ็กเก็ตที่คุยกันในระบบ Distributed Hash Table (Kademlia)

ชนิดข้อมูลและรูปแบบของ Bencode ที่ถูก Decode

Bencode รองรับโครงสร้างข้อมูลพื้นฐานเพียง 4 ประเภท

Data Typeรูปแบบ Bencodeตัวอย่างหลัง Bdecodeคำอธิบาย
Byte String<ความยาว>:<ข้อความ>4:spam $\rightarrow$ "spam"สตริงทั่วไปหรือ Raw Binary (เช่น SHA-1 hash)
Integeri<ตัวเลข>ei42e $\rightarrow$ 42, i-3e $\rightarrow$ -3จำนวนเต็ม เริ่มด้วย i ปิดท้ายด้วย e
List (Array)l<สมาชิก...>el4:spami42ee $\rightarrow$ ["spam", 42]รายการข้อมูล เริ่มด้วย l ปิดท้ายด้วย e
Dictionary (Map)d<key><val>...ed3:cow3:moo4:spami42ee $\rightarrow$ {"cow": "moo", "spam": 42}Key-Value โดย Key ต้องเป็น String เรียงตามตัวอักษร

ตัวอย่างการ Decode ด้วยภาษา Python

# ตัวอย่างการ Bdecode ด้วยไลบรารี bencode-py (หรือ bcoding / torrentool)
import bencode

# ข้อมูล Bencoded
raw_data = b"d8:announce35:http://tracker.example.com/announce13:creation datei1672531199ee"

# ทำการ Bdecode
decoded = bencode.bdecode(raw_data)

print(decoded)
# ผลลัพธ์: {'announce': 'http://tracker.example.com/announce', 'creation date': 1672531199}

ทำไม BitTorrent ถึงใช้ Bencode แทน JSON?

  • Deterministic (Canonical Form): โครงสร้าง Bencode บังคับเรียง Key ใน Dictionary เสมอ ทำให้ได้ Binary Output รูปแบบเดียวแน่นอน ซึ่งจำเป็นอย่างยิ่งต่อการคำนวณ Info Hash เพื่อตรวจสอบความถูกต้องของไฟล์
  • รองรับ Raw Bytes ได้สมบูรณ์: ชิ้นส่วน Hash (SHA-1 / SHA-256) เป็น Binary Data 20-32 bytes การเก็บใน Bencode ทำได้โดยตรงไม่ต้องแปลงเป็น Base64 หรือ Hex ให้เปลืองพื้นที่