深入剖析eMule 【for_wind】
分布式系统课程的读书笔记,关于eMule的整理。不算透彻,欢迎指正,提供相关的资料链接。//for_wind
前言:
针对P2P分布式系统这个大课题,本人将研究重点锁定到eMule这个经典的点对点文件分享系统上,并通过查阅图书馆书籍、搜索图书馆数据库资料、查阅有关期刊和查找网页上相关的资料四种方式,寻找到相关的信息资料,从2012年11月到2012年12月根据所收集的资料完成如下文献综述。本文介绍了eMule系统的背景和体系类别,详细阐述了它所支持的两种协议(eMule协议和Kademlia协议),此外还探讨了eMule系统存在的安全问题,以便为下一步的理论研究和发展应用提供参考。
关键字:
eMule Kademlia
一、引言
随着宽带、计算机的普及,大容量文件(高清的音视频资料)的交换越来越频繁,传统C/S架构下的文件交换,服务器的计算能力、宽度往往成为瓶颈。70年代中期,源于局域网的文件共享P2P[1]技术开始流行。它是一种网络模型,在这种网络中各节点是对等的,具有相同的责任和能力并协同完成任务。对等点之间通过直接互连共享信息资源、处理器资源、存储资源和高速缓存资源等,无需依赖集中式服务器资源就可完成。P2P引导网络模式从“中心化”走向“边缘化”,所有网络中的节点都具有服务器和客户双重特征,这使得人们以更加方便快捷的方式参加到共享网络中去。[2]
本文将分析一个实际的广泛应用P2P系统实例——eMule[3]系统,来探讨P2P系统体系结构、网络协议和安全性等实现细节。
二、eMule系统
eMule诞生于2002年5月13日,是一个非盈利免费开源软件,作者是网名为Merkur的德国人亨德里克·布雷特克鲁兹(Hendrik Breitkreuz)[4]。今年正好是它十周年诞辰。
eMule建立在点对点(peer to peer)技术上,是一个基于eDonkey协议的文件共享软件[5]。它是eD2k网络(edonkey2000 network)中无与匹敌的客户端。电驴已死,电骡(eMule)依旧。2004年上半年, eMule引入了Kademlia网络。目前它主要支持两种网络协议:中央集中式网络ed2k协议和结构化网络Kad。
下面,本文将阐述eMule协议(扩展的eD2K网络)和Kademlia协议(结构化网络)。
三、eMule网络协议
eMule网络是一种集中式网络,相对容易理解。eMule网络由上百个eMule服务器和上百万个eMule客户端共同组成。eMule客户端通过连接eMule服务器获得网络服务,该连接在运行过程中一直打开。eMule服务器执行集中式的索引服务(类似Napster),不和其他服务器进行通信。[5~7]
eMule服务器使用一个内容数据库,存储客户端和文件的信息。eMule服务器并不存储实际的文件,仅仅提供文件位置信息的集中索引。此外,eMule服务器还提供穿越防火墙的客户端和无法连接到输入连接的客户端之间的桥梁作用。eMule协议通过使用UDP来削弱eMule客户端对eMule服务器和其他eMule客户端的依赖性。eMule的系统示意图 [5]如下。
四、Kademlia网络协议
下面将重点解释Kad网络的特性、重要概念、路由查询和节点加入离开过程。
(一) Kad网络的特性
(二) 重要概念
1. 节点状态
Kad协议确保每个节点知道其各个子树的至少一个节点,只要这些子树非空。在这个前提下,每个节点都可以通过ID值来找到任何一个节点。这个路由的过程是通过所谓的XOR(异或)距离获得的。
图3就演示了节点0011如何通过连续查询来找到节点1110的。节点0011通过在逐步底层的子树间不断学习并查询最佳节点,获得了越来越接近的节点,最终收敛到目标节点上。
2.节点间距离
Kad网络中每个节点都有一个160bit的ID值作为标识符,key也是一个160bit的标识符,每个加入Kad网络的计算机都会在160bit的key空间被分配一个节点ID值(可以认为是随机产生的),<Key,value>对的数据就放在ID值“最”接近key值的节点上。
判断两个节点x,y的距离远近是基于数学上的异或的二进制运算。异或操作具有单向性。单向性确保同一个key值的所有查询都会逐步收敛到同一个路径上,而不管查询的起始节点位置如何。因此,可以利用缓存来减轻存放热门key值节点的压力,同时加快查询响应速度。
3. K桶
具体来说,对于对每一个0≦i≦160,每个节点都保存有一些和自己距离范围在区间[ 2i,2i+1 ]内的一些节点信息,这些信息由一些(IP address,UDPport,Node ID)数据列表构成(Kad 网络是靠UDP 协议交换信息的)。每个K 桶内部信息存放位置是根据时间顺序排列,最近( least-recently)看到的放在头部,最后(most-recently)看到的放在尾部。每个桶都有不超过k 个的数据项。(k 是为平衡系统性能和网络负载而设置的一个常数,但必须是偶数,比如k=20)下图显示了一个2-桶。
由于每个K桶覆盖距离的范围呈指数关系增长,这样就形成了离自己近的节点的信息多,离自己远的节点信息少的现象,从而保证路由查询的过程是收敛的。对于一个有N个节点的Kad网络,最多只需要进过logN步查询,就可以准确定位到目标节点。
K桶的更新策略是在线时间长的节点具有较高的可能性继续保留在K桶列表中。
4. Kadmlia协议操作类型
Kademlia 协议包括四种远程RPC 操作。
操作 |
作用 |
PING操作 |
探测一个节点,并判断是否在线 |
STORE(Key, Value)操作 |
通知一个节点存储一个<key,value>对,以便以后查询需要。 |
FIND_NODE操作 |
返回它所知道的更接近目标ID的K 个节点的(IP address,UDP port,Node ID)信息。 |
FIND_VALUE操作 |
只需要返回一个节点的(IPaddress,UDP port,Node ID)信息。如果收到同一个key的STORE 操作,则会直接返回存储的value 值。 |
(三) 路由查询机制
假如节点x要查找ID值为t 的节点(这里α 也是为系统优化而设立的一个参数,就像K一样):
1) 计算到t 的距离:d(x,y) = x⊕y
2) 从 x 的第[log d]个K 桶中取出α 个节点的信息,同时进行FIND_NODE操作。如果这个K 桶中的信息少于α 个,则从附近多个桶中选择距离最接近d 的总共α个节点。
3) 对接受到查询操作的每个节点,如果发现自己就是t,则回答自己是最接近t 的;否则测量自己和t 的距离,并从自己对应的K 桶中选择α 个节点的信息给x。
4) X 对新接受到的每个节点都再次执行FIND_NODE 操作,此过程不断重复执行,直到每一个分支都有节点响应自己是最接近t 的。
由于每次查询都能从更接近t的K桶内获取信息,这样的机制保证了每一次递归操作都能够至少获得距离减半的效果(或者距离减少1bit),从而保证整个查询过程的收敛速度为O(logN),这里的N为网络全部节点的数目。
(四) 节点加入和离开
在KAD网中加入节点 (u),主要的步骤如下,也可以参看下图:
1) 和一个已经存在于KAD网络的节点(W)取得联系
2) u 首先把w 插入自己适当的K桶中
3) 对自己的节点ID 执行一次FIND_NODE操作并更新自己的K桶内容
节点离开Kad网络不需要发布任何信息,Kademlia协议的目标之一就是能够弹性工作在。任意节点随时失效的情况下。为此,Kad 要求每个节点必须周期性的发布全部自己存放的<key,value>对数据,并把这些数据缓存在自己的k 个最近邻居处,这样存放在失效节点的数据会很快被更新到其他新节点上。
至此,本文将Kademlia网络协议的重点部分阐述完毕。更多的内容,可以参考文献[8]。值得提醒的是,eMule创立的无服务器分布式网络KAD与文献[8]中还是有所不同的。主要在于key、value和nodeID的计算方法的不同。
五、安全问题
P2P 网络中各节点间的信息传递面临的安全威胁,主要有:身份被假冒,信息被窃取和信息被篡改等。身份认证和授权:P2P节点互不相识 要使交易成功,首先要能确认对方身份的合法性,防止假冒节点和未授权节点的访问。数据保密性:P2P是建立在一个开放的网络环境中,节点间的信息若以明文的方式传输,有可能被非授权的第三方窃取,而导致信息泄漏。数据完整性:数据传输中信息的丢失、重复和乱序等都会导致信息数据不可用。因此,P2P中的信息传输要能做到确保完整性。
可以发现eMule协议和Kad协议中采取了大量措施用于加强安全性能。如eMule的文件校验系统,在eMule网络中共享的文件都要用唯一的Hash ID来标识。eMule对于HashID的使用包含2个方面,它不仅是作为文件的唯一标识,而且在eMule下载文件时,还要使用HashID来校验文件的正确性和完整性。尽管如此,eMule文件校验体系的缺陷就在于MD4散列算法已经不是一种绝对无碰撞的散列算法,而eMule仍然在使用它。
eMule作为一个开源项目,一旦存在安全隐患,很容易被攻击者发现并利用该隐患开发出现相应的攻击手段。例如用户隐私泄露问题,是协议本身存在保密性缺陷,也是现有的P2P网络通病。近年来,有人设计了匿名的P2P网络,通过中间层,或者加密通信,地址伪装等手段,隐藏客户端的信息[10]。BitTorrent就采用了匿名的P2P网络。此外,间谍服务器攻击问题也不容忽视。eMule存在用户积分欺诈问题[10],原因如下:积分不是所有服务器直接通用,积分不存储与本地,积分可以不通过安全认证。最后,必须解决的还有恶意代码攻击问题:利用eMule文件校验漏洞攻击,利用链接欺骗手攻击。eMule的下载链接存在较多安全隐患,而且没有为用户提供任何下载前验证来源可靠性的手段。建议在eMule中加入第三方的Hash ID验证机制,通过建立黑名单的方式为用户提供下载前的安全验证服务。
eMule历经十年发展,当其使用逐渐广泛后,其安全设计不完善的缺点也逐步暴露了出来。其安全问题应该得到越来越多的重视。
六、总结与心得
eMule系统是一个经典的分布式文件共享系统,支持两种网络协议:扩展的eD2K网络协议和Kademlia网络协议。作为一个开源软件,eMule沿着“为了快乐和知识,而不是为了金钱”的信念,跋涉前行,见证了文件共享万象更新的十年。其源码可以在官网[3]下载,值得一看。
在文件共享的发展历程上,年轻人(尤其在学校内的)推动了其历史性的变革。1999年波士顿东北大学18岁的Shawn Fanning(肖恩.范宁)花三个月写的Napster开启了P2P文件交换与共享的大门。2002年美国纽约大学的两位年轻人Petar Maymounkov和David Mazières发表了一篇论文[8],在这篇论文中他们设计了一个叫Kademlia的网络,以实现完全非集中式的P2P网络。之后电驴很快发布了新的无中央服务器的分布式文件共享网络,基于Kademlia的Overnet网络,以及支持该网络的Overnet客户端。eMule中的Kad网络与之类似。
“看看我们的同学们平时干什么就知道这个国家的未来了。”创意在没有被实现之前,只是一个创意。作为年轻的一辈,我们应该是大有可为的,要锐意进取,理论联系实际,动手创新,为推动软件行业的发展贡献出自己的力量。
总的来说,通过近两个月的阅读与研究,本人对eMule系统以及P2P分布式系统有了较为深刻的了解。此外,由点到面,管中窥豹,对整个分布式系统中的各个方面也有了逐步清晰的认识。
七、参考文献
[1]Schollmeier,R. ;A definition of peer-to-peer networking for the classification ofpeer-to-peer architectures and applications; Institute of CommunicationNetworks, Technische Universitat;2002;
[2]陈明等;分布式计算应用模型;科学出版社;2009;
[3]eMule官方网站;http://www.emule-project.net/
[4]未知;eMule迎来10岁生日; http://emulefans.com/emule-10-years-old/[EB/OL];2012;
[5]Yoram Kulbak,Danny Bickson;The eMule Protocol Specification[EB/OL];http:// sourceforge. net/projects/emule/;2005;
[6]俞燕燕,李绍滋;eMule系统的协议分析;合肥工业大学学报;第29卷第9期;2006;
[7]张文,赵子铭;P2P网络技术原理与C++开发案例;人民邮电出版社;2008;
[8]PetarMaymounkov and David Mazières,Kademlia: A Peer-to-peer Information System Based on the XOR Metric[EB/OL];http://kademlia.scs.cs.nyu.edu;2002;
[9]赵科军,刘洋等;基于异或运算对等网模型Kademlia研究;山东科学;第20卷第6期;2007;
[10]刘倚达,施勇,薛质;计算机工程;eMule协议的安全性研究;第35卷第13期;2009
深入剖析eMule 【for_wind】相关推荐
- 电驴 emule 源码分析 (1)
关于电驴emule 的源码,网上有一个 叫刘刚的人 分析的 很多,但是如果你只是看别人的分析,自己没有亲身去阅读代码的话,恐怕很难 剖析整个系统. 关于emule 主要就是 连接 kad网络部分 ...
- volatile关键字之全面深度剖析
引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...
- TensorFlow基础剖析
TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使用节点表示抽象的数学计算,并使用 OP 表达计算的逻辑 ...
- c语言赋值x为字母,C语言算术、赋值、关系、逻辑运算详细剖析---
标识符和关键字 ¨标识符:用来标识程序中的变量.符号常量.函数.数组.类型.文件等对象的名字.标识符只能由字母.数字和下划线组成,且第一个字符必需为字母或下划线.C语言中大小写字母是两个不同的字符. ...
- 如何在HHDI中进行数据质量探查并获取数据剖析报告
通过执行多种数据剖析规则,对目标表(或一段SQL语句)进行数据质量探查,从而得到其数据质量情况.目前支持以下几种数据剖析类型,分别是:数字值分析.值匹配检查.字符值分析.日期值分析.布尔值分析.重复值 ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- JS魔法堂:mmDeferred源码剖析
一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...
- Linux 文件系统剖析
Linux 文件系统剖析 按照分层结构讨论 Linux 文件系统 M. Tim Jones, 顾问工程师, Emulex Corp. 简介: 在文件系统方面,Linux® 可以算得上操作系统中的 &q ...
- 剖析PHP中的输出缓冲
剖析PHP中的输出缓冲 本文按署名·非商业用途·保持一致授权 作者: ,发表于2005年12月24日01时54分 我们先来看一段代码. <?php for ($i=10; $i>0; $ ...
最新文章
- SpringBoot和SpringSecurity整合,未登录请求自定义controller访问前端页面,出现 302状态码,一直在登录页面重定向
- 【算法编程】斐波那契数列
- 台式计算机m9870t,JBT9870_水力测功器最新标准规范(14页)-原创力文档
- 四十四、Stata统计操作和绘图
- 【STM32】系统控制寄存器
- 一道Python面试题
- sass 安装配置和使用
- python自动注册邮箱_[转][Python][自动登录163邮箱]
- 常用代码生成工具介绍
- oracle预备份,oracle自动备份
- antd树型选择控件选择父级_element的tree树形菜单回显、父级半勾选
- zb怎么做渲染图_怎样用ZBrush对模型进行渲染(二)
- 个人网站音乐服务器,自己的私人音乐流媒体服务,这才是多少音乐者的梦寐以求的...
- PyQt设置右下角弹窗
- 阿里云ace考试内容是什么?
- CSS( Cascading Style Sheets )简书
- Ubuntu18.04 RTL8169驱动更换RTL8168驱动
- 3D打印机T3升级corexy 制作过程(三)
- linux centos7增加文件夹权限,在Centos7系统中实现用户和文件权限的管理
- Issues:Frequency out of range: (expecting between 112.50Hz and 275.00Hz, measured 99.85Hz)