張曉宇
(中國電子科技集團公司第四十七研究所,沈陽110000)
互聯網的本質在于虛擬、服務、分享與互動。其中信息資源的免費共享又是成就互聯網的關鍵因素,而P2P(Peer-to-Peer,點對點)技術無疑是現今最主要的資源共享方式[1-3]。當前P2P技術已被廣泛應用于流媒體傳輸、即時通信、文件共享等諸多領域[4-7]。但該項技術在實際使用中會占用大量網絡資源,同時由于其去中心化及點對點傳輸的特點,使得P2P網絡管控很難有效充分、高效地開展。監控P2P成為信息化管理者一項重要工作。在此,利用DHT網絡爬蟲工具,提出一款改進的P2P監聽系統設計方案,進一步提升P2P技術的應用潛力。
網絡爬蟲是一種能自動在萬維網上的龐雜資源里定向抓取目標的網頁下載程序,是各大搜索引擎的重要組成部分,其效率高低直接決定一個搜索引擎的優劣[8-9]。
DHT(Distributed Hash Table,分布式哈希表)網絡爬蟲是一種基于DHT網絡交互漏洞來獲取資源對應Key的爬蟲工具[10]。以Kad網絡實現為例,當DHT網絡爬蟲加入到Kad網絡中時,會收到許多消息,其中的ping與find_node消息攜帶了網絡拓撲信息[11-12],而get_peer和announce_peer消息中都有攜帶發送方正在搜索資源對應的Key。兩者的不同之處在于,發送announce_peer消息的節點已經收到了get_peer應答中的peer-list,在其開始進行P2P下載時,會向本地路由表中較近節點(或所有節點)發送announce_peer消息,將自己加入其他節點的peerlist中;而發送get_peer消息的節點則有可能搜索的是“死種”。利用上述功能特點,即可使用DHT網絡爬蟲進行DHT網絡資源的分布范圍分析、資源熱度分析與資源健康度分析。所以DHT網絡爬蟲技術不僅僅用于“種子搜索神器”,還可作為一種有效的P2P網絡狀態監聽軟件。
DHT網絡爬蟲的實現方式較多,小到個人實現的“H31DHT”、“DHT Crawler”,大到日本的“Rapid and Massive Monitoring of DHT”。
DHT網絡爬蟲實現方法與普通P2P下載工具客戶端基本相同,只不過它僅對信息交互進行應答,而不提供資源交互服務。其具體實現過程一般為:首先,接收其他節點發來的announce_peer(僅收集可被下載的資源時),提取其中的Key字段;隨后,通過MagNet或者是通過提供InfoHash-to-Torrent轉換的網站來獲取這個資源的種子文件;最后,提取種子文件中的資源信息,累計這些信息用于統計分析或構建種子文件的搜索引擎。
上述過程中,爬蟲功能是依賴以下兩條重要設定而實現的:
①一個資源的種子文件對應一個InfoHash值,獲得了InfoHash,便相當于獲得了種子文件;
②announce_peer會發送給所有回應下載用戶的臨近節點(甚至本地路由表中的所有節點)。
以當前流行的下載方式MagNet,即磁力鏈接,來作為示例。假設某一資源的磁力鏈接為:
magnet:?xt=urn:btih:C119E2D25658102625C8B1FA325863 3C7B4225BA&dn=Microsoft%20Office%20Professional%20Plus%202013%20v15.0.4517.1003
通過觀察可以得知,“&dn=”之后內容為待獲取資源的完整文件名,是可選字段,因此可以忽略。整個連接最重要的便是“btih:”之后以40個16進制數表示的20個字節即160位(也有其他編碼形式,最終所指的內容相同)。“btih”就是BT-InfoHash的縮寫,是對種子文件中info字段進行SHA1計算得出的。此info字段是資源所有的特征值,理論上不會與其他資源相同。所以每個種子文件對應一個InfoHash,這個InfoHash即是“Key”。
當監聽模塊進入DHT網絡后會收到大量Kademlia請求消息,這些消息有的是由內網用戶所發出,也有的來自相應的外部網絡,可根據子網劃分的知識通過地址很容易將內網用戶的消息區分出來。在一般情景下DHT爬蟲只會收集announce_peer來積累活躍的資源信息。然而在本設計中,P2P模塊的目的在于發現目標用戶的下載請求。get_peer消息會在announce_peer之前被調用,所以此處的收集目標主要是get_peer消息,此外,表明目標用戶已經開始下載的announce_peer消息必然也要收集。
路由表樹形圖中每個子樹(k-bucket)都至少要有一個節點,每個子樹所表示的節點ID范圍是與自身節點ID距離在2i到2i+1之間(0≤i≤160),而多數網絡應用中announce_peer消息會發給路由表中的所有節點,但通常僅是一些距離自己較近的節點(前幾個k-bucket)。
一方面,監聽模塊為了增大接到請求的可能性,應將自己的信息傳遞給盡可能多的網絡系統節點,這就需要發送find_node消息。在一般的實現中,find_node不會完成全網的探測,因為對于資源下載來說,只需要讓其他節點可以通過多次轉發路由到自己即可。然而DHT爬蟲需要網絡系統中的每個節點都可以向自己發送請求消息,所以在DHT爬蟲的實現中要周期性地使用find_node對整個網絡系統進行“自我介紹”。

