0
点赞
收藏
分享

微信扫一扫

(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令


文章目录

  • ​​1.NOOP命令和QUIT命令​​
  • ​​2.ABOR命令的实现​​

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命令
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接

  • 从服务器断开,给客户端一个221的响应
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_02

  • 测试:
    客户端连接后,服务端有3个进程
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_03

  • 再连接一个客户端,应该是5个进程
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_上传_04

  • ctrl r退出一个会话
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_05

  • 退出一个会话,服务端给客户端一个221的应答
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_06

  • 此时,服务端只剩下一个会话
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_07

2.ABOR命令的实现

  • 功能综述
    如果在在进行数据传输,那么客户端向服务器发送的ABOR命令是通过紧急模式来传输的,否则是按正常模式传输的。所以要处理ABOR命令,需要开启紧急模式接收数据。
    服务器接收这个命令时可能处在两种状态:(1)FTP服务命令已经完成,或者(2)FTP服务命令还在执行中。
    第一种情况,服务器关闭数据连接(如果数据连接是打开的)回应226代码,表示放弃命令已经成功处理。
    第二种情况,服务器放弃正在进行的FTP服务,关闭数据连接,返回426响应代码,表示请求服务请求异常终止。然后服务器发送226响应代码,表示放弃命令成功处理。
  • ABOR命令的功能是:正在传输文件的过程中,此时断开数据连接通道,但是却不会断开控制连接通道
  • 用vsftpd来测试,vim /etc/vsftpd.conf
    首先需要打开异步接收abor命令的能力
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_上传_08

上传过程中,发送ABOR命令

(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_09


(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_10


接着,终止传输

(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_11


此时,客户端会给服务端发送一个ABOR命令,服务端会先给客户端一个426的应答,然后再给一个226的应答,如果数据传输都完成了则只给客户端一个226的应答

(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_数据连接_12

如果没有数据传输,断开连接,则ABOR命令是通过正常传输通道来发送数据的,而不是通过紧急模式来发送数据的

(P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_上传_13

  • 整个流程如下:

(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异步命令
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_14

  • 上传过程中,断开连接
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_15


  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_上传_16

  • 下载过程中,收到ABOR异步命令
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_上传_17

  • 下载过程中,断开连接
  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_15


  • (P20)miniftpd项目实战20:ABOR的实现和NOOP命令和QUIT命令_客户端_19

  • eg:miniftpd20\ftpproto.c

static void do_abor(session_t *sess)

  • 测试:客户端直接终止,给客户端一个225的应答,只会终止数据连接通道,而不是控制连接通道,即nobody进程是不会终止的



举报

相关推荐

0 条评论