以Kademlia为例实战DHT(四)

2018-09-27  本文已影响0人  建怀

DHT

DHT的消息类型有query,response和error。其RPCs有四种:

首先查看一下dht.go里面有的结构体:

type Config struct {
    Address string                  // 监听的IP address,如果留下空白,会自动选择一个。
    Port int                        // DHT节点会监听的UDP端口,如果是0,将会挑选一个随机端口。
    NumTargetPeers int              // DHT将尝试为每个被搜索的infohash寻找的对等点。这可能会被转移到per-infohash选项。默认值:5。
    DHTRouters string               // 用于引导网络的DHT路由器的分离列表。
    MaxNodes int                    // 在路由表中存储的最大节点数。默认值:100。
    CleanupPeriod time.Duration     // 在网络中ping节点的频率,以确定它们是否可到达。默认值:15分钟。
    SaveRoutingTable bool           // 如果True,节点将在启动时从磁盘读取路由表,并每隔几分钟保存磁盘上的路由表快照。默认值:True。
    SavePeriod time.Duration        // 将路由表保存到磁盘的频率。默认值:5分钟。
    RateLimit int64                 // 每秒处理的最大数据包数量。如果是负数就取消。默认值:100。
    MaxInfoHashes int               // MaxInfoHashes是我们应该保留一个对等列表的信息的数量的限制。
    // 如果这个和MaxInfoHashPeers没有改变,它应该消耗大约25 MB的RAM。更大的值有助于保持DHT网络的健康。默认值:2048。
    MaxInfoHashPeers int            // MaxInfoHashPeers是每个infohash跟踪的对等点的数量限制。一个单独的对等接触通常会消耗6个字节。默认值:256。
    ClientPerMinuteLimit int        //  ClientPerMinuteLimit 通过对抗垃圾客户端来进行保护。如果超过每分钟的数据包数量,请忽略它们的请求。默认值:50。
    ThrottlerTrackedClients int64   // ThrottlerTrackedClients是客户端节流器所记得的主机的数量。LRU是用来跟踪最有趣的。默认值:1000。
    UDPProto string                 // UDP连接的协议,udp4 = IPv4  udp6 = IPv6
}

// DHT 应该用New()来创建,能给torrent客户端提供一些DHT特征,例如发现新的对等节点让
// torrent下载,而不需要一个tracker。
type DHT struct {
    nodeId  string
    config  Config
    routingTable *routingTable
    peerStore   *peerStore
    conn    *net.UDPConn
    Logger  Logger
    exploredNeighborhood    bool
    remoteNodeAcquaintance  chan string
    peersRequest    chan ihReq
    nodesRequest    chan ihReq
    pingRequest chan *remoteNode
    portRequest chan int
    stop    chan bool
    wg  sync.WaitGroup
    clientThrottle  *nettools.ClientThrottle
    store   *dhtStore
    tokenSecrets    []string
    // Public channels:
    PeersRequestResults chan map[InfoHash][]string  // key = infohash , value = slice of peers
}

type ihReq struct {
    ih  InfoHash
    announce bool
}

围绕着DHT有如下方法:

上一篇 下一篇

猜你喜欢

热点阅读