e骡协议介绍

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
参考资料: google: emule.pdf

1. 概述

eMule(e骡)是BT之后新的P2P工具,其地址在http://www.emule-project.net/,其协议是edonkey协议的增强和扩展,完全兼容edonkey。

emule客户端都带有emule服务器和共享文件的列表,服务器只保存文件和在线客户端的信息,只相当于一个中心索引,并不保存实际文件。客户端下载时客户端先通过单一的TCP连接服务器登录emule网络,获取希望的文件信息和可能的客户端信息,然后直接连接这些客户端进行文件的上载或下载操作,各个客户端并不一定传整个文件,而只是文件的不同部分,在本地客户端再组合起来,因此在下载文件时客户端可能会产生数百条连接,尽可能的利用带宽。 emule扩展edonkey的地方在于客户端之间可以交换服务器、在线客户端、共享文件的信息,其他部分则和edonkey相同。

2. 客户端TCP连接服务器

客户端登录服务器时使用TCP连接,为提高效率会同时连接多台服务器,但一条连接后其他的连接就断开了。客户端连接服务器后发送login信息,服务器这时会开一个新的TCP连接反向尝试连接客户端,如果连接成功服务器发送hello信息,获取hello的回应,这样就表示该客户端是允许其他客户端连接自己的,服务器就会给这个客户端分配一个高ID值;反之,如果反向连接失败,表示该客户端不允许其他客户端连接自己,服务器就会分配一个低ID 值给这个客户端,ID是个4字节数据,高ID比低ID有更高的权限,低ID的值一般不超过16777216(2^24),emule是鼓励各客户端开放自己以进行更好地共享的。如果服务器的处理能力达到限值,会先拒绝低ID的连接。

连接建立后,服务器会给这个客户端分配一个用户ID来标志客户端,而高/低ID是标志该客户端的权限,用户ID是个16字节长的数据,第7到16字节数据不是随机的。

登录成功后客户端和服务器会进行数据交换:客户端向服务器提供自己的共享文件列表信息;服务器向客户端提供服务器的状态、版本和其所知道的其他服务器的信息;客户端向服务器请求获取关于下载文件的源,服务器各种源的信息给客户端,然后客户端根据这些信息连接其他客户端下载所需要的文件。

emule供一种回调机制使得具有低ID值的客户端也能接受外部的连接,具体过程为如果A,B都是同时连到同一个服务器,A是高ID,B是低 ID,A通过信息交换知道B的存在,A就发回调消息到服务器,服务器在和B通信过程中将此回调信息发送给B,B于是主动连接A进行数据传输。

emule/edonkey通信数据都有以下的6字节的头信息:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Protocol | size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| size | type | varied length data...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
protocol:协议,1字节长,0xe3为eDonkey,0xc5为eMule
size:数据长度,4字节长,表示的长度数值不包括头部和size的长度,单位是字节
type:数据类型,1字节长,对于客户端到服务器的TCP连接可取以下类型值,协议为0xe3:
0x01: login
0x38: server message
0x40: ID change
0x15: offer files
0x14: get list of servers
0x34: server status
0x32: list of servers
0x41: server identification
0x16: search request(client), search result(server)
0x19: get sources
0x42: found sources
0x1c: callback request(client)
0x35: callback requested(server)
0x36: callback fail(server)
0x05: message rejected
注意:eMule/eDonkey都是在Intel硬件,Microsoft操作系统实现,协议中所有数据就都定义为“小头”序而不是一般网络协议中的“大头”序,所以不需要进行ntohs和ntohl转换。

3. 客户端UDP连接服务器

emule客户端和服务器之间使用UDP通信来完成连接状态保持和增强性查找等功能,UDP数据发送最大频率是每秒10个包。

在头信息字段中,对于客户端到服务器的UDP连接可取以下类型值,协议为0xe3:
0x9a: get sources
0x9b: found sources
0x96: status request
0x97: status response
0x98: search request
0x92: search request
0x99: search response
0xa2: Server description request
0xa3: Server description response

4. 客户端TCP连接客户端

客户端之间的TCP连接用来进行文件的下载,每条连接最小传输速率为2.4K字节/秒。

4.1 握手过程

客户端之间建立TCP连接后,进行初始化握手过程,交换各自的相关信息:ID、版本、能力情况等,包括hello和emule info信息,对方返回hello answer, info answer等信息,这些是和edonkey相同。此外,emule还会发送特殊的UDP交换信息,安全的用户识别信息和源的交换能力等信息,这是 edonkey所没有的。

安全的用户识别是在握手过程中协商是否进行,如果要进行认证,会交换公钥和签名信息,为鼓励客户端提供共享文件,对提供共享多的用户会有较高的信用值。

4.2 文件请求过程

起始方发送File request, Requested file ID, source request等请求信息,对方如果文件存在,返回File request answer、File status、Sources answer等回应信息;如果文件不存在,返回File not found信息,然后断开连接;如果文件提供方的该文件的上载队列不为空,会将请求方的信息放入队列,然后断开连接,等此信息到达队列顶时文件提供方主动连接请求方上载文件,如果请求方已经通过其他机器下载了文件,可以拒绝上载。

4.3 数据传输过程

eMule下载文件时并不象FTP那样两点间按文件顺序传输,而是将文件分隔为很多部分(每部分9.28M,又细分为多个块,每块180K),不同的部分可以从不同的地方进行下载,各部分下载后重新组合起来,因此连接越多下载速度越快。另外在TCP传输过程中,是直接发送的,为防止IP分片降低效率,每个包发送的TCP数据最大限制为1300字节。

文件部分请求传输过程为:请求方发送Start upload request请求信息,对方回应Accept upload request表示接受,然后请求方发送Request file parts请求,对方返回Sending file part信息,然后传输文件部分,一次连接最多可传输3个文件部分,如果双方版本都支持,可以在数据传输前进行压缩。

请求方可以通过发送View shared files、View shared folders、View content of a shared folder等请求来获取对方的共享文件,共享文件夹的信息。

在头信息字段中,对于客户端到客户端的TCP连接基本类型可取以下类型值,协议为0xe3:
0x01: hello
0x4c: hello answer
0x46: Sending file part
0x47: Request file parts
0x49: End of download
0x4d: Change client ID
0x4e: Chat message
0x51: Part hashset request
0x52: Part hashset reply
0x54: Start upload request
0x55: Accept upload request
0x56: Cancel transfer
0x57: Out of part requests
0x58: File request
0x59: File request answer
0x48: File not found
0x4e: Requested file ID
0x50: File status
0x5b: Change slot
0x5c: Queue rank
0x4a: View shared files
0x4b: View shared files answer
0x5d: View shared folders
0x5f: View shared folders answer
0x5e: View content of a shared folder
0x60: View shared folder content answer
0x61: View shared folder or content denied

以下是emule扩展类型,协议字段必须为0xc5,不能是0xe3:
0x01: eMule info
0x02: eMule info answer
0x40: Sending compressed file part
0x60: Queue ranking
0x61: File info
0x81: Sources request
0x82: Sources answer
0x87: Secure identification
0x85: Public key
0x86: Signature
0x90: Preview request
0x91: Preview answer

5. 客户端UDP连接客户端

客户端之间会周期性地发送UDP信息,用来获取本机在对方的下载队列中的位置,是通过发送Re-ask file信息来查询的,对方可能会返回Re-ask file ack、Queue full或File not found信息回应。

在头信息字段中,对于客户端到客户端的UDP连接可取以下类型值,协议值必须为0xc5:
0x90: Re-ask file
0x91: Re-ask file ack
0x93: Queue full
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值