Dlaczego FileZilla jest o wiele szybsza niż PSFTP?

11

Używam FileZilla 3.10.3 i PSFTP 0.63 (PuTTY). Czy ktoś może mi pomóc dowiedzieć się, dlaczego przepustowość, którą otrzymuję, jest tak drastycznie różna między dwoma klientami? Nie może to być po prostu wada protokołu SFTP, ponieważ FileZilla (i WinSCP) jest o wiele szybszy! Z góry dziękuję.

Kiedy korzystam z FileZilla do łączenia się z tym samym serwerem przy użyciu jakiegoś protokołu, uzyskuję „dobrą” przepustowość; ~ 1,2 MBPS dla jednego dużego pliku. Oto dziennik:

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

Kiedy używam PSFTP do łączenia się z tym samym serwerem przy użyciu tego samego protokołu i przesyłania tego samego pliku, uzyskuję znacznie wolniejszą przepustowość. Oceniłbym około 150 kb / s (patrząc na bajty we / wy w menedżerze zadań Windows 7). Oto dziennik:

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>
Chris
źródło

Odpowiedzi:

23

FileZilla używa kodu źródłowego PuTTY / psftp do implementacji SFTP. W rzeczywistości FileZilla uruchamia ukryty podproces PSFTP.

Ale korzysta z własnej wersji PSFTP ( FzSFtp.exe), która wykorzystuje kilka optymalizacji (i innych modyfikacji), w tym:

  • Kolejka przesyłania SFTP wynosi 4 MB (w porównaniu do 1 MB w PSFTP)
  • Przydziela pamięć w znacznie większych porcjach (32 KB w porównaniu do 515 B)
  • Wykorzystuje duże bufory sieciowe (4 MB dla SO_RCVBUF i dynamiczny rozmiar dla SO_SNDBUF [przy użyciu SIO_IDEAL_SEND_BACKLOG_QUERY]). PSFTP zachowuje ustawienia domyślne systemu.

FileZilla używa również innego kompilatora (mingw) niż PuTTY (VS), co może się przydać.


WinSCP jest również oparty na kodzie PSFTP (chociaż używa kodu PSFTP wewnętrznie, a nie w podprocesie zewnętrznym) i wykorzystuje podobny zestaw optymalizacji.

Martin Prikryl
źródło
4
Bardzo pouczający, Martin, i dziękuję za WinSCP!
Chris