文档介绍:Emule Kad协议手册
文档编写:kernel,huby
版权所有: emuledev@
一、概述 3
二、协议参数分析 3
BootStrap Req/Res 3
Hello Req/Res 4
Kad Req/Res 4
Kad Search/Publish Req/Res 5
Kad Firewalled Req/Res 6
Kad FindBuddy Req/Res 6
kad Callback Req 6
三、KAD Search Action 7
、SendFindValue 7
、StorePackt 8
GetInfo相关协议: 8
Publish 相关协议: 8
四、Emule Buddy机制分析 9
网络协议包序列图: 9
五、Emule Kad 数据结构分析 11
附录1( OPCode List): 12
附录2(Question List): 14
一、概述
Kad使用UDP协议,通过eMule软件的UDP端口发送和接收数据
这个宏定义了我能够接受的KAD最高版本
#define KADEMLIA_VERSION 0x02
在ed2k协议里面被使用
CUpDownClient::SendHelloTypePacket
Kad版本:
区别:使用两套独立的opcode
,将版本信息写入协议,日后的扩展不再需要修改opcode
,
KAD协议基本上是成对的一个REQ(Request)就有一个对应的RES(Respone)
所有具有KAD头的包,(有些可能是压缩的),最终被送到Kademlia::Process中处理
Process处理各种不同的opcode并将这些数据送到对应的处理函数,在REQ消息的处理函数中,解析发送过来的数据,并且构造RES数据包并发送出去
二、协议参数分析
BootStrap Req/Res
0x00 KADEMLIA_BOOTSTRAP_REQ
发送请求,这个时候急需扩大自己的KAD网络
总共发送25B, 参照CKademliaUDPListener::SendMyDetails
16B
The sender Kad ID
4B
The sender IP
2B
The sender UDP Port
2B
The sender TCP Port
1B
0
0x08 KADEMLIA_BOOTSTRAP_RES
Packet Param: 返回20个Peer信息+自己的信息
KADEMLIA2_BOOTSTRAP_REQ
KADEMLIA2_BOOTSTRAP_RES
Hello Req/Res
0x10 KADEMLIA_HELLO_REQ
总共发送2B+25B, 参照CKademliaUDPListener::SendMyDetails
1B
OP_KADEMLIAHEADER
1B
byOpcode
16B
The sender Kad ID
4B
The sender IP
2B
The sender UDP Port
2B
The sender TCP Port
1B
0
0x18 KADEMLIA_HELLO_RES
回应KADEMLIA_HELLO_REQ,协议包格式和KADEMLIA_HELLO_REQ一样
KADEMLIA2_HELLO_REQ
参照CKademliaUDPListener::SendMyDetails
1B
OP_KADEMLIAHEADER
1B
byOpcode
16B
The Sender KadId
2B
The sender UDP Port
1B
KADEMLIA_VERSION
1B
Tag Count(2)
1B+32B
TAG_USER_COUNT(uint32)
1B+32B
TAG_FILE_COUNT(uint32)
KADEMLIA2_HELLO_RES
回应KADEMLIA2_HELLO_REQ,协议包格式和KADEMLIA2_HELLO_REQ一样
我们可以看到,,KadHello交换数据包括了自己Kad中已知的用户数和文件数, 但接收方都没有处理其中的Tag信息
Kad Req/Res
0x20 KADEMLIA_REQ
向一个Contact发送KAD Searc