基于DHT网络爬虫原理的P2P监听系统研究

2021-11-02 11:48张晓宇
微处理机 2021年5期
关键词:爬虫线程消息

张晓宇

(中国电子科技集团公司第四十七研究所,沈阳110000)

1 引言

互联网的本质在于虚拟、服务、分享与互动。其中信息资源的免费共享又是成就互联网的关键因素,而P2P(Peer-to-Peer,点对点)技术无疑是现今最主要的资源共享方式[1-3]。当前P2P技术已被广泛应用于流媒体传输、即时通信、文件共享等诸多领域[4-7]。但该项技术在实际使用中会占用大量网络资源,同时由于其去中心化及点对点传输的特点,使得P2P网络管控很难有效充分、高效地开展。监控P2P成为信息化管理者一项重要工作。在此,利用DHT网络爬虫工具,提出一款改进的P2P监听系统设计方案,进一步提升P2P技术的应用潜力。

2 DHT网络爬虫原理

网络爬虫是一种能自动在万维网上的庞杂资源里定向抓取目标的网页下载程序,是各大搜索引擎的重要组成部分,其效率高低直接决定一个搜索引擎的优劣[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”。

3 P2P监听模块的实现

当监听模块进入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上传,并接收存储种子文件的函数即可。

4 性能测试

性能测试的目标为及时、准确地发觉正在进行P2P下载的目标用户以便加以管理。如何尽早发现信息是此测试的关键,而DHT爬虫的线程数量在其中起到关键性作用。

由于此测试在同一时间段内实验条件是相同的,因此不需要专门搭建特定实验环境。在不同时间段,通过改变线程数量进行测试,分别获取几组效率数据,对其取平均值(保留一位小数)。测试得到的结果数据如表1所示。

表1 不同线程数分时段InfoHash收集效率情况测试

为更加直观分析表中数据,将测试结果绘制成折线图,如图1所示。通过观察折线图可知,当线程数量为32条到64条时,已经能够及时发现目标用户的请求信息;而当线程数量超过64条时,不但不能再进一步提高爬虫反应速度,反而会由于运算负担较大而降低反应速度。因此,最终将DHT爬虫的线程数量定为64条。

图1 测试结果折线图

此外,在测试结果中还可发现,中午12点到下午1点时间段的P2P下载用户明显少于网民上网的“黄金”时间——22点到23点,以及常见的开始挂机下载的时间——凌晨1点到2点的数量;而凌晨时间段的爬虫效率基本上是随着线程数量的增加沿正比例增长的,另外可见上网“黄金”时间的爬虫效率呈现很不稳定的特征。其原因据分析是因为凌晨时间发送各种交互请求的网络用户相比“黄金”时间要少,网络环境较好,所以DHT爬虫在进行资源信息获取时也会相应地更少受到影响。因此这一类数据应该以凌晨时间段的结果为准。

5 结束语

基于DHT网络爬虫技术原理所提出并设计的P2P监听系统,其主要功能是及时发现网络中的P2P用户并加以管理。利用多线程DHT爬虫收集InfoHash信息,对P2P网络及资源进行分析,在此系统下,能够尽快发现P2P用户,及时采取措施,可成为信息化人员管控P2P网络的一种有效手段。通过实际测试,验证了该监听系统方案的实际可行性,结果符合理论预期。

猜你喜欢
爬虫线程消息
利用网络爬虫技术验证房地产灰犀牛之说
基于C#线程实验探究
基于Python的网络爬虫和反爬虫技术研究
一张图看5G消息
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
大数据背景下校园舆情的爬虫应用研究
大数据环境下基于python的网络爬虫技术
消息
消息