เด็กแว้นชอบบิดออนเดอะRoad ส่วนนักLoadชอบบิตTorrent

มิวสิควิดีโอ “WAAN BOY ‘N’ SAGOI GIRL จาก GANCORE CLUB

ใน blog ไม่ได้มีเรื่องราววิชาการมานานแล้ว กลับมาครั้งนี้ผมไม่ได้นำแค่เพียงมิวสิควิดีโอเซ็กซี่ของก้านคอคลับมาให้ชมเท่านั้น แต่ยังจะมาทบทวนพื้นฐานของ BitTorrent ซอฟต์แวร์ Peer-to-Peer สำหรับแชร์ไฟล์ที่โด่งดัง(ที่สุดในโลก)ด้วย เนื่องจากในช่วงสัปดาห์ที่ผ่านๆมาผมได้ทำการค้นคว้างานวิจัยที่เกี่ยวกับ BitTorrent ว่ามีอะไรบ้าง ผมคาดว่าในหัวข้อต่อไปๆอาจจะมีการกล่าวถึง Bittorrent ผมเลยขอเปิดประเด็น BitTorrent ณ ที่นี้เลยแล้วกัน

Author: Sivadon Chaisiri More about author

หลายคนก็คงเคยใช้ BitTorrent และรู้หลักการของ BitTorrent มาบ้างแล้ว ทั้งนี้ BitTorrent กำเนิดมาตั้งแต่ 2001 โดย Bram Cohen ถือได้ว่าไม่ใช่เรื่องใหม่อะไรที่จะต้องมาปูพื้นฐานหรือมาตัดริบบิ้นเปิดตัว แต่วัตถุประสงค์ของผมต้องการเพียงทบทวน BitTorrent เพราะต่อไปผมอาจจะกล่าวถึงงานวิจัยและพัฒนาที่เกี่ยวกับ BitTorrent ผมก็ขอถือโอกาสทบทวน BitTorrent ในที่นี้อย่างกว้างๆว่า BitTorrent ประกอบไปด้วยอะไร ทำงานอย่างไร ย้ำนะครับว่าเป็นการทบทวน แต่หากเนื้อหาที่ผมให้ผู้อ่านได้นั้นมันมากกว่าการทบทวนก็ถือว่าเป็นเรื่องดี

แหล่งข้อมูลพื้นฐาน

สำหรับผู้ต้องการข้อมูลพื้นฐานด้าน Peer-to-Peer สามารถอ่านได้ที่ [3 , 4]  และข้อมูลเกี่ยวกับพื้นฐานของ BitTorrent ก็ไปอ่านได้ที่[1 , 2] สำหรับบทความอื่นๆของผมที่เกี่ยวกับ Peer-to-Peer ไปอ่านได้ที่ [5]

แนะนำ BT แบบรวบรัด

BitTorrent (ขอใช้ตัวย่อว่า BT) เป็นโปรโตคอลสำหรับการแชร์ไฟล์บนเครือข่ายPeer-to-Peer (P2P) โปรโตคอลของBTเป็นอะไรที่สั้นกระทัดรัดเข้าใจง่าย ไม่มีกฎเกณฑ์ยุ่งยากอย่างโปรโคคอลP2Pยี่ห้ออื่นๆ ยกตัวตัวอย่างเช่น Freenet เป็นโปรโตคอล P2P ที่ยุ่งยากมีรายละเอียดเยอะแยะ มีวิธีการจัดการหมายเลขประจำตัวหรือIDของเพียร์ที่ยุ่งยาก ส่วน JXTA ก็ออกจะเน้นที่การจัดการเอกสาร XML ที่มีโครงสร้างเป็นระบบระเบียบมากเกินไปหน่อย จริงๆก็ดีอยู่และนำไปประยุกต์กับงานได้มากกว่าการแค่แชร์ไฟล์ แม้JXTAจะมี API ออกมาหลายภาษาเพื่อจัดการกับเอกสารXMLเหล่านี้ (เช่น Java, C, Python และ Ruby) แต่ก็ทำให้ผู้พัฒนาต้องยึดติดหรือผูกมัดกับ API มากเกินไป ไม่ยืดหยุ่นมากพอที่จะแก้ไขดัดแปลง ถ้าจะดัดแปลงก็ต้องอาศัย API ระดับล่างหรือแกะที่ sourcecode ซึ่งยุ่งยากพอสมควร เป็นต้น คุณลองเปิดอ่านโปรโตคอลของ BT ดูก็ได้ [2] เนื้อหาสั้นและเข้าใจง่าย อ่านแค่ 15 – 25 นาทีก็เพียงพอให้เริ่มเขียนโปรแกรมได้แล้ว จริงๆแล้ว รายละเอียดของโปรโตคอลกล่าวแต่เพียงว่า BT มีองค์ประกอบอะไรบ้าง แต่ละตัวทำหน้าที่อะไร การสื่อสารระหว่างองค์ประกอบเหล่านั้นต้องส่งmessageอย่างไร ฟังดูก็เหมือนกับโปรโตคอลของเครือข่ายทั่วๆไป มันต่างเพียงว่า BT ไม่จะเคร่งครัด ดูเป็นกันเองมาก และมีการให้คำแนะนำถึงวิธีการแบ่งชิ้นส่วนของไฟล์และการกระจายชิ้นส่วนของไฟล์ แต่ก็ไม่ได้เคร่งครัดว่าจะต้องทำตามคำแนะนำนี้

