Gnutella节点的结构:
   在一个Gnutella节点中最多有四类并发的进程存在:连接处理器(Connection)、协调进程(Coordination Instance)、下载进程(Download Instance)和上载进程(Upload Instance)。
    连接处理器负责管理所有连接的建立工作,包括自身发起的以及其它节点发起的连接。每个协调进程则负责处理某一条具休的用于握手、查询的连接的活动以及状态。当这个节点需要上载文件或者下载文件时,一条相应的上载连接或下载连接将被建立,该连接的所有活动、状态也将由一个上载进程或下载进程来进行监控。
    值得注意的是,在同一时间,节点中有且仅有一个连接处理器,但可能会有0个或者多个协调进程、下载进程或上载进程。

Gnutella节点的连接处理器:
    连接处理器共有六个状态:offline、waiting for ack、ping、 online、 search和coonection request。当Gnutella的节点同一个或多个其它节点建立连接时,它的状态就是online。同时连接处理器还存有一个全局变量ccount,用来保存当前的连接数。

Gnutella节点的协调进程:
    协调进程有两个状态waiting for message和terminate
    当一个用于节点间握手通讯的连接建立起来的时候,一个直辖市进程同时也被创建,用于管理该新连接的所有活动和状态。
    协调进程在创建初期处于wait for message状态,在这个状态下,协调进程会收到五种消息,它们分别是Ping、Query(Search)、Pong、QueryHit(Search Result)和Push。
    当协调进程收到一个Ping消息时,首先返回一个Pong消息给发来Ping消息的节点,然后判断Ping消息中的TTL字段的值是不是大于0,如果大于零,则将TTL的值递减后转发给其它相邻的节点。在这个过程事,发出Ping消息的节点的全局标志和相应的返回 Pong信息的路由将被记录下来。
    当协调进程收到一个Query消息时,该节点会判断其TTL值,对于大于0的,将TTL值递减后转发给其它相邻的节点。然后判断本地是否含有同Query消息匹配文件,如果有则返回相应的QueryHit消息。在这个过程中,发出Ping消息的节点的全局标志和相应的返回 Pong信息的路由将被记录下来。
    当协调进程收到一个QueryHit消息时,首先通过消息中带的全局标志判断该消息是否响应了本节点发出的Query消息,如果不是,则按照记录下来的相应的返回QueryHit消息的路由转发该QueryHit消息。
    当协调进程收到一个Push消息时,一条新的指向发出Push消息结点的连接将被建立,一个Http的GIV消息将被发送,当新的连接创建完成之后,该新连接将被移交给一个新的上载进程。
    对于协调进程管理的连接两端的任意一方中断了连接,该协调进程就进入"terminate"状态
   

    Gnutella节点的下载进程
    下载进程具有五个状态:connect to peer、wait for file、download file、download finished、terminate。
    当本地节点请求下载远端节点的文件或者远端节点应本地的Push请求发送文件过来时,下载进程就被创建了。
    下载进程在创建初期处于connect to peer状态。为了开始下载文件,本地节点发送包含有需要下载文件信息的Http的GET消息,同时将下载进程的状态转化为wait for file。
    当连接发生错误时,下载进程的状态会从wait for file直接转变成download finished。如果连接保持,并且开始接收从远端传来的数据,那么下载进程的状态会从wait for file转变为download file。
    当文件的内容源源不断的从远端发送过来,下载进程的状态将始终保持为download file,直到所有的文件信息都被传送过来,连接中没有数据包存在,下载进程的状态就转变为download finished。
    当本地节点或者远端节点的任意一方中断了连接,该下载进程就转入了terminate状态。


Gnutella节点的上载进程
    上载进程具有四个状态:send HTTP header、upload file、upload finished、terminate。
    当本地节点接收到远端节点的的Push信息,需要将本地文件传给远端节点时,上载进程就被创建了。
    上载进程在创建初期处于send HTTP header状态。当收到远端发出的Http的GET消息,同时将上载进程的状态转化为upload file。
    当文件的内容源源不断的从发送给远端,下载进程的状态将始终保持为upload file,直到所有的文件信息都被传送完成,下载进程的状态就转变为upload finished。
    当本地节点或者远端节点的任意一方中断了连接,该下载进程就转入了terminate状态。