VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传

环境

项目 值
本地系统 Windows 11
远程系统 Windows Server 2025 Datacenter (Build 26100)
VS Code Insiders 1.110.0 (404102fc70f6f15e1aba226b6d56f4c75bd5fa4e)
Remote SSH 扩展 ms-vscode-remote.remote-ssh 0.122.0
连接方式 OpenSSH,公钥认证

现象

VS Code Remote SSH 连接远程 Windows 服务器时,永久卡在"正在下载 VS Code 服务器" ,进度不动,最终超时失败。SSH 连接本身正常(ssh 上科大A服务器 "echo connected" 能输出 connected)。

诊断过程

1. 定位 DNS 解析问题

VS Code Server 下载流程:update.code.visualstudio.com → 302 重定向 → vscode.download.prcdn.microsoft.com。

在远程服务器上用 nslookup 测试:

cmd 复制代码
nslookup vscode.download.prcdn.microsoft.com
arduino 复制代码
*** UnKnown can't find vscode.download.prcdn.microsoft.com: Non-existent domain

根因找到:远程服务器的内网 DNS(192.168.1.5)无法解析 prcdn.microsoft.com 域名。

2. 排查可用的 CDN

微软 VS Code 有多个 CDN 域名。逐一在远程服务器上测试 DNS 解析:

CDN 域名 DNS 解析 说明
vscode.download.prcdn.microsoft.com 失败 默认重定向目标
az764295.vo.msecnd.net 成功 旧版 CDN,本地也无法解析
vscode.download.prss.microsoft.com 成功 解析到金山云 CDN 节点

在远程服务器上验证 prss 域名可达:

powershell 复制代码
# 在远程服务器上执行
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
(Invoke-WebRequest -Uri 'https://vscode.download.prss.microsoft.com/dbazure/download/insider/<commit>/vscode-server-win32-x64.zip' -Method Head -UseBasicParsing -TimeoutSec 10).StatusCode
# 返回 200

3. 发现连接不稳定问题

虽然 prss CDN 可达,但直接用 WebClient.DownloadFile() 下载时,约在传输 25MB(~39%)时连接中断,zip 文件不完整,无法解压。多次尝试均在相同位置断开,说明是 CDN 边缘节点的连接保持问题。

4. 排除镜像方案

批量测试了 10+ 个国内镜像(华为云、阿里云、腾讯云、npmmirror、中科大、山大等),Insiders 版本均未被同步,全部 404 或返回 HTML 错误页。镜像方案仅适用于 Stable 版。

解决方案:BITS 断点续传

Windows 自带的 BITS(后台智能传输服务)原生支持断点续传,连接中断后自动恢复。将以下脚本保存到远程服务器并执行:

powershell 复制代码
# install-vscode-server.ps1
# 用法:修改 $commit 为你的 VS Code commit ID,然后在远程服务器上执行

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$commit = "404102fc70f6f15e1aba226b6d56f4c75bd5fa4e"  # ← 替换为你的 commit ID
$url = "https://vscode.download.prss.microsoft.com/dbazure/download/insider/$commit/vscode-server-win32-x64.zip"
# Stable 版本把 insider 改为 stable

$dir = "$env:USERPROFILE\.vscode-server-insiders\bin\$commit"
# Stable 版本用 .vscode-server 而非 .vscode-server-insiders
$zip = "$dir\vscode-server.zip"

New-Item -ItemType Directory -Force $dir | Out-Null
Remove-Item $zip -Force -ErrorAction SilentlyContinue

# BITS 下载,自动断点续传
Write-Host "Downloading via BITS..."
$job = Start-BitsTransfer -Source $url -Destination $zip -Asynchronous
$retries = 0
while ($job.JobState -ne 'Transferred' -and $retries -lt 3) {
    if ($job.JobState -eq 'TransientError' -or $job.JobState -eq 'Error') {
        Write-Host "Transfer interrupted, resuming... (attempt $($retries+1))"
        Resume-BitsTransfer -BitsJob $job -Asynchronous
        $retries++
    }
    $pct = if ($job.BytesTotal -gt 0) { [math]::Round($job.BytesTransferred/$job.BytesTotal*100,1) } else { 0 }
    Write-Host "  $pct% ($($job.BytesTransferred) / $($job.BytesTotal))"
    Start-Sleep -Seconds 3
}
if ($job.JobState -eq 'Transferred') {
    Complete-BitsTransfer -BitsJob $job
    Write-Host "Download complete!"
} else {
    Write-Host "BITS failed: $($job.JobState)"; exit 1
}

