More .NET libraries
- 
                                
                                    
                                
                                Rebex FTP
                                .NET FTP client
 - 
                                
                                    
                                
                                Rebex SSH Shell
                                .NET SSH Shell
 - 
                                
                                    
                                
                                Rebex Total Pack
                                All Rebex .NET libraries together
 
Back to feature list...
Transfer speed management
On this page:
Limiting transfer speed (bandwidth throttling)
High transfer speed is not always desirable - if you prefer high network throughput, you might wish to limit the transfer speed.
    To achieve this, use MaxDownloadSpeed and MaxUploadSpeed properties:
// set download and upload speed limits sftp.MaxDownloadSpeed = 4 * 1024; sftp.MaxUploadSpeed = 2 * 1024; // transfer files // ...
' set download and upload speed limits sftp.MaxDownloadSpeed = 4 * 1024 sftp.MaxUploadSpeed = 2 * 1024 ' transfer files ' ...
Speed monitoring (transfer speed event)
    To keep informed about the current speed of the transfer (in order to display it to the user, for example),
    register a TransferProgressChanged event handler. Current transfer speed is available through
    SftpTransferProgressChangedEventArgs.BytesPerSecond property,
    moving average calculation is used to smooth the value.
Sample event handler:
void client_SpeedMonitoring(object sender, SftpTransferProgressChangedEventArgs e)
{
    // display current speed info
    Console.WriteLine("Current speed: {0} B/s", e.BytesPerSecond);
}
Sub client_SpeedMonitoring(ByVal sender As Object, ByVal e As SftpTransferProgressChangedEventArgs)
    ' display current speed info
    Console.WriteLine("Current speed: {0} B/s", e.BytesPerSecond)
End Sub
Registering the event handler:
// register TransferProgressChanged event handler sftp.TransferProgressChanged += client_SpeedMonitoring; // transfer files // ...
' register TransferProgressChanged event handler AddHandler sftp.TransferProgressChanged, AddressOf client_SpeedMonitoring ' transfer files ' ...
Optimized transfer (request queuing)
In SFTP protocol, files are transferred in blocks of several kilobytes each. For each block, the client needs to send a request and receive a response.
    This is how a simple transfer might look like at the protocol level:
    Client request 1: Read 10000 bytes at position 0.
Server response 1: Success. Data: [data blob]
Client request 2: Read 10000 block at position 10000.
Server response 2: Success. Data: [data blob]
Client request 3: Read 10000 block at position 20000.
Server response 3: Success. Data: [data blob]
Client request 4: Read 10000 block at position 30000.
Server response 4: Success. Data: [data blob]
...
However, this simple approach would result in suboptimal transfer speed on high-latency networks because the server has nothing to do while waiting for each subsequent request.
    To achieve higher throughput, Rebex SFTP uses a more advanced approach - request queueing:
    Client request 1: Read 10000 bytes at position 0.
Client request 2: Read 10000 block at position 10000.
Client request 3: Read 10000 block at position 20000.
Server response 1: Success. Data: [data blob]
Client request 4: Read 10000 block at position 30000.
Server response 2: Success. Data: [data blob]
Client request 5: Read 10000 block at position 40000.
Server response 3: Success. Data: [data blob]
Client request 6: Read 10000 block at position 50000.
Server response 4: Success. Data: [data blob]
...
    This eliminates the delay at the server - it no longer has to wait for subsequent requests because
    they are already in its request queue.
    All properly implemented SFTP servers should support this approach and it is enabled by default.
    To switch it off (not recommended), set Sftp.Settings.DisableTransferQueue to true.
    Tip: To tweak transfer queue lengths and buffer sizes, use
    Sftp.Settings.DownloadQueueLength/Sftp.Settings.UploadQueueLength and
    Sftp.Settings.DownloadBufferSize/Sftp.Settings.UploadBufferSize properties.
Large buffer mode
    Occasionally, using larger buffers may increase the transfer speed, particularly for downloads.
    Set Sftp.Settings.UseLargeBuffers to true to use larger buffers.
Internal buffer sizes:
| Buffer | No option | UseLargeBuffers | 
|---|---|---|
| TCP socket's receive buffer | Socket's default | 4MB | 
| TCP socket's send buffer | Socket's default | 256KB | 
| SSH channel's receive buffer | 128KB | 2MB | 
Back to feature list...