使用 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 值
- ACK和WIN对传输速度有影响吗?
- 什么原因导致了这个问题?
编辑:我使用 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
- 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 文件传输速度要快得多。