通道假死的判定链条:chan-status-sample-interval 与 enable/disable 双超时 图 1
通道假死的判定链条:chan-status-sample-interval 与 enable/disable 双超时 · 图 1

通道”假死”的判定链条:chan-status-sample-interval 与 enable/disable 超时三件套

闪电节点最怕的一种状态是:对端悄悄掉线了,你的节点还以为通道活着,继续接路由转发,直到 HTLC 超时才发现问题。LND 为这个问题设计了一套”探测—确认—广播”的时间机制:chan-status-sample-interval 控制探测频率,chan-enable-timeout 与 chan-disable-timeout 控制两个方向的确认时长。三个参数都藏在启动配置里,默认值与相互关系比多数教程讲得细。本文按 LND v0.19.0-beta 源码核对。

探测:sample interval 是心跳问号的频率

chan-status-sample-interval 的帮助文本:在两次尝试之间轮询,检测一个活动通道是否因对端离线而变为不活动。节点会定期对自己认为”活跃”的通道做轻量探测(本质是检查与对端的连接与通道真实状态);源码常量 defaultChanStatusSampleInterval 给出的默认值是 1 分钟,与下面两个以十分钟计的超时构成一套完整的判定窗口。间隔调小,发现掉线更快,但探测开销和对端连接状态查询的频率都上升;调大则省资源、反应慢。

反向消抖:disable 前再等 20 分钟

真正精妙的是关闭侧。chan-disable-timeout 默认 20 分钟,帮助文本写得很具体:在第一次检测到一个”本应活跃的通道实际不活跃”之后,要经过这段时间,节点才向网络广播禁用该通道的 channel update;如果在禁用消息发出之前,对端重连并且在 chan-enable-timeout(默认 19 分钟)内保持稳定,这次待发的禁用会被取消。这套双超时的目的是防抖动:网络瞬时闪断、对端重启几十秒,都会触发”不活跃”信号,但不足以立刻让全网路由表把你这条通道画掉——广播一次禁用、又被撤回、再启用,对全网 gossip 是噪声,对通道两端则是费率与可见性的反复震荡。20 分钟的宽限期就是”再给它一次回来的机会”。

三个数字的关系决定行为

把这组默认值排在一起看:采样间隔 1 分钟,enable 确认窗口 19 分钟,disable 宽限 20 分钟。含义是:一次掉线最快一分钟就会被采样发现,但发现之后还要再熬过 20 分钟才会全网可见地被禁用;而对端如果回来了,要稳定满约 19 分钟才足以取消这次禁用。调整时不要只动一个:把采样拉长到一小时,配合原有的 20 分钟宽限,意味着故障被广播出去之前,最坏情况下有一个多小时的窗口里你的节点仍在往”假死”通道尝试路由。

什么时候该动这组参数

家用节点对可用性要求不高、希望 gossip 安静:保持默认甚至放宽采样。路由运营节点靠通道可见性吃饭:缩短采样、让故障通道更快退出路由表是合理诉求,但要知道对端节点也有自己的一套判定,你单方面的积极不能替代双方的稳定。另一类场景是网络本身不稳(移动链路、高延迟卫星):20 分钟的 enable/disable 窗口可能频繁被触发又取消,这时反而应该观察日志里 disable pending/cancel 的痕迹,再决定是否需要把窗口拉宽。所有调整都在配置重启后生效,验证方法是人为断掉一个对端,记录从断链到 describegraph/getchannel 状态变化、再到网络侧禁用广播出现的时间线,与你的参数设定对齐。

相关但不属于这组参数的邻居

height-hint-cache-query-disable 常被同一批教程混进来讲:它不是探活机制,而是当通道卡在 pending close 状态时,临时禁用高度提示缓存的查询、逼迫更长的链上重扫来解卡,源码描述还提醒”解卡后应恢复设置,否则性能有代价”。两者都围绕”通道状态不对怎么办”,但一个管网络侧的活跃判定,一个管链上确认的找回逻辑,动手前先分清自己遇到的是哪一类。

风险提示:通道频繁禁用与启用会影响路由收入与对手方评价,参数调整属于运营决策而非纯技术开关;本文为机制说明,不构成投资建议。