首页节点相关 正文

Pi节点的Incoming和Outoging说明

2023-07-27 5450 0条评论

一、TCP连线

首先了解TCP怎么建立连线。 通常是由一端(服务器端)打开一个通讯端(socket)然后监听来自另一方(客户端)的连接,这就是通常所指的被动打开(passive open)。 服务器端被被动打开以后,客户端就能开始建立主动打开(active open)。

 

当你的节点有开通PORT 31401-31403,就是扮演服务器端的角色,监听着PORT 31402,等待其他节点(客户端)发起连线。 如果有其他节点连进来,Incoming connections就会加一。

 

反过来,你的节点想连到其他节点,就是扮演客户端的角色,其他节点(服务器端)必须开通PORT 31402让你连进去。 如果成功建立连线,你的Outoging connections就会加一。

 

Pi节点是一个点对点网络(peer-to-peerP2P),彼此传递交易与SCP讯息,所以必然会有OutogingIncoming连线。

 

二、参数

连线数分别可以通过TARGET_PEER_CONNECTIONSout)、MAX_ADDITIONAL_PEER_CONNECTIONSin)参数来设定,目前stellar-core.cfg都没有设定,所以是采用预设值out 8in 64

 

三、peers

core数据库内有一个public.peers表格,存放了其他节点的信息。 节点跟节点之间,会彼此分享这些数据。

 

你的节点会连接到哪些节点,就是由这个清单一台一台的尝试。 反过来说,其他节点会不会连进来,也是看你的节点有没有在对方的peers表格内。

(不要问怎么查这些资料,因为让一位不懂数据库的人去操作数据库,是一件很危险的事,所以我不打算写出来。 )

Pi节点的Incoming和Outoging说明

 

一开始你的节点并不知道网络上有哪些节点,只知道核心团队的节点(在KNOWN_PEERSPREFERRED_PEERS参数设定),所以起初数据是连到核心团队节点取得的。 当你(out)连接到其他节点(in),你只会从对方节点随机得到几笔IP资料,而不是整个peers表格。

 

peers表格有5个字段:

l ip:这个不用解释

l port:都是31402

l nextattempt:下一次尝试连线的时间

l numfailures:连线失败的次数,超过120次会删除

l type:有3

n 0:还没有连线成功,会重复尝试连线

n 1:曾经连线成功

n 2preferred peer,优先选择的节点,目前全网就三个IP161.35.227.222161.35.227.224161.35.238.87。 都是核心团队的节点。

 

你的节点会依照nextattempt的时间顺序,不断尝试向其他节点发起连线。 如果网络不通、SYN-SENT封包根本没回应,numfailures会加一,type设定为0。 然后试下一个节点。

 

当全部试过后,type = 0的节点会再重试,nextattempt的时间会往后延。 而尝试失败120(numfailures = 120)的节点,该笔数据会被删除。

 

如果网络有通,TCP三向交握能完成,会做身分验证,建立起连线,numfailures会设定为0type设定为1。 但这个连线不一定会持续,可能马上就中断(peer rejected),因为你的Outoging connections已经8了,或是对方的Incoming connections已经64了,无法再容纳新的连线。

 

如果你目前尝试连过去的节点是preferred peer,而且有回应,但是Outoging connections已经满了,这时会自动砍掉一个Outoging connection,好让出名额。 但是也要看对方的Incoming connections有没有满,若满了,一样无法维持连线。 下图的log就是这种情况。

Pi节点的Incoming和Outoging说明

 

preferred peer的连线如果失败或中断了,nextattempt时间都会往后延,过一段时间再试,也就是说它会无限次尝试连线。 而其他节点尝试失败就算了,过去就不回头了要等全部试完一轮才重试

 

另外,节点之间的连线一旦建立了,基本上就不会中断,可以从elapsed看到已连线的秒数。

Pi节点的Incoming和Outoging说明

 

但偶尔还是会变动,例如对方或自己的节点网络断线、换IP、关机,或是为了preferred peer踢掉其他连线。

 

