web-dev-qa-db-ja.com

FileZillaがPSFTPよりもはるかに高速なのはなぜですか?

FileZilla 3.10.3とPSFTP 0.63(PuTTY)を使用しています。 2つのクライアント間でスループットが大幅に異なる理由を誰かが理解するのを手伝ってくれる? FileZilla(およびWinSCP)は非常に高速であるため、SFTPプロトコルの欠点になるだけではありません。前もって感謝します。

FileZillaを使用して、いくつかのプロトコルを使用して同じサーバーに接続すると、「良好な」スループットが得られます。 1つの大きなファイルで約1.2MBPS。ここにログがあります:

Response: fzSftp started, protocol_version=2
Command: open "[email protected]" 22
Trace: Looking up Host "ftp.themcorp.com"
Trace: Connecting to 222.22.111.33 port 22
Trace: We claim version: SSH-2.0-PuTTY_Local:_Mar_29_2015_12:25:15
Trace: Server version: SSH-2.0-9.99 sshlib: 8.1.0.0
Trace: Using SSH protocol version 2
Trace: Doing Diffie-Hellman group exchange
Trace: Doing Diffie-Hellman key exchange with hash SHA-1
Trace: Host key fingerprint is:
Trace: ssh-dss 1024 20:88:a6:92:fe:11:db:b4:9a:b5:9e:8b:5f:50:bb:77
Trace: Initialised AES-256 SDCTR client->server encryption
Trace: Initialised HMAC-SHA1 client->server MAC algorithm
Trace: Initialised AES-256 SDCTR server->client encryption
Trace: Initialised HMAC-SHA1 server->client MAC algorithm
Command: Pass: ********
Trace: Sent password
Trace: Access granted
Trace: Opening session as main channel
Trace: Opened main channel
Trace: Started a Shell/command
Status: Connected to ftp.themcorp.com
Trace: CControlSocket::ResetOperation(0)
Status: Starting upload of c:\temp\test.Zip
Command: cd "/Home/mecorp"
Response: New directory is: "/Home/mecorp"
Trace: CControlSocket::ResetOperation(0)
Trace: FileTransferSend()
Command: put "c:\temp\test.Zip" "test.Zip"
Status: local:c:\temp\test.Zip => remote:/Home/mecorp/test.Zip
Trace: FileTransferParseResponse()
Trace: CControlSocket::ResetOperation(0)
Status: File transfer successful, transferred 27,974,088 bytes in 21 seconds

PSFTPを使用して、同じプロトコルを使用して同じサーバーに接続し、同じファイルを転送すると、スループットが大幅に低下します。私は約150 kbpsを見積もります(Windows 7タスクマネージャーのI/Oバイトを見てください)。ここにログがあります:

C:\temp>c:\d2\trunk\Util\psftp.exe -v -l mecorp -pw topsecret -P 22 ftp.themcorp.com
Looking up Host "ftp.themcorp.com"
Connecting to 222.22.111.33 port 22
Server version: SSH-2.0-9.99 sshlib: 8.1.0.0
Using SSH protocol version 2
We claim version: SSH-2.0-PuTTY_Release_0.63
Doing Diffie-Hellman group exchange
Doing Diffie-Hellman key exchange with hash SHA-1
Host key fingerprint is:
ssh-dss 1024 20:88:a6:92:fe:11:db:b4:9a:b5:9e:8b:5f:50:bb:77
Initialised AES-256 SDCTR client->server encryption
Initialised HMAC-SHA1 client->server MAC algorithm
Initialised AES-256 SDCTR server->client encryption
Initialised HMAC-SHA1 server->client MAC algorithm
Using username "mecorp".
Sent password
Access granted
Opening session as main channel
Opened main channel
Started a Shell/command
Connected to ftp.themcorp.com
Remote working directory is /Home/mecorp
psftp> put test.Zip test.Zip
local:test.Zip => remote:/Home/mecorp/test.Zip
psftp>
11
Chris

FileZillaは、SFTP実装にPuTTY/psftpソースコードを使用します。実際には、FileZillaは非表示のPSFTPサブプロセスを実行します。

ただし、独自のPSFTPビルド(FzSFtp.exe)以下を含むいくつかの最適化(およびその他の変更)を採用しています。

  • SFTP転送キューは4 MB(PSFTPの1 MBと比較)
  • より大きなチャンクでメモリを割り当てます(515 Bと比較して32 KB)
  • 大きなネットワークバッファーを使用します(SO_RCVBUFには4 MB、SO_SNDBUFには動的サイズ[SIO_IDEAL_SEND_BACKLOG_QUERYを使用])。 PSFTPはシステムのデフォルトを維持します。

FileZillaは、PuTTY(VS)とは異なるコンパイラ(mingw)も使用しているため、貢献している可能性があります。


WinSCPもPSFTPコードに基づいており(外部サブプロセスではなく内部でPSFTPコードを使用します)、同様の最適化セットを使用します。

23
Martin Prikryl