高聰
五邑大學 廣東 529020
P2P(Peer-to-Peer)是一種點到點的對等網絡架構。在這種體系結構中的每臺計算機都可以同時充當客戶機和服務器兩種角色。P2P技術除去了集中式服務器,使節點之間可以直接交換資源和服務,由于這種技術可以重構分布式系統,因而被視為當前最有潛力的網絡技術之一,涌現出了諸如Guntella, BitTorrent, BitComet, eMule, PPlive等文件共享系統。
為了使P2P文件共享系統得到更好的下載速度,開發者采取了各種策略。從程序設計者角度采用了多線程編程方法,并支持斷點續傳。在含有文件服務器的基于分區結構的集中式管理模式下,在P2P檢索到資源后,索引服務器會把擁有被請求資源的Peer的列表返回給請求者,此時該請求者便可以開始下載該資源文件。在實際應用中,資源擁有者往往很少,極端情況下僅有一個,此時下載速度就相當慢。一旦客戶開始下載,如果在下載完成之前資源擁有者離開了系統,下載者便不能得到完整的資源,必須來解決這個問題。
線程是進程的一個實體,是被處理器調度和分配的基本單位。線程自己不擁有系統資源,但它可以與同屬一個進程的其他線程共享進程的全部資源。多線程是指程序中包含多個執行流,即在一個程序中可以同時運行多個線程執行不同的任務。也就是說在一定程度上實現了一個進程內部并行運行的效果。
文件下載軟件一般采用多線程下載技術。這是因為網絡的傳輸速率相對于處理器的處理能力來說實在太慢了,如果采用單線程來下載,大量時間會花在等待文件傳輸上。而采用多線程下載在某種程度上實現了并行下載。而不會由于等待文件的傳輸白白浪費了處理器時間。是否具有多線程下載技術,能支持多少個線程同時下載成為了衡量一個下載軟件性能的重要因素。
本測試程序分為服務器和客戶端兩部分,在Windows 下采用MFC中的CAsyncSocket類和CWinThread 編寫。服務器類主要負責監聽Socket等待客戶的連接,每當有新的客戶連接進來請求下載文件的時候就創建新的線程,與其通信傳送文件的相應部分。主要由三個類構成,CListenerSocket,CConnecorSocket, CSocketThead。CListenSocket 負責監聽,等待客戶的連接,在OnAccept 函數中接受客戶的連接并建立新的線程進行通信。CConnectSocket 負責通信,根據客戶請求的文件塊傳送相應的文件。CSocketThread是繼承自CWinThread 的線程類,用來創建一個Windows 的UI線程類。
客戶端的程序則是根據用戶設定的線程數目,建立相應的線程來連接服務器程序,并通過同時下載不同的文件塊部分,共同協作完成整個文件的下載。主要由兩個類構成CConnectSocket、CSocketThread。CConnectSocket 負責通信,根據需要請求相應的文件塊代號傳送給服務器。CSocketThread是繼承自CWinThead的線程類,用來創建一個Windows的UI線程類。
通過利用外網從校園網的服務器下載文件,所得結果如表1所示。

表1 多線程下載表
從表中可以看出,隨著線程數目的增多,下載速度也是相應增大?;旧蟽烧哧P系成正比。正好體現了TCP連接對鏈路使用的公平性。如果使用的線程的數目相對于該鏈路上的總連接數目來說很小,所呈現的正是我們的實驗所呈現的結果,即使用N個線程創建N個連接,將得到約為單線程下載時候N倍的速度。
經過上面的分析可以看出,線程數目越多的下載速度越快,但是考慮到在P2P系統中一般都限制了Peer提供服務時的線程數,另外線程的切換也要耗費 CPU時間,更為重要的是由于P2P系統的隨意性,獨一無二的資源提供者的離開,會給下載者造成不能得到完整資源的后果,由此提出復制資源策略。
該策略的思想是在P2P網絡模型中,當某個資源的提供者很少的時候,該資源提供者自動選擇系統中距離其很近的空閑peer,并把它所共享的資源或者資源的相應的塊傳送到它選的空閑Peer上,下載者同時從它和它所選的Peer 上下載。由此增多了可用于下載的線程,并把它們分布在不同的Peer上,減少了線程的切換所耗費的時間,提高了下載的速度,大大減少了下載者不能下載完整資源的可能,圖1展示了一個基于本地子網的實現過程。