ในปัจจุบันมีโปรแกรมหลายตัวที่สนับสนุนโปรโตคอล BT [6] เราจะเรียกโปรแกรมเหล่านี้ว่า BitTorrent Client ถึงแม้จะมีโปรแกรมหรือโปรโตคอลที่เป็น P2P อยู่หลายตัวด้วยกันก็ตาม ได้แก่ JXTA, Gnutella,  SETI@Home, FastTrack, Jubber และ Freenet เป็นต้น แต่ผมกล้าเคลมได้ว่า BT เป็น P2P ที่มีชื่อเสียงที่สุดในโลกก็ว่าได้ ทั้งชื่อเสียงในทางที่ดีและไม่ดี (แต่อาจจะไม่ดีเยอะหน่อย)  และจากการอ่านและค้นคว้าผลงานตีพิมพ์และบทความต่างๆบนอินเตอร์เน็ต* ผมพบว่า BT เป็นโปรโตคอลที่บรรดานักวิจัยให้ความสนใจมากที่สุด  และจัดได้ว่าเป็นโปรโตคอลที่ถูกนำไปพัฒนามากที่สุดเลยก็ว่าได้ **

เครือข่าย BitTorrent เป็นเครือข่ายแบบ P2P ซึ่งไม่มีใครตั้งตนเป็น client และ server ทุกเพียร์มีสถานะเท่ากันคือเป็นได้ทั้ง client และ server โดย BT กำหนดหน้าที่ของเพียร์ไว้ประมาณ 3 หน้าที่ใหญ่ๆคือ seeder, downloader และ tracker ซึ่งจะกล่าวเป็นลำดับถัดไป

* นับตามจำนวนผลงานตีพิมพ์จากค่าย IEEE  ACM   Springer  โดยคัดเฉพาะผลงานที่มีชื่อของงานกล่าวถึง BitTorrent โดยตรงนับตั้งแต่อดีตจนถึงปี 2008 และจากอ่านบทความที่อ้างถึง BitTorrent จากการค้นคว้าข้อมูลด้วย Google 
** พิจารณาจากจำนวน BitTorrent Client [6] และโปรแกรมอื่นที่นำโปรโตคอล BT ไปประยุกต์ [7] ตามข้อมูลปี 2008

Seeder

โปรโตคอล BT มีรูปแบบแตกต่างจากโปรแกรมพวก File Sharing สมัยโบราณคือ ไฟล์จะถูกแบ่งเป็นชิ้นเล็กๆขนาดเท่าๆกัน (ยกเว้นชิ้นสุดท้ายอาจจะเล็กกว่าชิ้นอื่น) แต่ละชิ้นเรียกว่า Piece หรือ chunk แต่ละ piece มีขนาดเล็กตั้งแต่ 64 KB – 4 MB แล้วแต่จะกำหนด

หากเรามองว่า piece คือเมล็ดข่าวที่เราจะหว่านลงที่นา Seeder ก็คือผู้ที่จะหว่าน piece ไปให้บรรดาเพียร์ต่างๆที่ต้องการ piece ของไฟล์ แต่คำว่า Seeder สำหรับ BT ยังหมายถึง เพียร์ที่มีไฟล์ต้นฉบับทั้งไฟล์ หรือกล่าวได้ว่าเป็นเพียร์ที่มี piece ของไฟล์ครบทุกชิ้น วิธีการจะตั้งตนเป็น seeder ก็ไม่ยากเลย ก่อนอื่นก็สร้างไฟล์ .torrent ขึ้นมาก่อน โดยไฟล์ .torrent ส่วนใหญ่จะมีนามสกุลไฟล์ลงท้ายว่าtorrent ไฟล์นี้เป็นไฟล์ที่เก็บข้อมูลของไฟล์(หรือกลุ่มของไฟล์)ที่ seeder อยากจะแชร์ให้ผู้อื่นได้ดาวน์โหลด เช่น ถ้าเราอยากแชร์โปรแกรมชื่อ Adobee fotoshop คุณก็ต้องสร้างไฟล์ torrent ของโปรแกรม Adobee fotoshop ให้ได้ก่อน อาจจะตั้งชื่อไฟล์ torrent นี้ให้มีชื่อว่า Fotoshop.torrent เป็นต้น ไฟล์ torrent หนึ่งไฟล์อาจจะมีข้อมูลของไฟล์หนึ่งไฟล์หรือมากกว่า 1 ไฟล์ก็ได้ เช่น ถ้าเป็นการแชร์เพลง MP3 หนึ่งเพลงในไฟล์ torrent ก็จะมีข้อมูลของไฟล์ MP3 นี้เพียง 1 ไฟล์ แต่ถ้าเป็นการแชร์โปรแกรม Adobee fotoshop ไฟล์ torrent ก็จะเก็บข้อมูลของไฟล์มากกว่า 1 ไฟล์ เพราะโปรแกรมนี้มีไฟล์เกี่ยวข้องอยู่มากมาย เป็นต้น โปรแกรม BitTorrent Client หลายยี่ห้อ[6]มีฟังก์ชันสำหรับช่วยในการสร้างไฟล์ torrent และเว็บไซต์บางแห่งก็เตรียมเครื่องมือสำหรับสร้างไฟล์ torrent เช่นกัน