其中k為 模擬節點編號,0≤k<n;random(time)為以時間為種子的隨機函數;%表示求余運算。
為了將自身表示為多個模擬節點,可以調用多線程來實現,同時也大幅度提高處理效率。
DHT網絡爬蟲實質就是一個遵守Kademlia協議但不對外服務的假節點實現。在此只需將可獲得源代碼的下載工具的DHT相關部分略加改動,即可實現DHT網絡爬蟲,例如transmission源代碼中的“dht.c”、“dht.h”和“dht-example.c”三個文件。
DHT爬蟲的目的就在于收集InfoHash,依靠獲得InfoHash來得到資源的描述信息。為了區分并判斷資源的合法性,必須收集并分析內網用戶所請求資源的描述信息。
資源描述信息包含在種子文件中,此處需要做的實際上就是InfoHash向種子文件的轉換。種子文件不是通過分析InfoHash得來的,而是一個文件下載的過程。可以通過兩種簡單的方法實現此過程:
其一,MagNet磁力鏈接。想要使用InfoHash構建一個磁力鏈接相當簡單,只需要將InfoHash編碼成磁力鏈接的xt字段即可,然后將磁力鏈接交給一個支持磁力下載的網絡應用下載種子即可,構建源代碼也可以從transmission源碼里找到。
其二,有許多網站直接提供InfoHash to Torrent轉換服務,只需實現一個將InfoHash上傳,并接收存儲種子文件的函數即可。
性能測試的目標為及時、準確地發覺正在進行P2P下載的目標用戶以便加以管理。如何盡早發現信息是此測試的關鍵,而DHT爬蟲的線程數量在其中起到關鍵性作用。
由于此測試在同一時間段內實驗條件是相同的,因此不需要專門搭建特定實驗環境。在不同時間段,通過改變線程數量進行測試,分別獲取幾組效率數據,對其取平均值(保留一位小數)。測試得到的結果數據如表1所示。

表1 不同線程數分時段InfoHash收集效率情況測試
為更加直觀分析表中數據,將測試結果繪制成折線圖,如圖1所示。通過觀察折線圖可知,當線程數量為32條到64條時,已經能夠及時發現目標用戶的請求信息;而當線程數量超過64條時,不但不能再進一步提高爬蟲反應速度,反而會由于運算負擔較大而降低反應速度。因此,最終將DHT爬蟲的線程數量定為64條。

圖1 測試結果折線圖
此外,在測試結果中還可發現,中午12點到下午1點時間段的P2P下載用戶明顯少于網民上網的“黃金”時間——22點到23點,以及常見的開始掛機下載的時間——凌晨1點到2點的數量;而凌晨時間段的爬蟲效率基本上是隨著線程數量的增加沿正比例增長的,另外可見上網“黃金”時間的爬蟲效率呈現很不穩定的特征。其原因據分析是因為凌晨時間發送各種交互請求的網絡用戶相比“黃金”時間要少,網絡環境較好,所以DHT爬蟲在進行資源信息獲取時也會相應地更少受到影響。因此這一類數據應該以凌晨時間段的結果為準。
基于DHT網絡爬蟲技術原理所提出并設計的P2P監聽系統,其主要功能是及時發現網絡中的P2P用戶并加以管理。利用多線程DHT爬蟲收集InfoHash信息,對P2P網絡及資源進行分析,在此系統下,能夠盡快發現P2P用戶,及時采取措施,可成為信息化人員管控P2P網絡的一種有效手段。通過實際測試,驗證了該監聽系統方案的實際可行性,結果符合理論預期。