前记
FTP 是 File Transfer Protocol 的缩写,顾名思义,是一种处于应用层的用于文件传输的协议。它曾红极一时,即使现在也有许多的应用实例。我将在接下来几篇 blog 中讲述我是如何编写一个最小 FTP Server 的。
协议简述
FTP 协议可以分为两个部分,一部分用于传输控制命令,一部分用于传输需要的数据,比如当前的目录或者是要传输的文件。
被动模式
在被动模式下,客户端通过控制命令与服务端交互,当需要传输数据时,服务器会在某个端口进行监听,并把端口号通过控制部分返回给客户端,当客户端连接上了这个端口,就可以进行数据的传输。
上图是一个简单的 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
重命名文件到指定位置。
具体这些命令是如何实现的将在之后进行说明。