ในไฟล์ .torrent จะบันทึกข้อมูลเกี่ยวกับ tracker (กล่าวในหัวข้อต่อไป) และรายละเอียดของไฟล์(หรือกลุ่มไฟล์)ที่เราจะแชร์ เช่น ไฟล์เมื่อถูกแบ่งเป็นชิ้นเล็กๆหรือ piece แต่ละ piece มีขนาดกี่ไบต์ และแต่ละ piece มีรหัสแฮช (hash code) เช่นไร รหัสแฮชนี้จะถูกใช้สำหรับตรวจเช็คความถูกต้องของการดาวน์โหลดไฟล์ สำหรับ BT เลือกใช้ SHA-1 สำหรับคำนวณค่าของรหัสแฮช เป็นต้น

เมื่อ Seeder มีไฟล์ที่ต้องการแจกให้ผู้อื่นพร้อมกับไฟล์ torrent จากนั้นก็นำไฟล์ torrent ไปฝากไว้ให้ tracker สักเจ้าหรือมากกว่า 1 เจ้า (จะกล่าวถึง tracker ต่อไป) แล้วจะหา tracker อย่างไรล่ะ ไม่ยากเลย วิธีง่ายที่สุดก็คือตัว seeder ติดตั้งโปรแกรม tracker ไว้บนเครื่องตัวเอง พูดง่ายๆคือเป็นทั้ง tracker และ seeder ในตัว แต่ถ้าไม่อยากเป็น tracker ก็ไปหา tracker เจ้าอื่นที่กำลังเปิดอยู่ เมื่อฝากไฟล์กับ tracker แล้ว หน้าที่ของ seeder ต่อไปคือต้องอัพโหลดหรือหาวิธีแจกไฟล์ torrent นี้ไปให้เพียร์อื่นๆให้ได้ วิธีง่ายที่สุดก็คือไปอัพโหลดไฟล์ torrent ไว้กับเซิร์ฟเวอร์ที่เปิดฟรีสักที่ หรือเว็บไซต์ที่รับฝากไฟล์ torrent

หลังจาก Seeder ฝากไฟล์ไว้กับ Tracker และหาวิธีแจกจ่ายไฟล์ torrent เรียบร้อยแล้ว ขั้นต่อไปก็คือ Seeder จะต้องเปิดโปรแกรม BitTorrent Client [6]ค้างไว้เพื่อหว่าน piece ของไฟล์ให้แก่เพียร์อื่น ควรจะเปิดโปรแกรมเพื่อหว่าน piece ให้นานเท่าที่จะทำได้ หากเราคือSeederเจ้าแรกที่หว่านไฟล์ให้แก่เพียร์อื่นเราจะถูกเรียกว่า initial seeder เมื่อเรากระจาย piece ของไฟล์ให้แก่เพียร์อื่นๆไปสักระยะหนึ่ง เพียร์อื่นๆก็สามารถกลายเป็น seeder ในเวลาต่อมาได้ เนื่องจากเพียร์เหล่านั้นได้รับ piece ของไฟล์ครบทุกชิ้น

Downloader

Downloader แปลง่ายๆคือผู้ดาวน์โหลด  หากอยากจะเป็นDownloaderเพื่อดาวน์โหลดไฟล์จากผู้อื่น (เช่น ดาวน์โหลดจาก Seeder และจากdownloaderเจ้าอื่นๆ) เราจำเป็นต้องติดตั้งและรันโปรแกรมBitTorrent Client[6]ก่อน วิธีการใช้งานโปรแกรม BitTorrent Client แต่ละตัวมีขั้นตอนคล้ายกัน คือก่อนอื่นคุณต้องไปหาไฟล์ torrent ของไฟล์ที่เราต้องการดาวน์โหลดก่อน อย่างที่กล่าวไว้ในหัวข้อ Seeder ผู้ที่เป็น initail seeder อาจจะฝากไฟล์ torrent ไว้บนเว็บไซต์สักแห่ง เอา Google ค้นหาไฟล์ torrent ที่ต้องการก็ได้..ง่ายดี

เมื่อได้ไฟล์ torrent ที่ต้องการ ก็ใช้ BitTorrent Client เปิดไฟล์นั้นขึ้นมาเพื่อเริ่มดาวน์โหลด piece ของไฟล์ ช่วงแรกๆที่เริ่มดาวน์โหลดคุณอาจจะรู้สึกว่ามันช้ามากๆหรือกว่าจะเริ่มดาวน์โหลดได้ชิ้นแรกก็นานมากๆ(อาจจะหลายสิบนาที) เพราะเริ่มแรก Downloaderจะมีconnectionต่อไปหาเพียร์อื่นๆในจำนวนที่น้อยและต้องดาวน์โหลดpieceของไฟล์ให้ได้เยอะถึงระดับหนึ่งเพื่อจะได้นำ piece ที่มีอยู่ไปแลก piece ชิ้นอื่นกับเพียร์อื่นๆอีกต่อไป (จะกล่าวเพิ่มในหัวข้อ Tit-for-tat) และเมื่อไหร่ก็ตามที่เปิด TCP Connection ได้เยอะถึงระดับหนึ่งเพื่อต่อไปหาเพียร์จำนวนมากๆ (อาจจะมีมากกว่า 100 – 500 connection***)  ถึงจุดนี้ความเร็วในการดาวน์โหลด(download rate)จะเพิ่มขึ้นมากกว่าช่วงเริ่มต้นอย่างมาก

