(P04)miniftpd:项目需求,系统设计

一、项目需求

1.ftp命令列表

  • 服务命令(最关键)中的5个命令,数据的传输都是通过数据连接通道来完成的,所以需要先传输PORT命令或者PASV命令数据连接通道才能正常工作。

  • STOU也是文件上传的命令,与STOR,APPE区别在于,如果服务器有abc文件,则STOU会创建一个abc.1文件来保存,以此类推。

(P04)miniftpd:项目需求,系统设计
(P04)miniftpd:项目需求,系统设计
(P04)miniftpd:项目需求,系统设计

2.参数配置

  • 通过配置文件来配置,类似/etc/vsftpd.conf

3.空闲断开

  • 服务端
    /etc/vsftpd.conf
    (P04)miniftpd:项目需求,系统设计

重启vsftpd
(P04)miniftpd:项目需求,系统设计

  • 客户端
    客户端这边也要重启一下
    (P04)miniftpd:项目需求,系统设计
    客户端5s后断开了
    (P04)miniftpd:项目需求,系统设计

4.限速

  • 服务端
    /etc/vsftpd.conf
    当前限速为100KB
    (P04)miniftpd:项目需求,系统设计

  • 客户端
    客户端的速度会下慢慢降速到100KB
    (P04)miniftpd:项目需求,系统设计
    传输过程中的空闲断开功能是不生效的。

5.连接数限制

  • (1)总连接数的限制
    服务端:
    如果没有参数自己加上去
    (P04)miniftpd:项目需求,系统设计
    重启vstdpd服务,断开客户端

客户端:
先连接一个
(P04)miniftpd:项目需求,系统设计
(P04)miniftpd:项目需求,系统设计

再连接一个,再启动一个客户端

  • (2)同一个IP连接数的限制
    因为同一个IP连接数的限制的前提条件是总连接数max_clients的限制,所以这里先设置为10
    (P04)miniftpd:项目需求,系统设计
    重启vsftpd服务

客户端:
新建一个标签,连接三次
(P04)miniftpd:项目需求,系统设计

6.断点续载与端点续传

  • 客户端配置站点支持续传功能:
    (P04)miniftpd:项目需求,系统设计
    上传一个文件的过程中断开
    (P04)miniftpd:项目需求,系统设计
    开始续传,右键
    (P04)miniftpd:项目需求,系统设计
    (P04)miniftpd:项目需求,系统设计
    续传实际上有一个重启的位置,这样服务器打开该文件的适合,会将文件指针指向该位置,将剩余的信息填写到续传的位置
    (P04)miniftpd:项目需求,系统设计
  • 客户端的APP续传功能
    (P04)miniftpd:项目需求,系统设计
    中间步骤与上类似,最后发现是使用APPE命令进行续传
    (P04)miniftpd:项目需求,系统设计

二、系统设计

  • 系统逻辑结构
    若客户端连接vsftpd服务端后,可以看到有三个进程:
    vsftpd服务进程
    Nobody进程和所登录的用户进程

(P04)miniftpd:项目需求,系统设计

  • 使用多进程的方式来实现,ftp服务不能使用多线程来实现。
    因为多线程共享同一个工作目录,因为其他客户端对目录的更改会影响到别的客户端,别的客户端会感觉到莫名其妙,此外,IO复用也是不允许的,因为IO复用是一个线程处理很多个客户端的连接,只要一个连接更改目录,会影响到其他的连接。

  • 为什么一个客户端连接过来为啥采用2个进程呢?
    服务进程直接与客户端进行通信,nobody进程没有直接与客户端进行通信,它仅仅与服务进程进行通信,协助服务进程与客户端之间建立数据连接通道以及需要一些特殊连接权限的控制,一旦完成后,再通知给服务进程,nobody进程与服务进程采用的是内部通信的协议,可以用unix域来进行通信。

  • 图1:
    (P04)miniftpd:项目需求,系统设计

  • 图2:
    接入模块一旦获得客户端的连接之后,会创建2个进程,一个是服务进程,服务进程要处理客户端发送过来的ftp请求,ftp协议解析器对ftp请求进行解析,还有数据协商命令,比如post,通过进程间通信模块,让nobody进程来协助进行内部协议解析器的解析,比如与客户端建立相应连接,然后将数据连接的套接字通过进程间通信模块传输给服务进程,服务进程得到该连接(Unix域协议是可以传输文件描述符的),从而与客户端建立了一个数据连接通道,通过数据传输模块进行数据传输。
    (P04)miniftpd:项目需求,系统设计