e骡协议介绍

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: [email protected]
来源: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

猜你喜欢

转载自cxw06023273.iteye.com/blog/866866