hostAddr机制
hostAddr查询与运用
1 | ipfs id |
ipfs id
命令可显示ipfs节点信息,其中Addresses为服务地址即hostAddr, ipfs 会将hostAddr广播出去, 其余节点会利用hostAddr的地址进行连接, 因此通过hostAddr能否连接节点是 节点互联的关键.
hostAddr的初始化
ipfs 启动后默认监听 “/ip4/0.0.0.0/tcp/0” “/ip6/::/tcp/0”, 此时 ipfs 查询本机各网卡地址并进行监听, 复杂网络环境下有如下几种情况:
云主机通常采用经典网络模式分配的ECS固定公网IP, 在本机网卡上可见公网ip, 因此hostAddr的可查询到此公网ip
云主机通常采用弹性公网ip EIP(Elastic IP Address)访问, 在主机上网卡上不可见公网ip,因此hostAddr的 无法查询到此公网ip
hostAddr的更新
对于部署在无外网网卡ip主机的ipfs, 若依靠广播初始化后的hostAddr, 无法被其余节点主动连接, 即 Inbound 无法走通, 因此 libp2p 设计了autonat、autorelay等机制
注: fix host can be dialed by autonat public addr, but lost the public addr to announce 此pr修复了hostAddr更新缺失EIP的情况,已被合并.
autonat机制
autonat基本原理
go-libp2p-autonat 运用remotePeer(对端节点)DialBack(回拨)机制 来获取自身服务的外网IP及端口, 其过程如下:
全网中开启autonat service的某节点A, 该节点在p2p网络中支持 autonat协议(”/libp2p/autonat/1.0.0”)
节点B主动连接上支持 autonat service的节点, 此连接为后续协议交互的连接, 包括 identify协议 和 autonat协议
节点B在与A完成身份认证后判断节点A是否支持autonat协议, 若支持则由节点B的 autonat client 发起公网地址拨号请求(DialBack)
节点A的autonat service 收到DialBack请求后对节点B进行DialBack (回拨的地址为节点B的hostAddr以及已有连接的节点B地址), 并将结果observations(包含Multiaddr及Reachability)发送给节点B
节点B根据DialBack的结果判断自身是 ReachabilityPublic 还是 ReachabilityPrivate, 并补充更新 hostAddr
autonat优化
除了上述基本功能外, autonat还做了一些额外的优化
节点B启动动态定时器主动对Peerstore的节点进行autonat协议探测以便获取自身最新的nat状态
对于网络状态的翻转(flipping)设定一个confidence, confidence的增加代表对当前状态的自信心([0,3]), 根据是否翻转以及confidence的值决定是否触发网络状态的改变, 修改hostAddr
confidence小于最大值时, 1.的探测定时器为固定时长(15 min), 否则对探测定时器做如下调整
当为外网可访问状态时,若最新的外网节点主动连接(Inbound Conn)成功且比最新的探测时间晚, 则延长1.的探测定时器时长, 段时间虚无继续探测
5.当为外网不可访问状态时,若最新的外网节点主动连接(Inbound Conn)成功且比最新的探测时间晚, 减小1.的探测定时器时长以变获取最新的外网地址
总结: 目前ipfs中默认开启了autonat service及autonat探测