เมื่อ Downloader ได้ piece ใดๆมาเก็บไว้ที่เครื่อง   Downloaderจะอัพโหลด piece ที่มีอยู่ให้แก่Downloaderอื่นๆได้ สำหรับโปรโตคอล BT มีหลักการที่สุดยอดอยู่หลักการหนึ่งชื่อว่า Tit-for-tat (จะกล่าวเพิ่มในหัวข้อ Tit-for-tat ต่อไป) เป็นหลักการที่ว่า Downloader จะต้องนำ piece ที่ดาวน์โหลดมาได้ไปแลกกับpieceที่ยังไม่มีกับ Downloaderอื่นๆ ดังนั้น Downloader อาจจะไม่ได้เป็นผู้ดาวน์โหลดเพียงอย่างเดียว แต่ยังเป็นผู้อัพโหลด (Uploader) อีกด้วย และเมื่อไหร่ก็ตามที่Downloader มีpieceของไฟล์ครบทุกชิ้นแล้ว  Downloaderนี้ก็จะกลายเป็น Seeder เพื่อหว่าน piece ของไฟล์ต่อไป

ถ้าคุณใช้ Dial-up Access ผ่าน modem รุ่นโบราณ (พวก 56 Kbps) ผมแนะนำว่าอย่าใช้ BitTorrent ให้ช้ำใจอีกต่อไปเลย เพราะมันจะช้ามากๆ อาจจะดาวน์โหลดไฟล์ขนาด 10 MB เป็นสัปดาห์ก็ว่าได้ ลงทุนต่อ Internet แบบ ADSL เอาความเร็วของ download rate สัก 512 Kbps หรือถ้าจะดีควรจะตั้งแต่ 1 Mbps ขึ้นไป อย่างที่ผมใช้อยู่ที่สิงคโปร์ตอนนี้ ผมใช้ ADSL ที่ 8 Mbps (จ่ายรายเดือนเพียง S$40 ต้นๆ) สามารถดาวน์โหลดไฟล์ 1 GB ผ่าน BitTorrent ในเวลาไม่ถึง 40 นาที … เหตุผลที่ยิ่งใช้ net เร็วๆยิ่งดีสำหรับ BitTorrent เนื่องจากโดยทั่วไปแล้ว Seeder มักจะแจก piece ให้กับเพียร์ที่มีความเร็ว net ไวๆ เพราะ Seeder หวังว่าหากแจก piece ให้แก่เพียร์ที่มี net เร็วแล้ว เพียร์เหล่านี้จะกลายเป็น seeder ในเวลาต่อไปมา ยิ่งมี seeder มากเท่าไหร่ ประสิทธิภาพในการแชร์ไฟล์ก็ยิ่งมากไปด้วย (กล่าวเพิ่มเติมไว้ในหัวข้อ Tit-for-tat)

*** ระบบปฎิบัติการหลายตัวสามารถจำกัดจำนวน Half-open connection เพื่อป้องกันปัญหา denial-of-service ซึ่งจะทำให้คอมพิวเตอร์จองทรัพยากรจำนวนหนึ่งสำหรับจัดการการสื่อสารที่(กำลัง)เกิดขึ้นในไม่ช้า หากเปิดไว้มากก็ยิ่งบริโภคทรัพยากรของคอมพิวเตอร์มากไปด้วย (โดยเฉพาะหน่วยความจำหลักและbandwidthของเครือข่าย) อย่างไรก็ดี BitTorrent Client บางยี่ห้อสามารถแก้ไขข้อจำกัดตรงนี้ได้ แต่ผู้ใช้ก็ต้องยอมรับด้วยว่าคอมพิวเตอร์และเครือข่ายจะต้องถูกใช้ทรัพยากรไปมากด้วย บางครั้ง คนอื่นๆที่เล่นnetบนโมเด็มตัวเดียวกันกับคนที่เล่นBitTorrent อาจจะบ่นว่า “ทำไม net มันช้าจัง” (อันนี้ผมเจอประจำ)

Swarm และ Tracker

กลุ่มของเพียร์ (จะเป็น seeder, downloader หรือ tracker) ที่เกี่ยวข้องกับไฟล์ที่แชร์หนึ่งไฟล์(หรือกลุ่มของไฟล์หนึ่งกลุ่ม) จะถูกเรียกว่า Swarm

อย่างที่กล่าวก่อนหน้านี้แล้วว่า Seeder จะทำการฝากข้อมูลของไฟล์ torrent กับ Tracker สำหรับหน้าที่หลักของ tracker คือคอยติดตามข้อมูลเพียร์ที่อยู่ใน swarm โดยจะคอยจัดทำรายการ (list) ของเพียร์ที่อยู่ใน swarm ว่ามีจำนวนเท่าไหร่และจะติดต่อเพียร์เหล่านี้ได้อย่างไร (เก็บข้อมูลอย่าง IP และพอร์ตที่ใช้สำหรับติดต่อแต่ละเพียร์) ทั้งนี้เพราะเพียร์ใน swarm (จะเป็น downloader หรือ seeder ก็ตาม) สามารถที่จะเข้าและออกจาก swarm ได้ทุกเมื่อ (เช่น net หลุด หรือเพียร์ตั้งใจปิดโปรแกรม BitTorrent Client) ดังนั้น รายการของเพียร์ใน swarm หนึ่งๆจะต้องถูกอัพเดทเป็นระยะๆ โดยแต่ละเพียร์จะทำการรายงานสถานะของตนเองกับtrackerและร้องขอรายการของเพียร์ในswarmจากtrackerเป็นระยะๆ หากเพียร์ใดๆไม่ทำการรายงานสถานะตัวเองในเวลาที่กำหนดกับtrackerแล้ว trackerจะทำการลบรายชื่อของเพียร์นั้นออกจากระบบ นอกจากนี้แล้ว tracker บางตัวยังสามารถblockเพียร์ที่มีปัญหาได้ เช่น downloader ที่ไม่ยอมอัพโหลดไฟล์ให้คนอื่น (หรือก่อปัญหา free riding ซึ่งจะกล่าวต่อไป) เป็นต้น และ tracker บางตัวยังเก็บข้อมูลอื่นๆของแต่เพียร์ เช่น ค่า ratio ระหว่าง upload rate และ download rate ของแต่ละเพียร์ เป็นต้น

