Helloqiu's Blog

helloqiu 的博客

亲手打造FTP Server(一)介绍

logo

前记

FTP 是 File Transfer Protocol 的缩写,顾名思义,是一种处于应用层的用于文件传输的协议。它曾红极一时,即使现在也有许多的应用实例。我将在接下来几篇 blog 中讲述我是如何编写一个最小 FTP Server 的。

协议简述

FTP 协议可以分为两个部分,一部分用于传输控制命令,一部分用于传输需要的数据,比如当前的目录或者是要传输的文件。

被动模式

在被动模式下,客户端通过控制命令与服务端交互,当需要传输数据时,服务器会在某个端口进行监听,并把端口号通过控制部分返回给客户端,当客户端连接上了这个端口,就可以进行数据的传输。
simple example
上图是一个简单的 server 和 client 通信的例子。
首先 client 向 server 发送了用户名和密码,server 验证成功后 client 向 server 发送 LIST 请求当前目录的文件列表,并指定使用 PASV 即被动模式。像之前所说的那样,server 打开了一个端口,并把地址和端口通过一个六元组的形式返回给了 client,client 只要再连接上这个地址和端口就可以获取到文件列表的数据。
以此类推,在被动模式下都是用类似的方式来传输数据的。

实现的命令

为了实现一个功能完整的 FTP Server,我从 FTP 协议中选择了以下几条命令来进行实现。

  • USER
    输入用户名。
  • PASS
    输入密码。
  • PWD
    显示当前目录。
  • MKD
    创建文件夹。
  • RMD
    删除文件夹。
  • MLSD
    如果目录被命名,列出目录的内容。
  • TYPE
    指定传输模式。
  • FEAT
    获取支持的模式。
  • LIST
    获取当前目录的内容。
  • CWD
    改变当前目录。
  • RETR
    传输文件。
  • STOR
    上传文件。
  • DELE
    删除文件。
  • RNTO
    重命名文件到指定位置。

具体这些命令是如何实现的将在之后进行说明。