圖1 資源復制過程
首先資源下載者 Peer C通過 Internet 連接資源提供者Peer S,請求相應的文件,并告知資源提供者需要提供復制資源服務,接著 Peer S通過在本地子網內發送一個廣播請求,獲得本地連接相對空閑的 Peer列表,并傳送 Peer C所請求的文件到這些空閑的Peer 上,在本圖中為A,G,E。然后S發送擁有該資源的Peer列表給C,最后由C連接 A,G,E,以及資源提供者S一起完成文件的傳送。下載結束時由C告知這些參與節點下載完畢的信息,所選的空閑節點刪除相應的復制資源。
當資源提供者不處于一個子網時,例如它是一個獨立的站點,此時它的實現過程就不是發送一個廣播請求,而是直接向服務器發送一個獲取臨近peer列表的請求。當獲得列表后,該提供者向列表中的節點發送連接空閑查詢,獲取空閑peer列表,并將資源整體或者分塊傳送到相應的節點上,并通知請求者,從自己和它選定的節點上下載完整的資源文件。
該測試程序依然分為服務器和客戶端,采用 MFC中的CAsyncSocket類和CWinThread類編寫。服務器端基本沒變化,只是在客戶端里面建立線程連接不同的服務器,并行獲取不同的文件塊,以完成整個文件的下載。
在實際應用中,資源共享者應根據周圍 Peer的實際情況,選擇較為空閑的Peer,并傳送資源給這些空閑Peer,然后把這些Peer的信息發送給下載者,下載者便可以與資源擁有者,以及它選定的peer進行連接下載資源。下載完成后,選定的 Peer 刪除掉資源擁有者傳送的文件。由于大文件會占用很多的存儲空間,所以也可采取將文件分塊地傳送到所選擇的空閑Peer上,但是要保證這些文件塊可以組成完整的文件,以防資源擁有者的退出對下載者造成的影響。
為了便于與多線程的相比較,特意把同一文件的下載結果放在表2中。

表2 資源復制下載信息表
從表2可以看到,相對于多線程下載,進行資源復制后下載速度有了大大提高。這里首先是因為在一般的P2P系統中對Peer的服務端的連接數目的限制,即限制了客戶在單個Peer上可以開的線程數目,而在復制資源策略中,由于增加了可以連接的Peer的數目,所以相當于無形地增加了客戶可以下載線程的數目。下載速度也相應于所提供服務的 Peer的數目成正比。當下載線程數目增大到一定數量的時候,在繼續增加線程的數量并不能提高下載速度。這是由于在該網絡中,減少線程切換的時間與網絡傳送的時間相比來說實在是太小了。如果在選定的網絡環境中,例如局域網環境中,當線程切換所花費的時間與網絡傳送所花費的時間不再是可忽略時,該策略必將大大提高下載速度。
資源復制策略很好的解決了在P2P應用中由于資源提供者過少,下載速度慢的問題。由于多線程的頻繁切換會占用一定的時間,以及一般的P2P系統中對于P eer端的用于提供服務的線程數目的限制,因而下載速度并不會很理想,而該策略等于在某種程度上加多了下載線程的數目,并減少了頻繁的線程切換,因而大大改善了下載速度。
本文提出了一種P2P系統中復制資源策略,解決了因為P2P系統中資源提供者太少而引起的下載速度過慢的問題,以及資源提供者在下載者完成下載之前就離開系統,造成下載者不能得到完整資源文件的問題。
[1]張宇翔,楊冬.P2P網絡中 Churn 問題研究[J].軟件學報.2009.
[2]楊彬.分布式P2P網絡中基于索引的資源發現研究[J].網絡與通信.2009.
[3]熊偉,謝冬青.一種非DHT查找方式的結構化文件共享模型[J].計算機研究與發展.2009.
[4]任小金,古志明.RR-Chrod:一個基于Chord的低開銷快查詢P2P系統[J].軟件學報.2008.