通过 PuTTY 工具通过 SSH 复制比通过 WinSCP 复制慢

通过 PuTTY 工具通过 SSH 复制比通过 WinSCP 复制慢

使用 PuTTY 工具从我的 Windows PC(1)上传到另一个城市的 Ubuntu 机器(2)的速度很慢。

我通过 OpenVPN 隧道和端口转发到 (2) 对此进行了测试。结果表明,通过 SSH (plink.exe) 或 pscp.exe 使用 rsync (Unison) 比在 (1)->(2) 方向使用 WinSCP (SCP 或 SFTP) 复制慢 70%。下载速度相同。

以下是一些数据:

link    protocol    software  source  target  max speed (kb/s)
theoretical speed 4.5mbits      1       2       560
theoretical speed 6.0mbits      2       1       750
VPN     SFTP        pscp.exe    1       2       180 <- not ok
VPN     SFTP        pscp.exe    2       1       640
VPN     SFTP        winscp      1       2       570 <- ok
VPN     SFTP        winscp      2       1       670
PF      SFTP        pscp.exe    1       2       185 <- not ok
PF      SFTP        pscp.exe    2       1       700
PF      SFTP        winscp      1       2       600 <- ok
PF      SFTP        winscp      2       1       680

Unison 的速度几乎与 pscp 完全相同。

我通过 Wireshark 检查了我的数据包,但似乎没有什么特别的。只是 WinSCP 在相同时间内发送的数据包数量是原来的两倍多。

发送方式:
WinSCP:2 或 3 SSH1 到服务器,1 返回(ACK)

No.     Time           Source                Destination           Protocol Length Info
797 1.003187000    10.8.0.6              10.8.0.10             TCP      54     22?51739 [ACK] Seq=5089 Ack=496673 Win=7079 Len=0
798 1.003208000    10.8.0.10             10.8.0.6              SSH      1241   Client: Encrypted packet (len=1187)
799 1.003211000    10.8.0.10             10.8.0.6              SSH      1241   Client: Encrypted packet (len=1187)
800 1.008147000    10.8.0.6              10.8.0.10             TCP      54     22?51739 [ACK] Seq=5089 Ack=499047 Win=7079 Len=0
801 1.008166000    10.8.0.10             10.8.0.6              SSH      1241   Client: Encrypted packet (len=1187)
802 1.008180000    10.8.0.10             10.8.0.6              SSH      1241   Client: Encrypted packet (len=1187)
803 1.008357000    10.8.0.6              10.8.0.10             TCP      54     22?51739 [ACK] Seq=5089 Ack=501421 Win=7079 Len=0

pscp:4 个 SSH2 到服务器,2 个返回(ACK)和一个 SSH2 返回

No.     Time           Source                Destination           Protocol Length Info
210 11.000452000   10.8.0.6              10.8.0.10             TCP      54     22?51744 [ACK] Seq=6178 Ack=97187 Win=185856 Len=0
211 11.005520000   10.8.0.6              10.8.0.10             TCP      54     22?51744 [ACK] Seq=6178 Ack=98989 Win=185856 Len=0
212 11.005585000   10.8.0.10             10.8.0.6              SSHv2    1241   Client: Encrypted packet (len=1187)
213 11.005589000   10.8.0.10             10.8.0.6              SSHv2    1241   Client: Encrypted packet (len=1187)
214 11.005591000   10.8.0.10             10.8.0.6              SSHv2    1241   Client: Encrypted packet (len=1187)
215 11.005592000   10.8.0.10             10.8.0.6              SSHv2    669    Client: Encrypted packet (len=615)
216 11.006578000   10.8.0.6              10.8.0.10             SSHv2    134    Server: Encrypted packet (len=80)
217 11.032385000   10.8.0.6              10.8.0.10             TCP      54     22?51744 [ACK] Seq=6258 Ack=101363 Win=185856 Len=0
218 11.037768000   10.8.0.6              10.8.0.10             TCP      54     22?51744 [ACK] Seq=6258 Ack=103165 Win=185856 Len=0

Ubuntu 机器没有提供 SSH1,WinSCP 在其配置中也选择了 SSH2。

另一个区别是 WIN 和 ACK 值

  1. ACK和WIN对传输速度有影响吗?
  2. 什么原因导致了这个问题?