โดยปกติแล้ว initial seeder จะฝากข้อมูลของไฟล์ torrent กับ Tracker มากกว่า 1 ราย โดยในไฟล์ torrent จะมีข้อมูลรายการของ tracker เมื่อไหร่ก็ตามที่Downloaderเริ่มดาวน์โหลดไฟล์ Downloaderจะทำการสุ่มเลือกติดต่อไปหาtrackerตามรายการที่มีอยู่ในไฟล์torrent   เมื่อติดต่อไปหาtrackerแล้ว   trackerจะทำการสร้างรายการของเพียร์ในswarmแบบสุ่มๆขึ้นมา (รายการนี้ประกอบข้อมูลของด้วย seeder และ downloader) เมื่อ Downloader ได้รายการนี้จากtrackerแล้ว    Downloaderจะทำการสุ่มติดต่อไปหาseederและ/หรือdownloaderในรายการนี้เพื่อโหลดpieceของไฟล์ 

ท่านทราบมาแล้วว่า Peer-to-Peer เป็นเครือข่ายที่ไร้ซึ่งServerและClient ทุกๆโหนดในเครือข่ายถูกเรียกว่าเพียร์ แต่ละเพียร์สามารถเป็นได้ทั้งClientและServer   แต่เมื่อเราอ่านถึงเรื่อง Tracker ตรงนี้แล้วก็จะพบว่า BT มี tracker ที่เป็น centralized server   และเราจำได้ว่าลักษณะเช่นนี้ก่อให้เกิดปัญหา single-point-of-failure ถ้าหากว่าทุก tracker ใน swarm ตายกันหมดก็ส่งผลให้ไม่สามารถส่งรายการของเพียร์ที่อัพเดทไปให้สมาชิกในswarmได้ และยังเป็นผลให้downloaderรายใหม่ไม่สามารถเข้าสู่swarmได้อีกด้วย จนกว่าจะมีtrackerสักตัวตื่นขึ้นมาใช้งานได้ปกติอีกครั้ง

BitTorrent บางยี่ห้อ (เช่น BitTorrent Mainline เวอร์ชัน 4.2 ขึ้นไป) เสนอวิธีการที่เรียกว่า distributed tracker (หรือ trackerless) อันเป็นหลักการที่ไม่จำเป็นต้องพึ่งพา Tracker ศูนย์กลางอีกต่อไป โดยใช้วิธีการที่เรียกว่า Distributed Hash Table (DHT) และ BitTorrent Client หลายยี่ห้อเลือกใช้ Kademlia สำหรับสร้างเครือข่ายดังกล่าว (หากมีโอกาสผมจะกล่าวหลักการ DHT สักครั้ง)

Tit-for-tat ปะทะ Free Rider

จากการอ่านผลงานตีพิมพ์หลายชิ้น เขากล่าวว่าสาเหตุที่BTได้รับความนิยมมากและมีประสิทธิภาพมาก เพราะBTมีคุณสมบัติ 2 ข้อด้วยกัน คือ 1.การแบ่งไฟล์ให้เป็น piece เพื่อการขนส่งได้อย่างเร็วและจัดการความผิดพลาดได้ง่าย และ 2. BTใช้วิธีที่เรียกว่า Tit-for-tat

ในเครือข่ายการแชร์ไฟล์แบบบ P2P หลายยี่ห้อประสบปัญหาใหญ่ปัญหาหนึ่งที่ชื่อว่า free riding (แปลว่าขออย่างเดียวไม่ยอมให้) ปัญหานี้ส่งผลให้ไฟล์ที่แชร์อยู่ในระบบอาจจะหายไปจากระบบได้ ซึ่งทำให้ระบบขาดความน่าเชื่อถือ (reliablity) เพราะไม่รับประกันความคงอยู่ของข้อมูล (availability) เนื่องจากระบบเครือข่าย P2P เป็นเครือข่ายที่อิสระมากๆ เพียร์ใดๆสามารถอยู่หรือไปจากระบบได้ทุกเมื่อ ดังนั้น หากเมื่อใดที่ downloader ได้ไฟล์ครบตามที่ต้องการแล้วก็สามารถออกจากระบบไปได้เลย หรือ downloader อาจจะจำกัด bandwidth ให้การอัพโหลดไฟล์ไปให้ผู้อื่นน้อยๆหรือน้อยมากจนกระทั่ง upload rate มีค่าเป็น 0-1 Kbps ปัญหาเช่นนี้ผมเจอเป็นประจำกับเครือข่ายที่ใช้โปรโตคอล Gnutella (เช่น โปรแกรม Limewire) มีบางคนพูดขำๆว่า เพียร์พวกนี้เป็นเพียร์ที่เห็นแก่ตัว เข้ามาโหลดอย่างเดียวเมื่อโหลดเสร็จก็จากไป (แต่มันหยาบคายกว่านั้น คิดเอาเองแล้วกัน) และมีคนตั้งชื่อให้กับเพียร์ที่เห็นแก่ตัวเหล่านี้ว่า free rider หรือ leecher**** (เรียกสั้นๆว่า leech แปลว่า ปลิงหรือทากดูดเลือด)

