• 以太坊系列之七: p2p模块的dial--以太坊源码学习


    dial.go阅读手记

    dial.go是负责和peer建立连接关系的地方,主要是实现

    type dialer interface {
    /*
        peers已经有的结点
     */
    	newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task
    	taskDone(task, time.Time)
    	addStatic(*discover.Node)
    	removeStatic(*discover.Node)
    }
    // dialstate schedules dials and discovery lookups.
    // it get's a chance to compute new tasks on every iteration
    // of the main loop in Server.run.
    type dialstate struct {
    	maxDynDials int
    	ntab        discoverTable
    	netrestrict *netutil.Netlist
    
    	lookupRunning bool
    	dialing       map[discover.NodeID]connFlag  //正在创建的连接
    	lookupBuf     []*discover.Node // current discovery lookup results
    	randomNodes   []*discover.Node // filled from Table
    	static        map[discover.NodeID]*dialTask
    	hist          *dialHistory
    
    	start     time.Time        // time when the dialer was first used
    	bootnodes []*discover.Node // default dials when there are no peers
    }
    

    其中最复杂的是newTasks,是建立新的连接,从test代码中可以看出,
    要在指定的最大连接数(peers)基之上去创建新的连接

    lookupBuf // current discovery lookup results
    主要是在结束taskdone的时候添加已经发现的?

    在不超过maxDynDials的情况下,首先减去peers已有的连接,然后是static中的任务,
    如果过还有富余,富余空间中最多一半(根据实现,可能为0)用ReadRandomNodes填充,剩下的
    就用lookupBuf来填充,如果lookbuf中没有有效的任务,那么就创建一个discoverTask,
    如果还有空间,就创建一个waitExpireTask

    总之newTasks就是在尽可能的情况下,多创建任务.为Server.run scheduleTasks时服务,
    保证其能够连接到尽可能多的节点.如果节点数量不够的情况下,还没有dialTask就创建discoverTask,否则就创建一个WaitExpireTask

  • 相关阅读:
    iPerf 笔记
    Monkey相关参数 笔记
    adb相关指令 笔记
    Linux常用命令 笔记
    eclipse配置android开发环境并搭建第一个helloWord工程
    python + eclipse + pydev 安装、配置
    print带参数格式
    JS获取按下的键盘字符
    Mysql 创建用户并对其赋予操作权限
    扩展内置对象
  • 原文地址:https://www.cnblogs.com/baizx/p/6963645.html
Copyright © 2020-2023  润新知