编辑:我使用 Cygwin 和 OpenSSH 进行了测试:速度与 WinSCP 相同。我制作了两张图来比较 WinSCP 和 PuTTY TCP 信息,以下是不同之处:

                   PuTTY  WinSCP
TCP Segment Len:   615    1187
TCP Push:          Set    Not set
Window size value  4014   4118
calc. Window size  16056  16472
[Bytes in flight:] 8352   91399
  1. TCP Push 标志可能是原因吗?

更新——4 月 20 日。

link    protocol    software  source  target  max speed (kb/s)
cVPN    SFTP        pscp.exe    3       4       250 <- not ok
cVPN    SFTP        winscp      3       4       580 <- ok
cLAN    SFTP        pscp.exe    3       4       10200 <- maybe not ok
cLAN    SFTP        winscp      3       4       11500 <- as expected

cVPN=我家局域网的商业VPN,cLAN=我的办公室局域网,(3)->(4)=从办公室笔记本电脑复制到数据中心服务器。这里 pscp 的速度也比 winscp 慢!

pscp 的数据包顺序太简单了。检查数据包后,样式更像是

...
8  client data (100% fill)
9  client data (100%)
10 client data (60%)
11 server data?
12 server ACK to packet #1
13 server ACK to packet #3
14 client ACK to packet #11
...

这是非常稳定的。WinSCP 反而会对更早的数据包进行 ACK,从而生成更多的传输数据包和更高的吞吐量,因为它似乎在发送下一个数据包之前不会等待 ACK。

这似乎是由于 PuTTY 等待 ACK 而不是仅仅发送更多数据包(WinSCP 所做的)造成的。

其他测试:

ctcp (de)activated - no change
rtt to ack winscp = 100ms
irtt winscp no info
rtt to ack pscp   = 50ms
irtt pscp = 40ms
winscp: window scaling status: unknown (-1)
pscp:   window scaling status: disabled(-2)

我很乐意进行更多测试,但不知道要测试、尝试和监控什么。

答案1

WinSCP 内部使用 PuTTY 代码。因此,所选的加密算法应该没有任何区别。

尽管 WinSCP 在 PuTTY 代码上进行了一些优化,特别是更大的内部和网络缓冲区。这在某些情况下有助于实现更好的吞吐量。

一些参考资料:
https://winscp.net/tracker/615
https://winscp.net/tracker/690
https://winscp.net/tracker/1273
https://winscp.net/tracker/1295


关于“TCP Push”标志:

这可能是因为 WinSCP 禁用了Nagle 算法在套接字上,而 PuTTY 传输工具则没有(PuTTY 本身有)。

我希望在任何合理的网络上,这不会造成任何差异,因为两个应用程序都会尽快将数据推送到套接字,因此网络层没有理由延迟数据包。而且我绝对没有看到任何网络对此进行测试时有任何差异。但我从一些用户那里得到报告说这会产生影响。

虽然您可以在 PuTTY 终端配置中切换 Nagle 算法,但您无法在 PuTTY 传输工具(psftp 和 pscp)中切换它,它始终处于启用状态。
https://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter4.html#config-nodelay

答案2

最好的建议是常见问题解答 - WINSCP SPEED,另外 — 将 WINSCP 更新到最新版本。

引用:

使用 SSH 时,WinSCP 中的文件传输是加密的,并且占用大量 CPU。Blowfish 通常比 AES 快很多(因此,请尝试 BLOWFISH)。如果您之前已打开压缩,则关闭压缩也可能会有所帮助。

如果速度因连接延迟而受到限制,使用 SCP 协议而不是 SFTP 可能会有所帮助。SCP 受延迟的影响较小。在这种情况下,打开压缩可能会有所帮助。

答案3

Pscp 没有 -c 开关来选择 *nix 上的 scp 等密码。为了解决这个问题,您可以将目标主机保存为 putty 会话,这样您就可以更改密码选择顺序。Blowfish 的性能往往比默认的 AES 更好。

答案4

WinSCP 本身(除非他们在最新版本中修复了?)与其他程序相比速度非常慢,我推荐使用 Filezilla 而不是 WinSCP,与 winscp 相比,它的 ssh 文件传输速度要快得多。

相关内容