BitTorrent จึงเสนอว่าวิธีการแก้ปัญหา free riding ด้วยวิธี Tit-for-tat (แปลว่าการตอบแทนหรือชดใช้) หลักการง่ายมากๆ กล่าวคือ หากเพียร์ใดๆ สมมติชื่อA อยากจะดาวน์โหลดpieceที่มีอยู่บนเพียร์อื่น สมมติชื่อB Aจะต้องนำpieceที่Bไม่มีไปแลกกับpieceที่Aอยากได้ ซึ่งเหมือนๆการซื้อขายของนี่แหละ แต่มันดีกว่าการซื้อขายของ เพราะเวลาคุณแลกpieceไม่ได้หมายถึงคุณต้องเสียpieceนั้นไป คุณเพียงแค่อัพโหลดpieceไปให้ผู้อื่นเพื่อจะได้ดาวน์โหลดpieceของผู้อื่นกลับมา

สำหรับ downloader หน้าใหม่ที่เพิ่งเข้าสู่swarmนั้นย่อมไม่มีpieceไปแลกเปลี่ยนกับใครแน่ๆ ดังนั้น BitTorrent จึงมีวิธีที่ชื่อ optimistic unchoking (จะกล่าวในหัวข้อถัดไป) อันเป็นวิธีที่เปิดโอกาสให้ downloader หน้าใหม่ได้ติดต่อไปหา seeder มากขึ้น เมื่อไหร่ก็ตามที่downloaderหน้าใหม่ติดต่อกับseederได้ downloaderนี้จะดาวน์โหลดเอาpieceมาเก็บไว้ให้มากที่สุด จากนั้นdownloaderนี้จะมีpieceจำนวนหนึ่งเป็นเสมือนทุนตั้งต้นชีวิตในการแลกเปลี่ยนpieceกับdownloaderเจ้าอื่นได้อีก

อย่างไรก็ดี downloaderใดๆสามารถรับpieceจากseederเพียงอย่างเดียวโดยไม่อัพโหลดให้ใครเลยก็ได้หรือประพฤติตนเป็น free rider แต่การกระทำตัวเป็น free rider โดยไม่แบ่งปันpieceให้ใครเลยอาจจะใช้เวลานานในการดาวน์โหลดนานมากๆหรืออาจจะทำให้ไม่สามารถดาวน์โหลดไฟล์ได้ครบทุกpiece เหตุผลเพราะว่า 1. free riderดังกล่าวจะไม่สามารถดาวน์โหลดpieceจากdownloaderอื่นๆไดโดยไม่มีการแลกเปลี่ยนเกิดขึ้น 2. ในswarmหนึ่งๆ โดยปกติแล้วจะมีจำนวนseederน้อยกว่าdownloader เป็นผลให้seederแต่ละตัวต้องใช้connectionในการติดต่อกับdownloaderหลายๆตัว ดังนั้นอาจจะไม่เหลือconnectionให้กับfree riderเลย หรือแม้จะเหลือก็มีอัตราในการขนส่งpieceที่ต่ำ (เพราะมีคนติดต่อมาหาseederเยอะมาก) 3. trackerบางเจ้าสามารถกำจัดfree riderออกจากswarmได้ โดยจัดทำรายการของfree riderส่งไปให้เพียร์ในswarm ทำให้free riderหมดสิทธิ์ในการอยู่swarmอีกต่อไปในที่สุด

อีกปัญหาหนึ่งที่สามารถเกิดขึ้นได้ในswarm คือ เมื่อเพียร์ที่เป็นdownloaderเปลี่ยนสถานะกลายเป็นseederแล้ว เพียร์ตัวนี้กลับไม่ยอมหว่านไฟล์ไปให้downloaderอื่นๆและประพฤติตนเป็นfree riderในช่วงสุดท้าย เช่น ได้ครบทุกpieceเมื่อไหร่ก็ปิดโปรแกรมBitTorrent หรืออาจจะเขียนไฟล์ที่โหลดได้ลงแผ่นCDจากนั้นก็ลบไฟล์บนฮาร์ดดิสก์ทิ้ง เป็นต้น ปัญหานี้จัดได้ว่าเป็นปัญหาใหญ่ที่ Tit-for-tat จำเป็นต้องจัดการ โดย BitTorrent Client บางเจ้ามีวิธีการที่เด็ดมาก คือ เมื่อไหร่ก็ตามที่ downloader โหลดไฟล์ได้เกือบครบทุก piece (เช่น โหลดได้ 99% หรือเหลืออีกแค่ piece เดียวก็เสร็จแล้ว) บรรดาเพียร์ในswarmจะยังไม่แจกpieceที่เหลือให้downloaderเจ้านี้  ทั้งนี้ เพื่อเป็นการปล่อยให้ downloader นี้อัพโหลดไฟล์ให้ downloader อื่นๆให้มากที่สุด โดยส่วนใหญ่แล้ว ระบบจะปล่อยให้ downloader ที่ใกล้จะดาวน์โหลดเสร็จมีจำนวนเยอะถึงระดับหนึ่ง จากนั้นค่อยปล่อย piece ที่เหลือไปให้ downloader เหล่านั้นเพื่อกลายเป็น seeder พร้อมๆกัน

