分析Gnutella数据包的步骤
分析Gnutella数据包的步骤
一、 Gnutella综述
Gnutella是一种完全的分布式信息共享技术,它现在可以也是一个协议。它的作用是构造无等级结构的网络。每一个Gnutella节点在作为服务器端的同时也是客户端,每个Gnutella节点仅知道与它直接相连的Gnutella节点,如果其他Gnutella节点不响应该节点的ping或回复查询,这台节点就不会看到其它Gnutella节点。当你的Gnutella软件运行加入到Gnutella网络中时,不但可以与他人共享你的文件或者你可以共享别人的软件,而且可以方面地寻找你定义的文件。
二、 Gnutella协议
在Gnutella中节点称为servent。Gnutella协议定义的是节点之间在网络中通信的方式。Gnutella定义了五种描述符:Ping,Pong,Query,Query hit,Client Push request。一个Gnutella节点在网络寻找另一个Gnutella节点,使其加入进Gnutella网络,一旦发现节点就立即和它创建TCP/IP连接,并向它发送一个请求字符串,内容是“GNUTELLA CONNECT/<protocol version string>/n/n”。如果这个Gnutella节点愿意接受就发送回应字符串“GNUTELLA OK/n/n”,如果这个节点发送其他回应字符串着表明不想接受。
三、 Gnutella各种数据包格式
在Gnutella网络中的节点进行通信要通过发送和接受Gnutella描述符来实现,每个描述符被封装在Gnutella数据包中。
1. Gnutella的数据包头格式
说明:数据包的单位是字节(byte),数据长度字段后就是具体的数据内容。
1消息ID:一个 位的唯一在网络上标识一个新建消息16的字符串。
2功能ID:定义这个数据包的消息类型,说明这是什么功能的数据包。以下是功能与ID值相对应。
3TTL剩余:该信息包在被丢弃前,还剩余的跳数。
4跳数:信息包已发生的跳数。
5数据长度:数据长度在Gnutella数据报头的最后,定义了紧随其后的Gnutella数据长度。主要用于消息包的同步。
2. Ping数据包格式
说明:ID字段为0x00,数据长度字段为0x00000000。一个Gnutella节点使用ping功能来动态检测网络中的其他Gnutella节点。一个收到ping的Gnutella节点会返回一个pong信息包来回应,这个回应数据包中含有一个正在网络中的Gnutella节点的地址及该节点提供的共享数据的相关信息。
3. Pong数据包格式
说明:ID字段为0x01。pong数据包仅被用来回应从外部进来的ping请求。以下是数据内容的格式。
1主机端口:回应主机的TCP端口。
2主机IP地址:回应主机的ip地址。
3共享文件数:该主机上共享文件的数量。
4共享文件的大小:该主机上所有共享文件的大小(单位为kB)
4. Push数据包格式
说明:ID字段为0x40。当一个Gnutella节点的资源在防火墙之后,那么就需要这个节点主动的发起连接,并完成数据的传输。
1节点ID:16个字节的字符串,唯一标识网络中被请求push文件的Gnutella节点。Push发出请求的Gnutella节点应当设置这个字段为在相应的“搜索结果”数据中返回的“节点标志”信息。
2文件索引:文件索引标识了发出Push请求的Gnutella节点定义的需要从目标Gnutella节点上被Push的文件。
3IP地址:发出Push请求的Gnutella节点的IP地址。
4端口:发出Push请求的Gnutella节点的守候端口号。
5. 搜索数据包格式
说明:ID字段为0x80。发出一个含有关键字的搜索数据包。
1最小速度(kbps):定义了Gnutella节点信息传输的最小速度。如果一个Gnutella节点能以大于n kbps的速度通信,那么这个收到含有最小速度字段的搜索数据包并在本地有该搜寻信息的Gnutella节点会返回一个搜索结果响应。
2搜索的关键字:这个字符串的最大长度被绑定在这个Gnutella数据包头的数据长度字段中。
6. 搜索结果数据包格式
说明:ID字段为0x81。这个数据包包含了搜索之后返回结果的信息。
1搜索结果数目:在结果集合中的搜索结果的数目。
2端口:回应搜索请求的主机的守候端口号。
3IP地址:回应搜索请求的主机的IP地址。
4速度:回应搜索请求的主机的速度(kbps)。
5响应记录:一个响应搜索请求的集合。其中还包括索引文件、文件大孝文件名字。文件索引,即一个数字,由回应主机分配,它被用来唯一标识匹配查询的文件。文件大小,即索引文件的大小(bytes)。文件名字,即匹配的文件名字,仅仅是文件的名字,不包含路径信息。其结构如下:
6节点标识:唯一标识响应搜索请求的Gnutella节点的一个16字节字符串。
四、 Gnutella的路由选择问题。
Gnutella遵循的路由选择协议是这样的:
1pong:沿着从外部进来的ping相同的路径被发送。
2搜索结果:沿着从外部发来的搜索请求相同的路径被发送。
3push请求:沿着与从外部进来的搜索结果相同的路径被发送。
这样做都是为了让曾经接收到请求信息的节点都得到请求的返回信息。
在每个Gnutella节点将描述符转发到与它直接相连的Gnutella节点前,会将数据包头中的TTL字段-1,同时将跳数字段+1。如果包头中的TTL-1后等于0,那么该信息包将不再被转发到任何其他Gnutella节点上。
接收到与曾经收到过的Gnutella数据包头及ID相同的信息包的Gnutella节点将避免把这些信息包再转发给其他Gnutella节点。这样可防止重复发送,浪费带宽。
五、 两个Gnutella节点间进行文件下载
当Gnutella节点收到一个搜索结果信息,它将依据搜索结果的响应记录的描述文件直接进行下载初始化。在源Gnutella节点和目标Gnutella节点之间建立一个直接连接。下载文件所使用的协议是HTTP协议。初始化下载的Gnutella节点发送一个请求字符串给目标Gnutella节点。当收到这个下载请求的Gnutella节点,然后发出响应消息。
如果要进行文件共享传输的两个Gnutella节点,其中目标节点处于防火墙之后,请求节点将给目标节点路由一个Push请求,请求目标节点的Gnutella“推出”(Push)文件,这样两个节点建立TCP/IP连接。在Push请求数据中包含了建立TCP/IP连接的必要信息,如节点ID、IP地址、端口。
如果请求Gnutella节点与目标Gnutella节点都处于防火墙之后,文件传输将不能正常进行。
六、 Gnutella问题
Gnutella使用的是泛滥式的查询机制,消息的数量成指数级增长,占用了过多的网络带宽。