测试目标:使用 OpenSSH 客户端 对两个 .NET SSH 服务端库 FxSsh (commit 3f7eb6) 与 Dev Tunnels SSH (
Microsoft.DevTunnels.Ssh3.12.40) 的能力、传输速度、内存占用 进行全面测试,覆盖各自每一种可用的密码算法。
0. 摘要
| 维度 | 结论 |
|---|---|
| 密码算法广度 | 两库都只支持 3 种密码 ,且都不支持 chacha20-poly1305、3des-cbc、aes*-cbc(除 DevTunnels 的 aes256-cbc)、arcfour 等。FxSsh 独有 aes128-gcm;DevTunnels 独有 aes256-cbc。 |
| 密钥交换 | FxSsh 更广(6 种,含 group18-sha512 与 ecdsa-nistp521);DevTunnels 仅 4 种,缺 group18 与 nistp521。 |
| 主机密钥 | FxSsh 支持 5 种(含 ecdsa-nistp521);DevTunnels 仅 4 种,缺 nistp521,且两者都不支持 ssh-ed25519 / ssh-rsa(SHA1)。 |
| 速度 | FxSsh 整体更快 。同档 CTR:FxSsh 161 MB/s vs DevTunnels 56 MB/s(≈2.9×);同档 GCM:FxSsh 311 MB/s vs DevTunnels 243 MB/s(≈1.3×)。DevTunnels 的 CTR 模式是明显短板(~57 MB/s)。 |
| 内存 | FxSsh 更精简:基线 67 MB、峰值 ~93 MB;DevTunnels 基线 83 MB、峰值 ~99 MB(多约 15 MB 基线、5--8 MB 峰值)。 |
1. 测试对象
| 库 | 版本 / 提交 | 定位 | 类型 |
|---|---|---|---|
| aimeast/FxSsh | commit 3f7eb6 |
高层 SSH 服务端库(含 sftp/exec/shell/tcp-forward) | 服务端库 |
| Microsoft Dev Tunnels SSH | NuGet Microsoft.DevTunnels.Ssh 3.12.40 |
底层 SSH 协议库(无 SshServer 类、无内置 SFTP) |
协议库 |
DevTunnels.Ssh 是底层协议库,不提供现成的 SSH 服务器或 SFTP 服务。为实现公平对比,两个库都采用 exec 通道 (
bash -c '...')承载数据传输,绕开 DevTunnels 缺失的 SFTP。
2. 测试环境
| 项 | 值 |
|---|---|
| 操作系统 | Linux 6.6.117 (x86_64) |
| CPU | AMD EPYC 9754 128-Core(可见 32 vCPU) |
| 内存 | 126 GB |
| .NET | 10.0.302 (SDK + Runtime) |
| OpenSSH 客户端 | OpenSSH_9.6p1, OpenSSL 3.0.13 |
| 网络 | 本地回环 127.0.0.1(排除网络带宽干扰,瓶颈落在 .NET 服务端加密速度) |
| 服务端端口 | FxSsh → 2222;DevTunnels → 2223 |
| 认证 | none(两库均开启 none 认证,仅用于基准测试) |
3. 测试方法与公平性说明
- 能力探测 :对 OpenSSH 客户端的
ssh -Q cipher/kex/mac/key每一项算法,分别用-c/-o KexAlgorithms=/-o MACs=/-o HostKeyAlgorithms=强制指定该算法发起真实握手。握手成功即记为该库支持该算法(即"客户端 ∩ 服务端"可协商集合,也就是真实可用能力)。 - 传输速度 :每条连接执行
ssh host 'head -c 200000000 /dev/zero'(200 MB 纯 CPU 负载,避免磁盘 I/O 干扰),用date +%s.%N计时;下载方向由服务端加密 ,因此吞吐量反映 .NET 服务端库该密码算法的加密性能。每算法 预热 1 次 + 实测 5 次,取中位数为主、均值/极值辅助。 - 内存占用 :在传输进行期间轮询服务端进程
/proc/<pid>/status的VmRSS(当前常驻)并取峰值;另记录VmHWM(进程生命周期峰值)与连接前基线VmRSS。 - 完整性校验:每次传输后比对接收字节数(均为 200 000 000 字节),确认 exec 通道二进制安全。
- 传输载体统一 :两库均使用 exec(
cat/head),保证对比基准一致。
4. 能力对比(基于 OpenSSH 真实握手)
4.1 密码算法(Encryption / Cipher)
| 算法 | FxSsh | DevTunnels | 说明 |
|---|---|---|---|
aes256-ctr |
✅ | ✅ | 两者共有 |
aes256-gcm@openssh.com |
✅ | ✅ | 两者共有(AEAD) |
aes128-gcm@openssh.com |
✅ | ❌ | FxSsh 独有 |
aes256-cbc |
❌ | ✅ | DevTunnels 独有 |
aes128-ctr / aes192-ctr |
❌ | ❌ | 两者均未提供 |
aes128-cbc / aes192-cbc / 3des-cbc |
❌ | ❌ | 不支持 |
chacha20-poly1305@openssh.com |
❌ | ❌ | 两者均无 ChaCha20 实现 |
两库默认均只注册 3 种密码 。FxSsh 源码静态注册表为
{aes256-ctr, aes128-gcm, aes256-gcm};DevTunnels 默认配置为{aes256-ctr, aes256-cbc, aes256-gcm}(且其EncryptionAlgorithm仅按 256 位密钥注册,未暴露 128/192 位变体)。
4.2 密钥交换(KEX,固定 aes256-ctr)
| 算法 | FxSsh | DevTunnels |
|---|---|---|
ecdh-sha2-nistp256 |
✅ | ✅ |
ecdh-sha2-nistp384 |
✅ | ✅ |
ecdh-sha2-nistp521 |
✅ | ❌ |
diffie-hellman-group14-sha256 |
✅ | ✅ |
diffie-hellman-group16-sha512 |
✅ | ✅ |
diffie-hellman-group18-sha512 |
✅ | ❌ |
curve25519-sha256 / @libssh.org |
❌ | ❌ |
diffie-hellman-group*-sha1 / -exchange-* |
❌ | ❌ |
sntrup761x25519-sha512@openssh.com |
❌ | ❌ |
FxSsh 的 KEX 覆盖面更广 (6 种 vs 4 种),尤其包含更现代的
group18-sha512与ecdsa-nistp521。
4.3 MAC(固定 aes256-ctr;AEAD 密码下 MAC 不生效)
| 算法 | FxSsh | DevTunnels |
|---|---|---|
hmac-sha2-256 |
✅ | ✅ |
hmac-sha2-512 |
✅ | ✅ |
hmac-sha2-256-etm@openssh.com |
✅ | ✅ |
hmac-sha2-512-etm@openssh.com |
✅ | ✅ |
| 其余(sha1 / md5 / umac / etm 变体) | ❌ | ❌ |
两者 MAC 支持完全一致(仅 SHA-2 系列)。
4.4 主机密钥算法
| 算法 | FxSsh | DevTunnels |
|---|---|---|
rsa-sha2-256 |
✅ | ✅ |
rsa-sha2-512 |
✅ | ✅ |
ecdsa-sha2-nistp256 |
✅ | ✅ |
ecdsa-sha2-nistp384 |
✅ | ✅ |
ecdsa-sha2-nistp521 |
✅ | ❌ |
ssh-ed25519 / ssh-rsa(SHA1) |
❌ | ❌ |
FxSsh 比 DevTunnels 多支持
ecdsa-nistp521主机密钥;两者都不支持ssh-ed25519(现代首选)与ssh-rsa(SHA1)。
4.5 压缩
| 算法 | FxSsh | DevTunnels |
|---|---|---|
none(无压缩) |
✅ | ✅(隐式) |
zlib@openssh.com / zlib |
❌ | ❌ |
两者均不支持 zlib 压缩 。FxSsh 压缩表仅注册
none;DevTunnels 压缩算法列表为空(仅隐式 none)。
5. 传输速度(每种密码算法,200 MB,5 次实测,单位 MB/s)
| 库 | 密码算法 | 中位数 | 均值 | 最小 | 最大 |
|---|---|---|---|---|---|
| FxSsh | aes256-ctr |
161.5 | 188.0 | 143.1 | 302.5 |
| FxSsh | aes128-gcm@openssh.com |
285.8 | 259.8 | 204.7 | 297.1 |
| FxSsh | aes256-gcm@openssh.com |
310.8 | 278.2 | 133.7 | 369.9 |
| DevTunnels | aes256-ctr |
56.0 | 56.4 | 53.2 | 60.9 |
| DevTunnels | aes256-cbc |
179.3 | 177.0 | 162.1 | 183.2 |
| DevTunnels | aes256-gcm@openssh.com |
243.4 | 229.2 | 155.3 | 267.4 |
关键观察:
- FxSsh 在两个共有算法上均更快 :CTR 161 vs 56(≈2.9×),GCM 311 vs 243(≈1.3×)。
- DevTunnels 的 CTR 模式严重偏慢(~57 MB/s) ,仅为自身 GCM 的 1/4、CBC 的 1/3。这是该库
CtrModeCryptoTransform实现的特征性短板。 - FxSsh 的最快算法是
aes256-gcm(311 MB/s);DevTunnels 的最快也是aes256-gcm(243 MB/s)------GCM(AEAD) 是两者的最高性能路径。 - 少数运行出现较大抖动(如 FxSsh gcm 偶发 133 MB/s、ctr 偶发 143 MB/s),源于共享沙箱的 GC/调度波动;中位数已能稳定反映趋势。
6. 内存占用(服务端进程 RSS,单位 KB / 约 MB)
| 库 | 密码算法 | 峰值 RSS 区间 | 均值峰值 | 备注 |
|---|---|---|---|---|
| FxSsh | aes256-ctr |
74 804 -- 87 052 | 83 886 | 基线 67 320 |
| FxSsh | aes128-gcm@openssh.com |
88 776 -- 93 088 | 91 353 | 基线 67 320 |
| FxSsh | aes256-gcm@openssh.com |
89 812 -- 93 512 | 92 026 | 生命周期峰值 VmHWM 90 000 |
| DevTunnels | aes256-ctr |
86 528 -- 91 304 | 88 814 | 基线 82 568 |
| DevTunnels | aes256-cbc |
94 320 -- 94 620 | 94 469 | 基线 82 568 |
| DevTunnels | aes256-gcm@openssh.com |
98 152 -- 98 592 | 98 447 | 生命周期峰值 VmHWM 98 592 |
换算为 MB(÷1024):
| 库 | 基线 RSS | GCM 峰值 | CTR 峰值 |
|---|---|---|---|
| FxSsh | 67.3 MB | ~93.5 MB | ~87.1 MB |
| DevTunnels | 82.6 MB | ~98.6 MB | ~91.3 MB |
关键观察:
- FxSsh 内存占用显著更低:基线少约 15 MB,峰值少约 5--8 MB。
- 两库均呈现 GCM(AEAD) > CTR/CBC 的内存占用(AEAD 需额外 tag/nonce 缓冲),符合预期。
- 单连接传输期间额外内存增量很小(几 MB),说明密码算法本身对常驻内存影响有限,库运行时基线才是主要差异来源。
7. 综合结论
- 算法覆盖面 :FxSsh(较老但功能更全)在 KEX/主机密钥上反而更广 ;DevTunnels(微软官方、偏保守默认配置)仅
aes256系列、缺nistp521/group18、无ssh-ed25519。两者密码算法都很少(各 3 种),且都缺 ChaCha20 这一现代主流算法。 - 性能 :FxSsh 综合性能更优 ,尤其 CTR 模式下约为 DevTunnels 的 3 倍。DevTunnels 的 CTR 实现是明显瓶颈 ,若选用 DevTunnels 应优先使用
aes256-gcm。 - 资源占用 :FxSsh 更轻量(内存少 ~15--20%)。DevTunnels 作为通用隧道协议库,运行时开销更大。
- 工程可用性 :DevTunnels.Ssh 是底层协议库,无现成 SSH 服务器/ SFTP ,需自行用
SshServerSession+ 手动 TCP 接入 + 通道事件处理搭建服务端(本报告即如此实现);FxSsh 提供开箱即用的SshServer与SftpService。若需快速搭建 SSH 服务端,FxSsh 更省事;若已在使用 Dev Tunnels 隧道生态,则 DevTunnels.Ssh 可复用其协议栈(但需自行补齐服务端能力)。 - 安全建议 :两库都支持 AEAD(
aes*-gcm),生产环境应优先选用 GCM 算法以获得加密+完整性一体化与最佳性能。
8. 附录:复现步骤与产物
8.1 服务端程序
- FxSsh 基准服务端:
/root/.codebuddy/artifact/sshbench/fxssh-bench/Program.cs(已构建为FxSshBench.dll) - DevTunnels 基准服务端:
/root/.codebuddy/artifact/sshbench/dt-bench/Program.cs(已构建为DtBench.dll)- 关键实现:用
SshServerSession+TcpListener+ none 认证 +ChannelOpening中挂载ch.Request处理exec;因库未把exec反序列化为CommandRequestMessage,命令字符串改由SshMessage.RawBytes按 SSH 线格式手动解析。
- 关键实现:用
8.2 测试脚本与原始数据
- 能力枚举:
/root/.codebuddy/artifact/sshbench/enum.sh→/tmp/enum_fxssh.txt、/tmp/enum_dt.txt - 速度/内存基准:
/root/.codebuddy/artifact/sshbench/bench.sh→/tmp/bench_results.csv - 服务端日志:
/tmp/fxssh.log、/tmp/dt.log
8.3 运行命令示例
bash
# FxSsh 服务端
dotnet /root/.codebuddy/artifact/sshbench/fxssh-bench/bin/Release/net10.0/FxSshBench.dll 2222
# DevTunnels 服务端
dotnet /root/.codebuddy/artifact/sshbench/dt-bench/bin/Release/net10.0/DtBench.dll 2223
# 单密码握手探测(能力)
ssh -p 2222 -c aes256-ctr -o PreferredAuthentications=none -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null -o BatchMode=yes 127.0.0.1 'true'
# 速度/内存传输
ssh -p 2223 -c aes256-gcm@openssh.com -o PreferredAuthentications=none -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null -o BatchMode=yes 127.0.0.1 'head -c 200000000 /dev/zero' >/dev/null
注:本报告所有"支持/不支持"结论均来自 OpenSSH 客户端与对应服务端的实际握手结果,而非仅凭文档或源码推断。
9. 署名
- 测试执行:workbuddy 自主测试
- 使用智能体:hy3 智能体
- 生成时间:2026-08-03