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

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

我testing了这个OpenVPN隧道,并通过端口转发到(2)。 事实certificate,通过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也在其configuration中select了SSH2。

另一个区别是WIN和ACK值

  1. ACK和WIN对传输速度有什么影响?
  2. 什么可能导致这个问题?

编辑:我用Cygwin和OpenSSHtesting:与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 Lan,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而不是仅仅发送更多的数据包(winscp所做的)造成的。

其他testing:

 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) 

我会很高兴testing更多,但不知道要testing什么,尝试和监控。

WinSCP在内部使用PuTTY代码。 所以select的encryptionalgorithm应该没有什么区别。

尽pipeWinSCP在PuTTY代码之上使用了一些优化,特别是更大的内部和networking缓冲区。 这有助于在某些情况下达到更好的吞吐量。

一些参考:
https://winscp.net/tracker/show_bug.cgi?id=615
https://winscp.net/tracker/show_bug.cgi?id=690
https://winscp.net/tracker/show_bug.cgi?id=1273
https://winscp.net/tracker/show_bug.cgi?id=1295


关于“TCP推送”标志:

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

我希望在任何合理的networking上,这应该不会有什么不同,因为这两个应用程序都尽可能快地将数据推送到套接字,所以networking层应该没有理由延迟数据包。 我绝对没有看到任何networking在testing这个差异。 但是我有一些用户的报告,它有所作为。

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

常见问题解答 – WINSCP SPEED ,PLUS最好的build议- 将WINSCP更新到最新版本。

引用:

在使用SSH时,WinSCP中的文件传输是encryption的,并且是CPU密集型的。 河豚通常要比AES快很多(所以,试试BLOWFISH)。 如果您closures压缩,也可能会有所帮助,如果之前已打开压缩。

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

Pscp没有-c开关在* nix上select一个像scp这样的密码。 为了解决这个问题,你可以把你的目标主机保存为一个putty会话,它允许你改变密码select顺序。 河豚倾向于提供比默认的AES更好的性能。

WinSCP本身(除非它们修复在最后的版本中)比其他版本慢得多,我推荐使用WinSCP上的Filezilla,与winscp相比,ssh文件传输更快。