1.NOOP命令和QUIT命令
- 使用vsftpd来测试NOOP命令
服务器端收到NOOP命令后,没有进行任何操作,仅仅给客户端一个200的应答,NOOP的作用是:防止空闲断开,客户端会不定期的向服务器端发送NOOP命令,防止其空闲断开,因为其空闲计数时间idle_session_timeout又开始重新计算了
- eg:miniftpd20\session.c
static void do_noop(session_t *sess)
- eg:miniftpd20\session.c
static void do_noop(session_t *sess)
-
使用vsftp来测试quit命令
从服务器断开,给客户端一个221的响应
-
测试:
客户端连接后,服务端有3个进程
再连接一个客户端,应该是5个进程
ctrl r退出一个会话
退出一个会话,服务端给客户端一个221的应答
此时,服务端只剩下一个会话
2.ABOR命令的实现
-
功能综述
如果在在进行数据传输,那么客户端向服务器发送的ABOR命令是通过紧急模式来传输的,否则是按正常模式传输的。所以要处理ABOR命令,需要开启紧急模式接收数据。
服务器接收这个命令时可能处在两种状态:(1)FTP服务命令已经完成,或者(2)FTP服务命令还在执行中。
第一种情况,服务器关闭数据连接(如果数据连接是打开的)回应226代码,表示放弃命令已经成功处理。
第二种情况,服务器放弃正在进行的FTP服务,关闭数据连接,返回426响应代码,表示请求服务请求异常终止。然后服务器发送226响应代码,表示放弃命令成功处理。 -
ABOR命令的功能是:正在传输文件的过程中,此时断开数据连接通道,但是却不会断开控制连接通道
-
用vsftpd来测试,vim /etc/vsftpd.conf
首先需要打开异步接收abor命令的能力
上传过程中,发送ABOR命令
接着,终止传输
此时,客户端会给服务端发送一个ABOR命令,服务端会先给客户端一个426的应答,然后再给一个226的应答,如果数据传输都完成了则只给客户端一个226的应答
如果没有数据传输,断开连接,则ABOR命令是通过正常传输通道来发送数据的,而不是通过紧急模式来发送数据的
- 整个流程如下:
(1)开启ctrl_fd接收带外数据功能
(2)安装信号SIGURG
(3)开启当前进程接收因ctrl_fd而产生的SIGURG信号(当ctrl_fd具有带外数据的时候,会产生SIGURG信号,该信号能被当前进程所接收,既然能被当前进程接收,则会调用handle_sigurg的函数)
(4)handle_sigurg
如果当前处于数据传输的状态,客户端发送一个ABOR命令,并且通过紧急模式发送过来的,此时就会产生SIGURG的信号,调用handle_sigurg,调用handle_sigurg中接收该带外数据,接收到数据之后判定是否是ABOR命令,如果是,就设定p_sess->abor_received = 1,并且断开数据套接字,否则回复一个500 unknow
(5)文件在传输过程中,可以是上传和下载,需要判定是否收到了ABOR异步命令,如果没有上传和下载完毕,则给客户端一个426的应答,再给一个226的应答
- eg:miniftpd20\ftpproto.c,miniftpd20\sysutil.c,miniftpd20\session.c,miniftpd20\session.h
static void do_pass(session_t *sess)
static void do_retr(session_t *sess)
void upload_common(session_t *sess, int is_append)
void activate_oobinline(int fd);//紧急模式,带外数据的接收
void activate_sigurg(int fd);//此外,进程能够捕捉到一个信号SIGURG,以便它接收紧急数据
activate_oobinline(sess->ctrl_fd);//控制fd开启oobinline,通过带外模式来接收数据
-
测试:
上传过程中,收到ABOR异步命令
上传过程中,断开连接
下载过程中,收到ABOR异步命令
下载过程中,断开连接
-
eg:miniftpd20\ftpproto.c
static void do_abor(session_t *sess)
- 测试:客户端直接终止,给客户端一个225的应答,只会终止数据连接通道,而不是控制连接通道,即nobody进程是不会终止的