比特币节点平时只维持一小把常驻出站连接,但它的通讯录里有成千上万个候选地址。怎么知道哪些候选还活着、值得转正?靠一种极短命的动作:feeler 连接——拨过去,握手成功就算考察通过,随即挂断,源码里这个英文词在连接管理文件 net.cpp 与 net_processing.cpp 中net.cpp 里数十处、连 net_processing.cpp 合计近四十处。它不参与同步、不传区块、不算带宽账,却决定节点通讯录的新鲜度。本文拆解这条两分钟一趟的探针怎么工作、它的结论记进哪本账。
一次探测里发生什么
连接管理循环大约每两分钟触发一次 feeler(源码常量 FEELER_INTERVAL 为两分钟,下次触发时间按随机指数分布抖动,另加至多一秒随机噪声防同步化):先看地址管理器里有没有 tried 表的碰撞地址要仲裁——有就先探它;没有就从 new 表随机抽一个候选。发起 TCP 连接、走完版本握手:成功就记下这个地址还活着;失败——超时、拒绝、握手异常——直接丢弃,不占后续资源。握手一完成,处理逻辑立刻把它标记为断开(源码注释一句话点题:feeler connections exist only to verify if address is online),整个生命周期因此只有几秒。关键约束是同一时刻只允许一条 feeler 在途(MAX_FEELER_CONNECTIONS 为 1),探测流量恒定微小,不挤占同步带宽。值得注意的分工细节:常规出站连接握手成功后会把地址从 new 表升进 tried 表,而 feeler 自身不设”成功连接”标志、不走那条记账路径——它的结论短期有效,长期转正仍要靠真正的常驻连接或碰撞仲裁。

与常驻槽位的分工
节点主动维护的全中继出站连接默认是八条,另加两条只收块连接,服务区块与交易流动;feeler 不占这些名额(源码注释写明 feeler 连接因短命而不设数量上限),是独立的一根探针:连接管理器用它回答一个完全不同的问题——“通讯录里下一位谁还在线”。验证过或仲裁胜出的地址进入正式记账,之后常驻连接的拨号池才有资格抽到它们。两本账因此相互喂养:常驻连接靠稳定样本跑业务,feeler 靠随机抽样持续换血通讯录。常年在线的节点不断把通讯录里的死地址洗掉、新地址补进,整张网的健康检查就是由每个节点这种几秒钟的小动作摊薄的。
随机抽样是对抗地址投毒的解毒剂
恶意指望你的通讯录塞满它控制的地址:Gossip 里灌一百万条同网段假条目确实能淹掉传闻池。地址管理器按网段限额挡正面冲击,feeler 则是随机审计员——转正与否取决于抽到它、连得上,攻击者无法指定”让假地址恰好总被抽中”。抽样让投毒成本从”批量注册相近地址”变成”维持一个真能长期应答的大地址群”,后者贵得多。这也是为什么节点重启后不会立刻连上”最近活跃的一批”却仍整体健康:随机抽样的期望让位给新鲜度,通讯录质量靠持续代谢而非一次性快照。
防火墙后的误判
feeler 双向都会惹误会。你的节点探别人失败,只是通讯录代谢掉一个候选人,用户无感知;别人探你失败——典型场景是家用路由没做端口转发、公网监听根本拨不进——你在全网通讯录里被逐步降级,入站连接越来越少,节点变成”只出不进”的单向公民。监控面板上表现为同步完全正常但入站数长期为零。诊断入口是 getnetworkinfo 里 connections_in 的长期形态,配合官方文档的端口转发指引;这不是故障,是网络可达性的真实投票。
快速问答
问:feeler 连接会进日志刷屏吗? 答:通常只在调试类别下可见,常规日志几乎无感,它太短命也太频繁。
问:能关掉或调频率吗? 答:常量写死在实现里,无面向用户的调参入口;想控入站形态用监听与连接数参数。
问:它和 ping 消息是一回事吗? 答:不是。ping 维持已建立连接的活性,feeler 考察还没建立过关系的新候选。
风险提示:本文解释节点连接机制,不构成投资建议。对外开放监听前请评估所在网络的安全策略与法规要求。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。