# 解压
Write-Host "Extracting..."
Expand-Archive -Path $zip -DestinationPath $dir -Force
Remove-Item $zip -Force

# 如果解压后多了一层目录,提升到上层
$sub = Get-ChildItem $dir -Directory | Select-Object -First 1
if ($sub) {
    Get-ChildItem $sub.FullName | Move-Item -Destination $dir -Force
    Remove-Item $sub.FullName -Recurse -Force
}

Write-Host "Installed! Verify:"
Get-ChildItem $dir | Select-Object Name

获取 Commit ID

在本地 VS Code 中按 Ctrl+Shift+P → 输入 About → 找到"提交"后面的 40 位哈希值。 或者用命令行:

powershell 复制代码
code-insiders --version   # 第二行就是 commit ID
# 或者 code --version(Stable 版)

执行方式

可以通过 SSH 从本地推送并执行:

powershell 复制代码
scp install-vscode-server.ps1 "远程主机:D:/Users/用户名/install-vscode-server.ps1"
ssh 远程主机 "powershell -ExecutionPolicy Bypass -File D:\Users\用户名\install-vscode-server.ps1"

实际效果

erlang 复制代码
Downloading via BITS...
  78.3% (50069504 / 63943408) - Transferring
  91.9% (58760060 / 63943408) - Transferring   ← 在此断连
Transfer interrupted, resuming... (attempt 1)  ← BITS 自动续传
  92% (58825596 / 63943408) - Connecting
  98.2% (62763418 / 63943408) - Transferring   ← 续传再次断连后再次恢复
Download complete!
Downloaded 63943408 bytes                       ← 完整文件
Extracting...
Installed!

安装完成后重启 VS Code 重新连接,不再卡在下载阶段。

现有方案对比

网上大量文章都是针对 Linux 远程服务器,方案为"手动 wget 下载 + scp 传输 + tar 解压"。本文场景的区别:

差异点 网上常见方案 本文场景
远程 OS Linux Windows Server
失败原因 服务器无外网 有外网但 prcdn DNS 无法解析
下载格式 .tar.gz .zip
传输问题 无 CDN 连接 ~25MB 后中断
解决手段 scp + tar BITS 断点续传
适用版本 Stable Stable + Insiders(镜像站不同步 Insiders)

关键信息速查

  • VS Code Server 下载 URL 模板:https://vscode.download.prss.microsoft.com/dbazure/download/{quality}/{commit}/vscode-server-{os}-{arch}.zip
    • {quality}:stable 或 insider
    • {os}-{arch}:win32-x64、linux-x64、linux-arm64 等
  • 安装目录:%USERPROFILE%\.vscode-server-insiders\bin\{commit}\(Insiders)或 %USERPROFILE%\.vscode-server\bin\{commit}\(Stable)
  • VS Code Remote SSH 扩展中,remote.SSH.useOSS 和 remote.SSH.ossDownloadUrl 可以覆盖 Linux 远程的下载源,但 Windows 远程的 PowerShell 下载脚本硬编码了 update.code.visualstudio.com,无法通过设置修改
相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
rockmelodies3 天前
# Windows Server2008 R2 Standard(SP1镜像U盘)重置本地管理员密码【完整详细步骤】
windows·密码破解
Julien20044 天前
Docker 容器存储原理(一)
linux·运维·服务器·ssh·学习方法
kakakahahahaha4 天前
Windows C盘空间不足的安全清理与迁移流程
windows·电脑·笔记本电脑·软件需求·c盘清理
做咩啊~4 天前
远程连接提示:身份验证错误,要求的函数不受支持
windows
Polevne4 天前
C# SFTP客户端实现文件传输
c#·ssh
百事牛科技4 天前
PPT只读怎么取消?四种情况分别处理
windows·powerpoint
熊明才5 天前
WSL2 网络突然瘫痪(Network is unreachable / 没有 eth0)最短修复指南(2026年9月20日亲测可用)
linux·windows·wsl2
free-elcmacom5 天前
发际线警告!手撕《C陷阱与缺陷》终极 BOSS:signal 函数与 typedef 魔法
c语言·开发语言·visual studio code·visual studio
前端小白乘风5 天前
VS Code 终于能连微信了!发现一个硬核开源神仙插件:WeChat AHP
微信·visual studio code·deepseek