Почему FileZilla намного быстрее PSFTP?

Почему FileZilla намного быстрее PSFTP?

Я использую FileZilla 3.10.3 и PSFTP 0.63 (PuTTY). Может ли кто-нибудь помочь мне понять, почему пропускная способность, которую я получаю, так сильно отличается между двумя клиентами? Это не может быть просто недостатком протокола SFTP, потому что FileZilla (и WinSCP) намного быстрее! Заранее спасибо.

При использовании FileZilla для подключения к тому же серверу по какому-то протоколу я получаю "хорошую" пропускную способность; ~1,2 МБ/с для одного большого файла. Вот лог:

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 кбит/с (смотря на байты ввода-вывода в диспетчере задач Windows 7). Вот журнал:

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>

решение1

FileZilla использует исходный код PuTTY/psftp для реализации SFTP. На самом деле FileZilla запускает скрытый подпроцесс PSFTP.

Но он использует собственную сборку PSFTP ( FzSFtp.exe), которая использует несколько оптимизаций (и других модификаций), включая:

  • Очередь передачи SFTP составляет 4 МБ (по сравнению с 1 МБ в PSFTP)
  • Выделяет память гораздо большими блоками (32 КБ по сравнению с 515 Б)
  • Использует большие сетевые буферы (4 МБ для SO_RCVBUF и динамический размер для SO_SNDBUF [используя SIO_IDEAL_SEND_BACKLOG_QUERY]). PSFTP сохраняет системные настройки по умолчанию.

FileZilla также использует другой компилятор (mingw), нежели PuTTY (VS), что может иметь значение.


WinSCP также основан на коде PSFTP (хотя он использует код PSFTP внутренне, а не во внешнем подпроцессе) и использует аналогичный набор оптимизаций.

Связанный контент