李敏寧
摘要:傳統(tǒng)的C/S架構(gòu)在當(dāng)用戶數(shù)目急劇增加時(shí),容易產(chǎn)生服務(wù)器過(guò)載現(xiàn)象,使用服務(wù)器集群或分布式系統(tǒng)成本增大。BitTorrent協(xié)議是一種基于P2P(Peer to Peer)的文件共享協(xié)議,具有“用戶越多,下載速度越快”的特點(diǎn),尤其是針對(duì)大文件的下載,能夠較好的降低服務(wù)器負(fù)擔(dān),提高系統(tǒng)的擴(kuò)展性和健壯性。更能體現(xiàn)出系統(tǒng)的優(yōu)越性。但其缺點(diǎn)是為了追求下載速度而犧牲了文件下載的順序性。
關(guān)鍵詞:BitTorrent協(xié)議;P2P技術(shù);片段選擇算法
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文童編號(hào):1009-3044(2015)19-0100-03
在傳統(tǒng)的FTP/HTTP協(xié)議中,用戶在下載文件時(shí)沒(méi)有交互,當(dāng)同一時(shí)間內(nèi)訪問(wèn)服務(wù)器的用戶超過(guò)一定量時(shí),由于有限的帶寬和難以提升能力的FTP服務(wù)器,下載速度急劇下降,導(dǎo)致部分用戶可能與服務(wù)器無(wú)法建立連接。
為了解決這個(gè)問(wèn)題,研究人員進(jìn)行了多年探索,2003年,美國(guó)軟件工程師布萊姆·科亨采用Python語(yǔ)言編寫(xiě)了BitTorrent協(xié)議,并以MIT許可證發(fā)布。
BitTorrent采用高效的文件分發(fā)技術(shù)及P2P技術(shù)共享文件,系統(tǒng)內(nèi)用戶在下載的同時(shí)向其他下載者提供上傳服務(wù)。具有“用戶越多,下載速度越快”的特點(diǎn)。
1BitTorrent協(xié)議的工作原理
BitTorrent協(xié)議處在TCP/IP的應(yīng)用層,是一種P2P文件傳輸協(xié)議,由于開(kāi)源的特點(diǎn),其內(nèi)容一直在不斷擴(kuò)充。
在BitTorrent系統(tǒng)中,文件發(fā)布者先將文件生成.torrent文件,稱為種子文件(簡(jiǎn)稱“種子”)。種子文件本質(zhì)上是文本文件,它包含Tracker(跟蹤器)信息及文件信息兩個(gè)部分:Tracker信息包括它的地址以及設(shè)置信息;文件信息根據(jù)對(duì)共享文件的計(jì)算生成,計(jì)算結(jié)果使用B編碼規(guī)則進(jìn)行編碼。其主要原理是把文件虛擬分成許多塊,每個(gè)塊256KB,并把塊的索引信息和Hash驗(yàn)證碼都寫(xiě)入種子文件,也就是說(shuō),種子文件即是被下載文件的索引。
用戶下載文件前,先要下載該文件的種子,BitTorrent客戶端首先解析種子文件,得到Tracker地址后連接Tracker服務(wù)器,提出請(qǐng)求;Tracker服務(wù)器收到請(qǐng)求后,提供給用戶發(fā)布者和該系統(tǒng)內(nèi)其他下載節(jié)點(diǎn)的TP地址,用戶根據(jù)地址和下載者相互連接,交換自己擁有的塊。此時(shí)服務(wù)器不再參與,單個(gè)線路的數(shù)據(jù)流量降低,從而減輕了服務(wù)器的負(fù)擔(dān)。
為了保證下載數(shù)據(jù)正確,用戶每下載完一個(gè)塊,BitTorrent就會(huì)計(jì)算出這個(gè)塊的Hash碼,對(duì)比.torrent文件,相同就說(shuō)明數(shù)據(jù)正確,否則重新下載。
2BitTorrent的架構(gòu)
BitTorrent最突出的特點(diǎn)是下載文件速度極快,理想狀態(tài)下,BitTorrent的下載速度可以達(dá)到電信運(yùn)營(yíng)商所提供的最高速度,而與源文件所在結(jié)點(diǎn)的上傳帶寬關(guān)系不大。BitTorrent的下載速度高,是因?yàn)锽T的服務(wù)模式與傳統(tǒng)的C/S(客戶機(jī)/服務(wù)器)模式不同,如圖1所示。
左圖是傳統(tǒng)的C/S模式,s擁有文件,有六個(gè)客戶(C1、C2、C3、C4、C5、C6)同時(shí)希望得到這個(gè)文件,則每個(gè)客戶的下載速度最高只能是文件擁有者S上傳速度的1/6。如果同時(shí)有成百上千的用戶訪問(wèn)S,則每個(gè)客戶的下載速度將極小,甚至可能造成S癱瘓。
右圖是BitTorrent模式,仍然是S擁有文件,同時(shí)有六個(gè)客戶(C1、C2、C3、C4、C5、C6)希望得到這個(gè)文件,這時(shí),S先將文件分片段傳送給他們中的部分客戶(如C1、C3、C5),這些客戶擁有若干個(gè)片斷后,在繼續(xù)下載其它片斷的同時(shí)也提供給其他客戶自己所擁有的片斷。比如,C2可以同時(shí)從種子S與C1、C3、C5等處下載文件片斷,這樣各個(gè)客戶端共同合作,分別貢獻(xiàn)自己的上傳帶寬,幫助C2快速下載文件。如果網(wǎng)絡(luò)上的下載者不只這幾個(gè),而是數(shù)以萬(wàn)計(jì),那么C2的下載速度在理論上就可以達(dá)到極限。因此,下載者之間相互提供文件片段,下載者越多,片段源就越多,下載速度也越快,同時(shí)也減輕了資源提供者S的壓力。
BitTorrent對(duì)于服務(wù)器的好處是很大的。在C/S模式中,只有等所有的下載者都完成了下載,服務(wù)器才能下線,帶寬的消耗也是單方面的(只消耗服務(wù)器的上傳帶寬),往往會(huì)造成服務(wù)器端擁塞。而B(niǎo)itTorrent不同,當(dāng)網(wǎng)絡(luò)上出現(xiàn)另一個(gè)下載了完整文件的用戶,只要不退出BT環(huán)境,就產(chǎn)生了一個(gè)新種子,原來(lái)的種子就可以下線了。一個(gè)完整的BitTorrent文件分發(fā)系統(tǒng)是這樣的:
1)如圖2,BitTorrent系統(tǒng)由以下成員組成:
A.一個(gè)普通的Web服務(wù)器,如圖2中的S;
B.一個(gè)跟蹤服務(wù)器(Tracker),如圖2中的T;
C.一個(gè)發(fā)布者節(jié)點(diǎn),如圖2中的C;
D.終端客戶群,如圖2中的P1、P2等。
理想的情況是多個(gè)終端用戶在同時(shí)下載同一個(gè)文件。
2)要讓系統(tǒng)正常運(yùn)轉(zhuǎn),發(fā)布者節(jié)點(diǎn)需要執(zhí)行以下步驟:
A.生成一個(gè)種子文件(.torrent文件),運(yùn)行跟蹤服務(wù)器Tracker;
B.發(fā)布這個(gè)種子文件和跟蹤服務(wù)器Tracker的URL到Web服務(wù)器上,并添加一個(gè)到該文件的鏈接;
C.保持擁有完整文件的發(fā)布者(Seed)在線,等待下載。
3)要下載文件,用戶需要執(zhí)行的步驟如下:
A.訪問(wèn).torrent文件所在的Web服務(wù)器,下載.torrent文件;
B.與跟蹤服務(wù)器通信,報(bào)告自身的信息,得到發(fā)布者節(jié)點(diǎn)和隨機(jī)的鄰居節(jié)點(diǎn)信息;自動(dòng)啟動(dòng)BitTorrent文件發(fā)布者節(jié)點(diǎn),選擇文件的保存位置;
C.與發(fā)布者節(jié)點(diǎn)和鄰居節(jié)點(diǎn)通信,下載文件,同時(shí)對(duì)其他下載者(Peers)提供上傳。
D.等待下載完成,下載完成后若不主動(dòng)結(jié)束程序運(yùn)行,則會(huì)成為Seed,繼續(xù)為其他Peers提供上傳。
4)各部分之間的連通性如下:
由上面的描述可知:文件發(fā)布者通過(guò)BitTorrent制作.tor-rent文件,上傳Web服務(wù)器并發(fā)布;其他用戶登錄Web服務(wù)器下載此種子文件,同時(shí)向跟蹤服務(wù)器Tracker發(fā)送自己的Peer_id(節(jié)點(diǎn)標(biāo)志)、ip(節(jié)點(diǎn)地址)和port(開(kāi)發(fā)端口);Tracker通過(guò)HTTP協(xié)議接收用戶信息,并為其返回一個(gè)隨機(jī)的Peers地址列表;Peers周期性的向Tracker登記,以便Tracker了解其進(jìn)度;Peers之間通過(guò)直連方式交換數(shù)據(jù)(連接使用基于TCP的Bit—Torrent對(duì)等協(xié)議)。
因?yàn)橄到y(tǒng)中只有文件發(fā)布者才擁有完整的文件,所以它必須將文件完整地傳輸給網(wǎng)絡(luò)。在下載者很多時(shí),由于短時(shí)間內(nèi)系統(tǒng)已經(jīng)完成了許多下載,之后文件發(fā)布者隨時(shí)可以退出上傳,系統(tǒng)仍然保持運(yùn)行。
3BitTorrent協(xié)議的技術(shù)特點(diǎn)
在傳統(tǒng)的C/S系統(tǒng)中,下載文件的所有開(kāi)銷都在服務(wù)器上。BitTorrent系統(tǒng)中則是完全不同的情況:如果多人同時(shí)下載一個(gè)文件,在Tracker的幫助下,Peers會(huì)相互提供自己擁有的文件片斷,這樣,每個(gè)下載者都會(huì)承擔(dān)部分下載開(kāi)銷。理論上,這種系統(tǒng)可以容納無(wú)限多個(gè)下載者,卻不會(huì)影響速度。
BitTorrent協(xié)議有下面幾個(gè)特點(diǎn):
1)對(duì)等發(fā)布
BitTorrent系統(tǒng)中,Peers之間通過(guò)Tracker服務(wù)器相互發(fā)現(xiàn)并交互來(lái)解決和文件下載相關(guān)的所有邏輯問(wèn)題。
BitTorrent將文件切割為固定大小(如256KB)的片斷,這些片斷都通過(guò)了SHA1算法計(jì)算出它的hash信息,保存在.torrent文件中。在Peers通信時(shí),每個(gè)Peer都必須告訴對(duì)方自己擁有哪些片斷。
否則,Peers先建立連接,然后發(fā)現(xiàn)對(duì)方并沒(méi)有它想要的片斷,或者暫不允許它去下載,再去嘗試其他的連接,不但費(fèi)時(shí)費(fèi)力,而且造成了系統(tǒng)的許多額外開(kāi)銷。
2)流水作業(yè)
為了提高傳輸速率,BitTorrent將每個(gè)文件片斷又進(jìn)一步分為16KB的子片斷,同時(shí),保持幾個(gè)請(qǐng)求(通常為5個(gè),因?yàn)榇藭r(shí)大多數(shù)Peers連接已經(jīng)飽和)被流水地同時(shí)發(fā)送,即每隔一段時(shí)間發(fā)送5個(gè)請(qǐng)求。
3)片斷選擇算法
一個(gè)文件被分割成了多個(gè)片段,為了提高下載性能,選擇片段的下載順序就顯得尤為重要。BitTorrent協(xié)議采用的片斷選擇算法主要包含四個(gè)策略。
(1)嚴(yán)格的優(yōu)先級(jí)
只要某個(gè)片斷的一個(gè)子片斷被請(qǐng)求,該片斷的其余子片斷就被優(yōu)先請(qǐng)求。這樣能夠使下載者盡快地獲得一個(gè)完整的片斷。
(2)最少優(yōu)先
在選擇下一個(gè)片斷時(shí),系統(tǒng)中最少Peers所擁有的那個(gè)片斷優(yōu)先被選擇。使用這種策略確保系統(tǒng)中每個(gè)Peer都能擁有一些其他Peers最希望得到的片斷,這樣,無(wú)論哪個(gè)片段,一旦有Peers需要,就能馬上下載。整個(gè)系統(tǒng)逐漸被優(yōu)化。
(3)隨機(jī)的第一個(gè)片斷
初始下載時(shí),下載者們沒(méi)有片斷可供上傳,最少的片斷只有原始種子擁有,就不適宜用“最少優(yōu)先”策略。因?yàn)檫@種情況下,它一般比多個(gè)Peers所擁有的那些片斷下載速度都要慢。因此,第一個(gè)片斷采用隨機(jī)選擇策略,之后的片段才切換到“最少優(yōu)先”策略。
(4)最后階段模式
在下載文件的最后階段,如果仍然使用最少優(yōu)先策略,連接到擁有片段的Peer速率很慢,就會(huì)嚴(yán)重影響下載速度。因此,系統(tǒng)采用另外一種策略,用戶先對(duì)所有的Peers發(fā)送對(duì)最后片段的子片段請(qǐng)求,一旦有哪些子片斷到了,就向其他Peers發(fā)送cancel消息。運(yùn)用這種策略,文件的最后一個(gè)片段下載的非???。
4)阻塞(choking)算法
BitTorrent系統(tǒng)中的每個(gè)Peer與其他Peers連接下載文件,都會(huì)根據(jù)對(duì)方提供的下載速率給予同等的上傳回報(bào)。為了懲罰自私者,定義了一種算法:對(duì)于合作的用戶提供上傳服務(wù),不合作則阻塞對(duì)方。顯然,這種阻塞是根據(jù)用戶態(tài)度形成的臨時(shí)拒絕上傳的一種策略,阻塞時(shí)連接仍然保持。
阻塞算法對(duì)于提高整個(gè)系統(tǒng)的性能非常必要。理想的阻塞算法會(huì)盡可能地利用一切資源,提供給所有Peers可靠、一致的下載速率,并適當(dāng)懲罰那些只享受下載而不愿上傳的Peers。優(yōu)秀的阻塞算法遵循下面幾個(gè)原則:
1)帕累托有效(Pareto efficient)
帕累托有效也稱“帕累托最優(yōu)”(Pareto optimum),是指資源配置達(dá)到最理想一種狀態(tài),只要重新改變資源配置的方式就必然會(huì)使一部分人的利益受損。BitTorrent的阻塞算法為達(dá)到帕累托有效采取了針?shù)h相對(duì)的方式。
2)保證上傳能力最大
在技術(shù)上,BitTorrent系統(tǒng)中的每個(gè)下載者始終與固定數(shù)量(一般是4個(gè))的Peers保持連接(unchoked為1)。這種機(jī)制使得TCP的擁塞控制能夠盡可能地保證整個(gè)系統(tǒng)上傳能力始終最大(即上傳容量達(dá)到飽和狀態(tài))。
那么問(wèn)題就是應(yīng)該與哪些Peers保持unchoked?目前的實(shí)現(xiàn)方法是每20秒一個(gè)輪詢:BitTorrent每隔10秒計(jì)算一次哪些是需要被阻塞的Peers,然后保持這種狀態(tài)直到再次計(jì)算。這10秒鐘足夠使TCP調(diào)整它的傳輸性能,獲得最大的上傳能力。
3)樂(lè)觀疏通(optimistic unchoking)
如果僅僅為提供以下載速率為標(biāo)準(zhǔn)向Peers提供上載,就沒(méi)法發(fā)現(xiàn)更好的連接。為此,每個(gè)下載者都擁有一個(gè)被稱為樂(lè)觀疏通(optimistic unchoking)的連接,這個(gè)連接的特點(diǎn)是始終保持?jǐn)?shù)據(jù)交互狀態(tài)。系統(tǒng)每30秒重新進(jìn)行一次計(jì)算,決定哪個(gè)連接是“optimistic unchoking”。
4)反對(duì)歧視
當(dāng)一個(gè)下載者被與它連接的所有Peers阻塞時(shí),它會(huì)保持一個(gè)極其低的下載速率,直到通過(guò)optimistic unchoking找到更好Peers。為了減少這種情況,如果一段時(shí)間后,下載者從某個(gè)連接節(jié)點(diǎn)處一個(gè)片斷也沒(méi)有得到,那么它就認(rèn)為自己被對(duì)方“歧視”了,此時(shí)除非對(duì)方是optimistic unchoking,否則不再為對(duì)方提供上傳服務(wù),
5)僅僅上傳
當(dāng)下載者完成下載后,自己也變?yōu)榉N子節(jié)點(diǎn),就無(wú)法再通過(guò)下載速率來(lái)決定提供上傳的Peers了。為了最大程度地利用上傳帶寬,該節(jié)點(diǎn)優(yōu)先選擇能從它這里得到最高的上傳速率的Peers和那些此刻無(wú)人提供上傳的Peers。
從前面的分析可知,為了保證文件的快速傳輸,BT協(xié)議采取了對(duì)等發(fā)布、流水作業(yè)、片段選擇算法和阻塞算法等技術(shù)。但這些技術(shù)是針對(duì)快速傳輸普通文件設(shè)計(jì)的,依據(jù)它的片斷選擇算法策略,所下載的文件片斷沒(méi)有順序,分布及其分散,而且除非下載完整個(gè)文件,用戶是沒(méi)法使用的。因此,利用BitTor-rent協(xié)議暫時(shí)無(wú)法滿足追求文件下載順序的大型文件,這也是以后的一個(gè)研究方向。