fix(node,agent): 转发链路两处慢失败补超时——①节点转发握手(告知目标+等agent回执)新增 HandshakeTimeout 默认5s, agent会话半死时观看端不再无限挂起到点即断、握手成功即清除不约束数据阶段; ②agent 拨内网目标新增 DialTimeout 默认5s(Agent 可配), 目标离线且防火墙丢包时不再裸 Dial 吊20s+, 到点回执失败观看端立即断开; 附 e2e 红绿双向证明(半死agent/黑洞拨号 两场景撤修复必红)

This commit is contained in:
w11
2026-09-25 01:21:57 +08:00
parent 984041f1a0
commit 7a0ec8ded9
5 changed files with 172 additions and 18 deletions
+14 -9
View File
@@ -28,6 +28,9 @@ import (
const (
defaultBackoff = 5 * time.Second
defaultPing = 30 * time.Second
// defaultDialTimeout 内网目标拨号上限:目标离线且防火墙丢包(不回 RST)时
// 裸 Dial 在 Windows 上要 SYN 重传 20s+, 观看端在节点侧只能干等。
defaultDialTimeout = 5 * time.Second
)
// Logger agent 日志接口。logrus.Logger 的 Debugf/Infof/Warnf/Errorf 签名
@@ -59,9 +62,10 @@ func (DefaultLogger) Errorf(format string, args ...any) {
// Agent 被控端:隧道注册表。每条 Tunnel 携带自己的 NodeAddr+Token,
// 由独立 worker(tunnelConn)连接登录各自节点;Agent 不再有集中连接与登录。
type Agent struct {
AgentId string
Backoff time.Duration // 永久隧道重连退避(默认 5s)
PingEvery time.Duration // 各隧道控制流心跳间隔(默认 30s)
AgentId string
Backoff time.Duration // 永久隧道重连退避(默认 5s)
PingEvery time.Duration // 各隧道控制流心跳间隔(默认 30s)
DialTimeout time.Duration // 内网目标拨号上限(默认 5s; 超时向节点回执失败, 观看端立即断开)
// Logger 日志注入点。需要纳入宿主统一日志体系时设置
// (logrus 直接注入 logrus.StandardLogger() 即可);未设置用 DefaultLogger。
@@ -82,12 +86,13 @@ type Agent struct {
// New 创建被控端。节点地址与令牌随各隧道下发(Tunnel.NodeAddr/Token)。
func New(agentId string) *Agent {
return &Agent{
AgentId: agentId,
Backoff: defaultBackoff,
PingEvery: defaultPing,
Logger: DefaultLogger{},
tunnels: make(map[string]*tunnelConn),
done: make(chan struct{}),
AgentId: agentId,
Backoff: defaultBackoff,
PingEvery: defaultPing,
DialTimeout: defaultDialTimeout,
Logger: DefaultLogger{},
tunnels: make(map[string]*tunnelConn),
done: make(chan struct{}),
}
}