vsftpd的超时与流控机制

最近有个项目需要使用vsftpd 3.0.2,看了少部分代码,分析了两个参数。

idle_session_timeout

The timeout, in seconds, which is the maximum time a remote client may spend between FTP commands. If the timeout triggers, the remote client is kicked off.
Default: 300(秒)
这个参数是指等待输入FTP指令的空闲时间(秒)。初次连上FTP服务后、或上一次FTP指令执行完成后,开始计时。相当于使用FTP客户端命令行工具时,出现输入提示符,等待用户输入的时间。
这个时间超时,客户端的(一个TCP,命令)连接会被断开。

data_connection_timeout

The timeout, in seconds, which is roughly the maximum time we permit data transfers to stall for with no progress.
If the timeout triggers, the remote client is kicked off.
Default: 300(秒)
这个参数是指等待数据传输(上传/下载)的空闲时间(秒)。当FTP服务端每接收/或发送一次数据包(trans_chunk_size大小,默认值是8KB),就会复位一次这个定时器。相当于使用FTP客户端命令行工具时,出现传输速率为0的持续时间。
这个时间超时,客户端的(两个TCP,命令与数据)连接都会被断开。

当 data_connection_timeout 定时器启动时,idle_session_timeout定时器会停止。即两个定时,同一时刻只有一个有效!

trans_chunk_size

You probably don’t want to change this, but try setting it to something like 8192 for a much smoother bandwidth limiter.
Default: 0 (let vsftpd pick a sensible setting)
每次收发数据的大小,字节/秒。
实际上,每次收发数据的多少,是由函数get_chunk_size()确定的:

#define VSFTP_DATA_BUFSIZE      65536   # 64KB

......

void
tunables_load_defaults()
{
  ......
  tunable_trans_chunk_size = 0;
  ......
}

static unsigned int get_chunk_size()
{
  unsigned int ret = VSFTP_DATA_BUFSIZE;
  if (tunable_trans_chunk_size < VSFTP_DATA_BUFSIZE &&
      tunable_trans_chunk_size > 0)
  {
    ret = tunable_trans_chunk_size;
    if (ret < 4096)
    {
      ret = 4096;
    }
  }
  return ret;
}

当 0 < trans_chunk_size < VSFTP_DATA_BUFSIZE时, get_chunk_size() 最小为 4096;否则get_chunk_size() 为VSFTP_DATA_BUFSIZE。
每次收发完成VSFTP_DATA_BUFSIZE大小的数据

local_max_rate

The maximum data transfer rate permitted, in bytes per second, for local authenticated users.
Default: 0 (unlimited)
本地认证用户最大传输速率,单位:字节/秒。

每次收发完 get_chunk_size() 大小的数据,vsftpd就开始进行流控 —— 计算需要等待的时间,然后就开始休眠(“nanosleep()”)。醒来后再进行下一次的传输。

举两个例子,当 get_chunk_size() 为 65536时:

  • 当你把 local_max_rate 设为 1024 字节/秒时,若每次发送 65536字节的数据则需要 64秒。例如你在20ms内传输完了65536字节的数据,那么你还要等64-0.02=63.98秒,才会再次收到数据。
  • 当你把 local_max_rate 设为 10240 字节/秒时,若每次发送 65536字节的数据则需要 6.4秒。例如你在20ms内传输完了65536字节的数据,那么你还要等6.4-0.02=6.38秒,才会再次收到数据。

你可能感兴趣的:(vsftpd的超时与流控机制)