張曉宇
(中國電子科技集團公司第四十七研究所,沈陽110000)
互聯(lián)網(wǎng)的本質(zhì)在于虛擬、服務、分享與互動。其中信息資源的免費共享又是成就互聯(lián)網(wǎng)的關(guān)鍵因素,而P2P(Peer-to-Peer,點對點)技術(shù)無疑是現(xiàn)今最主要的資源共享方式[1-3]。當前P2P技術(shù)已被廣泛應用于流媒體傳輸、即時通信、文件共享等諸多領(lǐng)域[4-7]。但該項技術(shù)在實際使用中會占用大量網(wǎng)絡資源,同時由于其去中心化及點對點傳輸?shù)奶攸c,使得P2P網(wǎng)絡管控很難有效充分、高效地開展。監(jiān)控P2P成為信息化管理者一項重要工作。在此,利用DHT網(wǎng)絡爬蟲工具,提出一款改進的P2P監(jiān)聽系統(tǒng)設(shè)計方案,進一步提升P2P技術(shù)的應用潛力。
網(wǎng)絡爬蟲是一種能自動在萬維網(wǎng)上的龐雜資源里定向抓取目標的網(wǎng)頁下載程序,是各大搜索引擎的重要組成部分,其效率高低直接決定一個搜索引擎的優(yōu)劣[8-9]。
DHT(Distributed Hash Table,分布式哈希表)網(wǎng)絡爬蟲是一種基于DHT網(wǎng)絡交互漏洞來獲取資源對應Key的爬蟲工具[10]。以Kad網(wǎng)絡實現(xiàn)為例,當DHT網(wǎng)絡爬蟲加入到Kad網(wǎng)絡中時,會收到許多消息,其中的ping與find_node消息攜帶了網(wǎng)絡拓撲信息[11-12],而get_peer和announce_peer消息中都有攜帶發(fā)送方正在搜索資源對應的Key。兩者的不同之處在于,發(fā)送announce_peer消息的節(jié)點已經(jīng)收到了get_peer應答中的peer-list,在其開始進行P2P下載時,會向本地路由表中較近節(jié)點(或所有節(jié)點)發(fā)送announce_peer消息,將自己加入其他節(jié)點的peerlist中;而發(fā)送get_peer消息的節(jié)點則有可能搜索的是“死種”。利用上述功能特點,即可使用DHT網(wǎng)絡爬蟲進行DHT網(wǎng)絡資源的分布范圍分析、資源熱度分析與資源健康度分析。所以DHT網(wǎng)絡爬蟲技術(shù)不僅僅用于“種子搜索神器”,還可作為一種有效的P2P網(wǎng)絡狀態(tài)監(jiān)聽軟件。
DHT網(wǎng)絡爬蟲的實現(xiàn)方式較多,小到個人實現(xiàn)的“H31DHT”、“DHT Crawler”,大到日本的“Rapid and Massive Monitoring of DHT”。
DHT網(wǎng)絡爬蟲實現(xiàn)方法與普通P2P下載工具客戶端基本相同,只不過它僅對信息交互進行應答,而不提供資源交互服務。其具體實現(xiàn)過程一般為:首先,接收其他節(jié)點發(fā)來的announce_peer(僅收集可被下載的資源時),提取其中的Key字段;隨后,通過MagNet或者是通過提供InfoHash-to-Torrent轉(zhuǎn)換的網(wǎng)站來獲取這個資源的種子文件;最后,提取種子文件中的資源信息,累計這些信息用于統(tǒng)計分析或構(gòu)建種子文件的搜索引擎。
上述過程中,爬蟲功能是依賴以下兩條重要設(shè)定而實現(xiàn)的:
①一個資源的種子文件對應一個InfoHash值,獲得了InfoHash,便相當于獲得了種子文件;
②announce_peer會發(fā)送給所有回應下載用戶的臨近節(jié)點(甚至本地路由表中的所有節(jié)點)。
以當前流行的下載方式MagNet,即磁力鏈接,來作為示例。假設(shè)某一資源的磁力鏈接為:
magnet:?xt=urn:btih:C119E2D25658102625C8B1FA325863 3C7B4225BA&dn=Microsoft%20Office%20Professional%20Plus%202013%20v15.0.4517.1003
通過觀察可以得知,“&dn=”之后內(nèi)容為待獲取資源的完整文件名,是可選字段,因此可以忽略。整個連接最重要的便是“btih:”之后以40個16進制數(shù)表示的20個字節(jié)即160位(也有其他編碼形式,最終所指的內(nèi)容相同)?!癰tih”就是BT-InfoHash的縮寫,是對種子文件中info字段進行SHA1計算得出的。此info字段是資源所有的特征值,理論上不會與其他資源相同。所以每個種子文件對應一個InfoHash,這個InfoHash即是“Key”。
當監(jiān)聽模塊進入DHT網(wǎng)絡后會收到大量Kademlia請求消息,這些消息有的是由內(nèi)網(wǎng)用戶所發(fā)出,也有的來自相應的外部網(wǎng)絡,可根據(jù)子網(wǎng)劃分的知識通過地址很容易將內(nèi)網(wǎng)用戶的消息區(qū)分出來。在一般情景下DHT爬蟲只會收集announce_peer來積累活躍的資源信息。然而在本設(shè)計中,P2P模塊的目的在于發(fā)現(xiàn)目標用戶的下載請求。get_peer消息會在announce_peer之前被調(diào)用,所以此處的收集目標主要是get_peer消息,此外,表明目標用戶已經(jīng)開始下載的announce_peer消息必然也要收集。
路由表樹形圖中每個子樹(k-bucket)都至少要有一個節(jié)點,每個子樹所表示的節(jié)點ID范圍是與自身節(jié)點ID距離在2i到2i+1之間(0≤i≤160),而多數(shù)網(wǎng)絡應用中announce_peer消息會發(fā)給路由表中的所有節(jié)點,但通常僅是一些距離自己較近的節(jié)點(前幾個k-bucket)。
一方面,監(jiān)聽模塊為了增大接到請求的可能性,應將自己的信息傳遞給盡可能多的網(wǎng)絡系統(tǒng)節(jié)點,這就需要發(fā)送find_node消息。在一般的實現(xiàn)中,find_node不會完成全網(wǎng)的探測,因為對于資源下載來說,只需要讓其他節(jié)點可以通過多次轉(zhuǎn)發(fā)路由到自己即可。然而DHT爬蟲需要網(wǎng)絡系統(tǒng)中的每個節(jié)點都可以向自己發(fā)送請求消息,所以在DHT爬蟲的實現(xiàn)中要周期性地使用find_node對整個網(wǎng)絡系統(tǒng)進行“自我介紹”。
其中k為 模擬節(jié)點編號,0≤k<n;random(time)為以時間為種子的隨機函數(shù);%表示求余運算。
為了將自身表示為多個模擬節(jié)點,可以調(diào)用多線程來實現(xiàn),同時也大幅度提高處理效率。
DHT網(wǎng)絡爬蟲實質(zhì)就是一個遵守Kademlia協(xié)議但不對外服務的假節(jié)點實現(xiàn)。在此只需將可獲得源代碼的下載工具的DHT相關(guān)部分略加改動,即可實現(xiàn)DHT網(wǎng)絡爬蟲,例如transmission源代碼中的“dht.c”、“dht.h”和“dht-example.c”三個文件。
DHT爬蟲的目的就在于收集InfoHash,依靠獲得InfoHash來得到資源的描述信息。為了區(qū)分并判斷資源的合法性,必須收集并分析內(nèi)網(wǎng)用戶所請求資源的描述信息。
資源描述信息包含在種子文件中,此處需要做的實際上就是InfoHash向種子文件的轉(zhuǎn)換。種子文件不是通過分析InfoHash得來的,而是一個文件下載的過程??梢酝ㄟ^兩種簡單的方法實現(xiàn)此過程:
其一,MagNet磁力鏈接。想要使用InfoHash構(gòu)建一個磁力鏈接相當簡單,只需要將InfoHash編碼成磁力鏈接的xt字段即可,然后將磁力鏈接交給一個支持磁力下載的網(wǎng)絡應用下載種子即可,構(gòu)建源代碼也可以從transmission源碼里找到。
其二,有許多網(wǎng)站直接提供InfoHash to Torrent轉(zhuǎn)換服務,只需實現(xiàn)一個將InfoHash上傳,并接收存儲種子文件的函數(shù)即可。
性能測試的目標為及時、準確地發(fā)覺正在進行P2P下載的目標用戶以便加以管理。如何盡早發(fā)現(xiàn)信息是此測試的關(guān)鍵,而DHT爬蟲的線程數(shù)量在其中起到關(guān)鍵性作用。
由于此測試在同一時間段內(nèi)實驗條件是相同的,因此不需要專門搭建特定實驗環(huán)境。在不同時間段,通過改變線程數(shù)量進行測試,分別獲取幾組效率數(shù)據(jù),對其取平均值(保留一位小數(shù))。測試得到的結(jié)果數(shù)據(jù)如表1所示。
表1 不同線程數(shù)分時段InfoHash收集效率情況測試
為更加直觀分析表中數(shù)據(jù),將測試結(jié)果繪制成折線圖,如圖1所示。通過觀察折線圖可知,當線程數(shù)量為32條到64條時,已經(jīng)能夠及時發(fā)現(xiàn)目標用戶的請求信息;而當線程數(shù)量超過64條時,不但不能再進一步提高爬蟲反應速度,反而會由于運算負擔較大而降低反應速度。因此,最終將DHT爬蟲的線程數(shù)量定為64條。
圖1 測試結(jié)果折線圖
此外,在測試結(jié)果中還可發(fā)現(xiàn),中午12點到下午1點時間段的P2P下載用戶明顯少于網(wǎng)民上網(wǎng)的“黃金”時間——22點到23點,以及常見的開始掛機下載的時間——凌晨1點到2點的數(shù)量;而凌晨時間段的爬蟲效率基本上是隨著線程數(shù)量的增加沿正比例增長的,另外可見上網(wǎng)“黃金”時間的爬蟲效率呈現(xiàn)很不穩(wěn)定的特征。其原因據(jù)分析是因為凌晨時間發(fā)送各種交互請求的網(wǎng)絡用戶相比“黃金”時間要少,網(wǎng)絡環(huán)境較好,所以DHT爬蟲在進行資源信息獲取時也會相應地更少受到影響。因此這一類數(shù)據(jù)應該以凌晨時間段的結(jié)果為準。
基于DHT網(wǎng)絡爬蟲技術(shù)原理所提出并設(shè)計的P2P監(jiān)聽系統(tǒng),其主要功能是及時發(fā)現(xiàn)網(wǎng)絡中的P2P用戶并加以管理。利用多線程DHT爬蟲收集InfoHash信息,對P2P網(wǎng)絡及資源進行分析,在此系統(tǒng)下,能夠盡快發(fā)現(xiàn)P2P用戶,及時采取措施,可成為信息化人員管控P2P網(wǎng)絡的一種有效手段。通過實際測試,驗證了該監(jiān)聽系統(tǒng)方案的實際可行性,結(jié)果符合理論預期。