เมื่อมีจำนวน seeder มากๆในswarmก็ส่งผลไฟล์ที่แชร์ในswarmนั้นดำรงอยู่ในระบบได้ยาวนานขึ้นไปด้วย (เพิ่ม availability) เราจะสังเกตได้ว่าswarmของไฟล์บางไฟล์จะหยุดนิ่งอยู่นานมากหรือล่มไปในที่สุดถ้าหากว่าswarmนั้นไม่มีseederอยู่ในระบบเลย และจำนวนseederเยอะๆยังเพิ่มประสิทธิภาพในการดาวน์โหลดไฟล์ได้เยอะด้วย เพราะdownloaderหน้าใหม่ที่เข้าสู่swarmสามารถติดต่อไปหาseederได้หลายตัวพร้อมๆกันและดาวน์โหลดpieceให้ได้เยอะที่สุดตามกำลังbandwidthของเครือข่ายจะทำได้ จากนั้นจึงนำpieceที่ได้นี้ไปแลกเปลี่ยนกับdownloderเจ้าอื่นได้ และเป็นผลให้แบ่งเบาภาระที่เกิดบนseederได้ด้วย

**** บางเว็บไซต์และ BitTorrent Client บางเจ้าเรียก downloader ว่าเป็น leecher ชนิดหนึ่ง แม้ว่า downloader นั้นไม่ได้ก่อปัญหา free riding ก็ตาม

Choke และ Unchoke

ในเวลาหนึ่งๆเพียร์ของswarmใดๆจะมีสถานะเป็น choke หรือ unchoke อย่างใดอย่างหนึ่ง โดยสถานะchokeกับunchokeจะสลับกันไปมาโดยช่วงเวลาที่กำหนดเป็นระยะๆ ช่วงเวลาดังกล่าวเรียกว่า rechoking เมื่อตอนที่เพียร์เข้าสู่swarm เพียร์จะมีสถานะunchoke จากนั้นจะสร้างสมาชิกของเพียร์(เลือกเอาdownloaderและseederเข้าเป็นสมาชิก)ที่จะทำการแลกเปลี่ยนpiece จากนั้นจะทำการเปลี่ยนสถานะเป็นchoke ในสถานะchokeนี้เพียร์จะทำการอัพโหลดหรือดาวน์โหลดไฟล์กับสมาชิกที่ได้เลือกมาก่อนการchokeเท่านั้น และจะกีดกันไม่ให้เพียร์อื่นๆที่อยู่นอกเหนือจากนี้เข้ามาแจมได้เลย แต่เพียร์ที่ไม่อยู่ในสมาชิกเหล่านี้สามารถเข้ามาแจ้งความต้องการกับเพียร์ที่chokeอยู่ได้ เสมือนเข้ามาลงทะเบียนกับเพียร์ที่chokeว่ามีความสนใจในpieceที่เพียร์นี้มีอยู่ แต่ทั้งนี้จะต้องมีการแลกเปลี่ยนpieceที่ทั้งสองฝ่ายยินยอม และเมื่อไหร่ก็ตามที่เพียร์หมดเวลาchokeและเข้าสู่สถานะunchoke เพียร์จะทำการคัดเลือกสมาชิกที่ได้ลงทะเบียนตอนที่chokeก่อนหน้า เพื่อเข้ามาเป็นสมาชิกหน้าใหม่ในการแจมในช่วงchokeต่อไป นอกจากนี้ ในระหว่างที่เพียร์กำลังchokeหรือunchokeอยู่ เพียร์ก็สามารถถามเพียร์อื่นๆที่chokeและunchokeเพื่อแลกเปลี่ยนpieceที่ต้องการได้เช่นกัน

ในระหว่างที่เพียร์กำลังchokeอยู่นั้น เพียร์จะเปิด connection จำนวนมากด้วยโปรโตคอล TCP จำนวนของ connection ที่เปิดมากมายนี้ก็แปลผันตามกำลัง bandwidth ที่เพียร์นั้นมีและจำนวนสมาชิก(downloaderและseeder)ที่เพียร์จะติดต่อไปหา ดังนั้น ผู้ใช้ BT บางคนอาจจะพบว่าในระหว่างใช้งาน BT ในบางครั้งเราไม่สามารถใช้งาน Internet ในงานอื่นๆได้เลย เพราะ BitTorrent Client จะบริโภค bandwidth จนแทบไม่เหลือให้เราไปใช้งานอย่างอื่น

BitTorrent มีวิธีการที่เรียกว่า optimistic unchoking ซึ่งเป็นช่วงระยะเวลาที่ seeder จะใช้ในการเลือกเอา downloaderหน้าใหม่ที่เพิ่งเข้าสู่swarmเข้ามาร่วมแจมในช่วงเวลาchokeของseeder เพราะหากไม่มีช่วงเวลาดังกล่าว ก็เสมือนเป็นการกีดกั้นไม่ให้downloaderหน้าใหม่ได้มีpieceไปแลกเปลี่ยนกับdownloaderคนอื่นได้ 

สรุปตอนสุดท้าย แต่อาจไม่ใช่ท้ายที่สุด