四、手动连线

stellar-core http-command connect?" peer=xxx.xxx.xxx.xxx&port=31402"

上面的 xxx.xxx.xxx.xxx IP

这个指令不一定成功,原因上面讲过了,可能网络根本不通,或是彼此的in/out连线数满了。

 

五、删除连接

先查出节点的ID

stellar-core http-command peers?fullkeys=true

Pi节点的Incoming和Outoging说明

 

删除连接 :

stellar-core http-command droppeer?node="GD5OPFFD2ANXGPHJ76FYAYAEMXNHRQ5JMQ5OHBWA4LJOQ3GEOGEO3EIF"

填入要中断连接的节点ID

这样就能空出一个out连线的位置,不过通常马上就被补上了。

 

六、结论

如果你的Incoming connections数量很低,不是什么不正常的情况,可能其他节点不认识你(peers表格没有你的信息),或是对方尝试过连线了,但它的Outoging connections已经8个了,所以就放弃你。 只要节点在网络上挂的越久,且IP没有一直换,会有越多的节点认识你,Incoming connections数量有机会增加。

 

再举个例子说明,假设全网共有20000台节点,总共会发出160000(20000*8=160000)Outoging connections,则至少要有2500( 160000/64=2500)台节点有开通PORT 31402让其他节点连入。

 

如果这时候有8000台节点开PORT,则平均Incoming connections数量是20(160000/8000=20)。 20就只是一个平均值,既然称为平均值,就会有人多、有人少,所以没有任何意义,不是成为超节的资格。 只要有开PORT,就有资格被选为超节。

 

而在8000台节点有开PORT的情况下,整个网络最多可容纳64000(8000*64/8=64000)台节点,所以从20000台再多加44000台没开PORT的节点也没问题。

 

上面节点数量大家能随意替换数字,自己计算一下就了解了。 总之,不要再牵拖Docker的版本,或是下雨天了。 讨论这个数字也没意义。

 

七、附上老尼回答Pi友的翻译

输入连接越多,表示被访问的次数自然越多。

 

@尼古拉斯:“其他节点找不到您要连接的对象,并且您没有太多传入连接,这可能有多种原因。 这些原因大多与运气有关。 通常,当一个新节点尝试连接时(或者在计算机重新启动或从睡眠状态恢复后),它会尝试从它已“学习”的IP列表中查找其他节点。 如果这些节点具有可用的传入连接,则新节点将连接到它们。

 

如果没有可用的传入连接,则会将其已知节点IP列表提供给请求节点并关闭连接。 然后新节点尝试连接到这些IP并不断发现更多IP,直到它成功连接到8个节点。 由于这个过程包含一定程度的随机性,一些节点变得更加广为人知,而另一些节点则不那么广为人知。 让你的IP地址不经常改变,这对你在网络中的知名度有很大帮助。 还有一点是你与核心团队节点的距离。

 

连接到一个核心团队节点的64个节点很可能总是将其所有的64个传入连接都填满。 这是因为全新的节点不知道其他节点,它们最初尝试连接到核心团队的节点,它们可能会收到“拒绝”和已知IP的列表。 直接连接到核心团队节点上的节点的IP被这些节点明确地知道,因此也很容易被发现。 在您提问之前:哪些节点最终连接到核心团队节点是完全随机的。

 

核心团队节点相互优先,并始终相互接受。 对于其余的64个传入连接,它们以先到先服务的方式接受任何其他节点。 但是,连接到核心团队节点并不重要,区块链在任何地方都是相同的,甚至一个字节的差异都会立即触发错误,因为这会使块散列无效。 


文章投稿或转载声明

本文来源:yuanrui919 版权归原作者所有,转载请保留出处。本站文章发布于 2023-07-27
温馨提示:文章内容系作者个人观点,不代表 Pi币中文网 对其观点赞同或支持。

发表评论

快捷回复:

评论列表 (暂无评论,5450人围观)参与讨论

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码