Bad transfer performance with FTP on high latency links
Hi,
We are using WinSCP as FTP-client and found it very useful. Thank you.
However, some of the server to which we upload are connected with large bandwidth (>100mbit/s) links, but which have high latency (>100ms). This is generally known as "long fat pipes" [1].
TCP has had multiple updates to accommodate this kind of links: new congestion mechanisms, window scaling, selective ACK, etc. New operating systems (e.g. Windows Vista and later) automatically use all these when CTCP is enabled (netsh interface tcp set global congestionprovider=ctcp), but also the application must have large TCP-buffers in use to fully benefit from this.
Would it be possible to have the TCP buffer sizes configurable, or at least hard coded to sufficiently large: 2 or 4 megabytes. I have actually patched the winscp.exe binary, to use larger TCP-buffers and fixed everything.
The patching is equivalent to modifying filezilla/TransferSocket.cpp, there's two parts that do SetSockOpt(SO_SNDBUF). However, the buffer size you pass there (2*BUFSIZE)=(2*16384)=32kB. However, that is far too low for "long fat pipes" such us ours. The buffer should be 2-4 megabytes.
Kind Regards,
We are using WinSCP as FTP-client and found it very useful. Thank you.
However, some of the server to which we upload are connected with large bandwidth (>100mbit/s) links, but which have high latency (>100ms). This is generally known as "long fat pipes" [1].
TCP has had multiple updates to accommodate this kind of links: new congestion mechanisms, window scaling, selective ACK, etc. New operating systems (e.g. Windows Vista and later) automatically use all these when CTCP is enabled (netsh interface tcp set global congestionprovider=ctcp), but also the application must have large TCP-buffers in use to fully benefit from this.
Would it be possible to have the TCP buffer sizes configurable, or at least hard coded to sufficiently large: 2 or 4 megabytes. I have actually patched the winscp.exe binary, to use larger TCP-buffers and fixed everything.
The patching is equivalent to modifying filezilla/TransferSocket.cpp, there's two parts that do SetSockOpt(SO_SNDBUF). However, the buffer size you pass there (2*BUFSIZE)=(2*16384)=32kB. However, that is far too low for "long fat pipes" such us ours. The buffer should be 2-4 megabytes.
Kind Regards,