BitTorrent อาศัยหลักการแบ่งไฟล์ให้เป็น piece ที่มีขนาดเล็กๆและอาศัยการเปิด TCP connection หลายช่องทางเพื่อการดาวน์โหลดpieceจากเพียร์อื่นๆหลายๆเพียร์พร้อมๆกัน และใช้ Tit-for-tat สำหรับป้องกันปัญหา free riding โดยเพียร์ใดๆอยากได้pieceจากคนอื่นก็จำเป็นต้องเอาpieceที่ตนมีอยู่ไปแลกด้วย ส่วนวิธีการ choke และ unchoke เป็นวิธีการสร้างสมาชิกของเพียร์ที่จะติดต่อเพื่อการแลกเปลี่ยนpiece

เพียงแค่เสน่ห์ที่กล่าวมานี้ก็ทำให้ BitTorrent ดึงดูดเหล่าบรรดานักวิจัยให้สนใจความสามารถของมันและมีการนำไปประยุกต์และปรับปรุงประสิทธิภาพต่างๆนานๆ นักวิจัยบางกลุ่มพยายามค้นหาจุดบกพร่องของBitTorrentอย่างเช่นพยายามหาช่องโหว่ว่าจะโกงBitTorrentอย่างไรเพื่อไม่ต้องใช้Tit-for-tat 

ผมอยากบอกว่าผมอาจจะไม่ได้กล่าวถึงBitTorrentแค่เพียงในบทความนี้เท่านั้น เพราะหวังว่าคงจะได้กล่าวถึง BitTorrent ในหัวข้ออื่นๆอีกไม่มากก็น้อย

ปล. เบื้องหลังบทความนี้ใช้เวลาในการทำประมาณ 2 เดือน ผมต้องพิมพ์วันละนิดวันละน้อยเพราะต้องทำงานหนักขึ้นเรื่อยๆจึงมีเวลาในการแต่งบทความน้อยไปด้วย ทั้งนี้เมื่อมีเวลาในการแต่งและพิมพ์บทความน้อยลงจึงอาจทำให้เนื้อหามีข้อความที่บกพร่องและเนื้อหาอาจจะตกหล่นได้ หากเนื้อหาผิดพลาดหรือใช้ภาษาที่อ่านไม่รู้เรื่องเช่นไรก็ติดชมได้ครับ

References

[1] BitTorrent Protocol http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29
[2] BitTorrent Protocol Specification http://www.bittorrent.org/beps/bep_0003.html
[3] P2P = Peer-to-Peer (หรือ Pirate-to-Pirate ?) https://javaboom.wordpress.com/2008/03/26/piratep2p/
[4] Peer-to-peer http://en.wikipedia.org/wiki/Peer-to-Peer
[5] https://javaboom.wordpress.com/category/boomarica/peer-to-peer/
[6] BitTorrent Client http://en.wikipedia.org/wiki/BitTorrent_client
[7] BitTorrent Adoption http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29#Adoption

8 thoughts on “เด็กแว้นชอบบิดออนเดอะRoad ส่วนนักLoadชอบบิตTorrent

  1. ขอบใจครับบู้ ตอนนี้คุณคงเรียนสนุกแล้วนะ ว่างๆก็มาแนะนำที่เรียนให้รุ่นน้องคุณที่มหาลัยบ้างนะครับ

    ผมกำลังประกาศหาคนทำงานวิจัยเรื่องBitTorrentอยู่ เป็นงานวิจัยนอกเวลา ไม่ใช่thesisของผม แค่อยากทำเพราะว่าสนใจ ถ้าคุณสนใจหรือมีคนสนใจอะไรที่เป็นBitTorrentก็บอกผมหน่อยนะครับ ไม่มีค่าจ้างอะไรให้ทั้งสิ้น อย่างที่บอกนะว่าเป็นกิจกรรมนอกเวลาและความชอบส่วนตัว ผลลัพธ์คือตีพิมพ์ conference หรือลง workshop ร่วมกันแค่นั้นเอง

  2. เดี๋ยวๆบู้ลืมถามอีกคำถาม ที่คุณว่าเนื้อหาดีมากมาก คือมิวสิควิดีโอใช่หรือเปล่าครับ🙂

  3. เด็กแว้นไอที says:

    โดนใจจริงๆ เอาpeer2peerอีกนะครับ ขอมิวสิกกะภาพประกอบอย่างนี้บวกเนื้อหาดีๆอีกนะคร๊าบ

  4. ครับๆ เด็กแว้นมาเองเลยเหรอครับ วันหลังพาสก๊อยเกิร์ลมาด้วยก็ดีนะครับ🙂

  5. CS says:

    เป็นเนื้อหาที่ดีมากเลยค่ะ จะติดตามอ่านต่อไปเรื่อยๆนะค่ะ

  6. CS says:

    ตอนนี้กำลังศึกษาเรื่องP2P แล้วเจอในกูเกิ้ล ขอชมอีกรอบว่าอ่านแล้วเข้าใจขึ้นเยอะมากเลยที่เดียวค่ะ

    ป.ล.หวังว่าจะมีบทความเรื่องนี้ออกมาต่อไปเรื่อยๆนะค่ะ ^0^

    • ขอบคุณมากครับ

      ตอนนี้ผมไม่ค่อยได้เขียนเรื่อง p2p แล้วครับ ถ้ามีโอกาสจะกลับมาเขียนอีกครับ มีคนอ่านก็มีกำลังใจเขียนครับผม🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s