通过 Putty 工具通过 SSH 进行复制比通过 WinSCP 复制要慢

Bad*_*Man 7 ssh sftp putty 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

cVPN=commercialVPN 在我家局域网,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
...
Run Code Online (Sandbox Code Playgroud)

这是非常稳定的。相反,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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ryl 7

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 推送”标志:

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

我希望在任何合理的网络上,这应该没有任何区别,因为两个应用程序都尽可能快地将数据推送到套接字,因此网络层应该没有理由延迟数据包。而且我绝对没有看到任何网络在测试时有任何区别。但是我从一些用户那里得到报告说它有所作为。

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


小智 -1

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