wsl remote连接bug

Issue Description

wsl remote error

Steps to Reproduce

无特殊操作

Expected Behavior

正常remote wsl连接使用

Actual Behavior

wsl连接自己断开

Screenshots / Screen Recordings

Operating System

windows 11

Current Qoder Version (Menu → About Qoder → Copy)

版本: 1.21.2
VSCode 版本: 1.106.3 (system setup)
提交: 7fbe5a663d90672b3e3ceb02e3391a876bc52709
日期: 2026-08-02T11:39:25.623Z
Electron: 42.2.0
Chromium: 148.0.7778.97
Node.js: 24.15.0
V8: 14.8.178.14-electron.0
OS: Windows_NT x64 10.0.26200

Qoder Remote WSL 断联问题分析报告

分析日期:2026-08-03
环境:Windows 25H2 + WSL2 Ubuntu-26.04 + Qoder 1.21.2
Server commit: 7fbe5a663d90672b3e3ceb02e3391a876bc52709


1. 问题现象

Qoder 通过 WSL Remote 连接 Ubuntu-26.04 时,反复出现断联,具体表现为:

  • Server 端日志持续输出 Got delay-shutdown request while in shutdown timeout, delaying
  • 客户端报错 Unknown reconnection token (never seen)
  • 每隔约 60 秒触发一次 delay-shutdown 循环
  • 即使初始连接成功建立,后续仍会断联

2. 环境信息

项目
WSL 内存 48 GB(空闲 46 GB)
CPU 核心数 32 核
系统负载 0.00(几乎为零)
磁盘空间 951 GB 可用
OOM Kill 记录
网络连通性 Test-NetConnection 127.0.0.1:39237TcpTestSucceeded: True

结论:WSL 环境资源充裕,排除性能瓶颈。


3. 关键日志分析

3.1 Server 端日志 (~/.qoder-server/.7fbe5a663d90672b3e3ceb02e3391a876bc52709.log)

Server bound to 127.0.0.1:46063 (IPv4)
Extension host agent listening on 46063

[22:39:07] Extension host agent started.
[22:39:07] [127.0.0.1][ea7b1dc3][ManagementConnection] Unknown reconnection token (never seen).
[22:39:07] [127.0.0.1][feb9b456][ExtensionHostConnection] Unknown reconnection token (never seen).

Server 刚启动即收到带有旧 token 的连接请求,被拒绝。

3.2 客户端 renderer.log 完整时间线

时间 事件 耗时/备注
01:15:53 开始 resolveAuthority -
01:16:33 Server 解析完成,端口 3401 等待 40 秒(server 下载/启动)
01:16:43 Management 连接建立 10 秒
01:16:53 ExtensionHost 连接建立 20 秒
01:17:33 Socket 超时(23 条未确认消息,20 秒无数据) 连接中断
01:17:33 重连到端口 35379(新 server 实例) 重连成功
01:18:05 新连接建立(Management 4ms,ExtHost 48ms) 连接正常
01:19:05 Remote extension host 60 秒未发送 ready 消息 核心错误
01:20:49 窗口重载 -
01:20:50 重连尝试 #1 → 旧 server 仍在运行,端口 35379 使用旧 token
01:21:33 重连尝试 #2 → server 已死,新 server 启动,端口 46063 新 token 生成
01:21:34 客户端发送旧 reconnection token → 被拒绝 Unknown reconnection token
01:21:34 客户端报告 A permanent error occurred 连接彻底失败

3.3 安装脚本日志对比(关键证据)

Attempt #1(01:20:50)— server 还在运行:

Server script is already running    ← 旧 server 存活
listeningOn==35379==
connectionToken==45e67c53-95ef-41a6-b12d-cc9958afd9ab==

Attempt #2(01:21:33)— 43 秒后,server 已死:

Server script already installed     ← 注意:没有 "is already running"
                                    ← 脚本检测到 server 死亡
                                    ← 删除旧 token,启动新 server
listeningOn==46063==                ← 新端口
connectionToken==734d1ecc-938d-4c76-b652-98ba957013c8==  ← 新 token

但客户端的行为:

5/6. sending ConnectionTypeRequest control message.
received error: Connection error: Unknown reconnection token (never seen)

客户端拿到新 server 地址后,没有使用新的 connectionToken 做全新连接,而是使用旧 server 的 reconnection token 尝试"重连"。


4. 根本原因

死循环链路

┌───────────────────────────────────────────────────────────────┐
│                                                               │
│  ① Server 启动(新端口、新 token)                              │
│      ↓                                                        │
│  ② 客户端调用 resolveAuthority 获取新 server 地址               │
│      ↓                                                        │
│  ③ 客户端使用【旧 reconnection token】发起连接(而非新 token)    │
│      ↓                                                        │
│  ④ 新 server 拒绝:Unknown reconnection token                  │
│      ↓                                                        │
│  ⑤ 连接失败,客户端报告 permanent error                         │
│      ↓                                                        │
│  ⑥ Server 无活跃连接 → auto-shutdown 触发                      │
│      ↓                                                        │
│  ⑦ Server 死亡 → 回到 ①                                       │
│                                                               │
└───────────────────────────────────────────────────────────────┘

核心问题

open-remote-wsl 扩展在 server 重启后,没有正确使用新的 connectionToken 建立全新连接,而是错误地走了"重连"路径,使用已失效的 reconnection token。

这是 WebSocket 连接协议层面的 bug:

  • 新连接流程:使用 connectionToken(安装脚本返回的)→ 服务端签发 reconnection token → 后续重连使用此 token
  • 重连流程:使用之前签发的 reconnection token → 仅在同一个 server 实例内有效
  • Bug 表现:server 重启后(新实例),客户端仍尝试用旧 server 签发的 reconnection token 连接