5. 说明
5.1. 最小实现
下面是FTP服务器的最小实现:
类型 - ASCII Non-print
模式 - Stream
结构 - File, Record
命令 - USER, QUIT, PORT,TYPE, MODE, STRU,RETR, STOR,NOOP.
传输的默认参数为:
类型 - ASCII Non-print
模式 - Stream
结构 - File
所有主机都将上面的值作为默认值。
5.2. 连接
服务器协议解释器会在端口L侦听,用户或用户协议解释器初始化全双工控制连接,服务器和用户进程应该遵守Telnet协议的说明进行。服务器
不提供对命令行的编辑功能,应该由用户负责这一切。在全部传送和应答结束后,在用户的请求下服务器关闭控制连接。用户DTP必须在指定的
数据端口上侦听,它可以是默认端口U或由PORT命令指定的端口。服务器的默认数据端口为L-1。传输方向和端口均可由FTP命令决定。只有用户
PI可以改变默认端口。当数据在服务器A和B之间传送时,用户PI,C,在两个服务器PI之间建立控制连接。其中一个服务器A,在接收到传输服
务命令时接收PASV命令初始化连接,用户PI接收到PASV命令的确认时(确认内包括主机标识和端口),将端口以PORT命令发送到B。在接收到确
认后,用户PI可以发送相应的命令给A和B了,B初始连接和传输进程,命令应答序列如下面所示,请根据位置注意时差:
用户-PI - 服务器A 用户-PI - 服务器B
----------------- -----------------
C->A:Connect C->B:Connect
C->A:PASV
A->C:227 Entering Passive Mode.A1,A2,A3,A4,a1,a2
C->B:Port A1,A2,A3,A4,a1,a2
B->C:200 Okay
C->A:STOR C->B:RETR
B->A:连接到主机A ,端口a
在任何时间,服务器和用户只要有一方关闭连接,另一方就要赶快读取缓冲中的数据,然后也关闭本方的连接。
5.3. 命令
本节主要讨论命令格式。命令对大小写不敏感。命令通常由命令码和相应的参数组成。中间由一个或几个空格分开。参数域由结束,服务器在
未接收到行结束符时不会采取任何动作。下面描述的格式是以NVT-ASCII以准的,方括号代表可选的参数域,如果未选择可选的参数域则采用默
认值
5.3.1. FTP命令
下面是FTP命令,其中username代表用户名,password代表口令,pathname代表路径名,host-port代表主机端口,account-information代表帐
户信息,typecode代表类型代码,decimal-integer代表十进制整数,marker代表标记,string代表字符串:
USER
PASS
ACCT
CWD
CDUP
SMNT
QUIT
REIN
PORT
PASV
TYPE
STRU
MODE
RETR
STOR
STOU
APPE
ALLO
[ R ]
REST
RNFR
RNTO
ABOR
DELE
RMD
MKD
PWD
LIST [ ]
NLST [ ]
SITE
SYST
STAT [ ]
HELP [ ]
NOOP
5.3.2. FTP命令参数
下面是用BNF范式表示的参数格式:
::=
::=
::=
::= |
::= 除和外的所有ASCII字符
::=
::= |
::= 可打印ASCII字符,从33到126
::=
::= ,
::= ,,,
::= ,
::= 从1到255的十进制整数
::= N | T | C
::= A [ ]| E [ ]| I| L
::= F | R | P
::= S | B | C
::=
::= 任何十进制整数
5.4. 命令和响应序列
服务器和用户之间的通信是对话的过程,用户发送FTP命令,然后等待服务器的一个(或多个)响应,根据响应再发送新命令。
连接时的响应带有许多信息,通常情况下,服务器会返回220应答,等待输入,用户在接收到此响应后才发送新命令,如果服务器不能立即接收
输入,会在220后面返回120。有些信息如服务器将在15分钟后停止工作是要服务器发向用户的,但是服务器却不能直接发向用户,处理的方法
是将消息缓冲,在下一个响应中返回给用户。下面列出命令的应答,第一个是预备应答,第二个是确定完成,第三个是拒绝完成,最后是中间
应答。这些应答是构成状态图的基础,状态图会在下节中给出:
*建立连接
120
220
220
421
*登录
1.USER
230
530
500, 501, 421
331, 332
2.PASS
230
202
530
500, 501, 503, 421
332
3.ACCT
230
202
530
500, 501, 503, 421
4.CWD
250
500, 501, 502, 421, 530, 550
5.CDUP
200
500, 501, 502, 421, 530, 550
6.SMNT
202, 250
500, 501, 502, 421, 530, 550
*退出登录
1.REIN
120
220
220
421
500, 502
2.QUIT
221
500
*传输参数
1.PORT
200
500, 501, 421, 530
2.PASV
227
500, 501, 502, 421, 530
3.MODE
200
500, 501, 504, 421, 530
4.TYPE
200
500, 501, 504, 421, 530
5.STRU
200
500, 501, 504, 421, 530
*文件操作命令
1.ALLO
200
202
500, 501, 504, 421, 530
2.REST
500, 501, 502, 421, 530
350
3.STOR
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
4.STOU
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
5.RETR
125, 150
(110)
226, 250
425, 426, 451
450, 550
500, 501, 421, 530
6.LIST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
7.NLST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
8.APPE
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 550, 452, 553
500, 501, 502, 421, 530
9.RNFR
450, 550
500, 501, 502, 421, 530
350
10.RNTO
250
532, 553
500, 501, 502, 503, 421, 530
11.DELE
250
450, 550
500, 501, 502, 421, 530
12.RMD
250
500, 501, 502, 421, 530, 550
13.MKD
257
500, 501, 502, 421, 530, 550
14.PWD
257
500, 501, 502, 421, 550
15.ABOR
225, 226
500, 501, 502, 421
*获得信息命令
1.SYST
215
500, 501, 502, 421
2.STAT
211, 212, 213
450
500, 501, 502, 421, 530
3.HELP
211, 214
500, 501, 502, 421
*其它命令
1.SITE
200
202
500, 501, 530
2.NOOP
200
500 421
6. 状态图
下面是一个简单实现的FTP的状态图,只用到响应码的首位。对于所有命令或命令序列有三种可能性:成功(S),失败(F)或错误(E)。在
状态图中B代表开始,W代表等待响应。下面我们给出一个总图,总图可以包括的命令有:
ABOR,ALLO,DELE,CWD,CDUP,SMNT,HELP,MODE,NOOP,PASV,QUIT,SITE,PORT,SYST,STAT,RMD,MKD,PWD,STRU和TYPE
1,3 +-----+
--------------->| E |
| +-----+
|
+-----+ cmd +-----+ 2 +-----+
| B |------------>| W |------------>| S |
+-----+ +-----+ +-----+
|
| 4,5 +-----+
--------------->| F |
+-----+
而下图可以包括的命令有:APPE,LIST,NLST,REIN,RETR,STOR和STOU。
3 +-----+
--------------->| E |
| +-----+
|
+-----+ cmd +-----+ 2 +-----+
| B |------------>| W |------------>| S |
+-----+ ----> +-----+ +-----+
| | |
| | | 4,5 +-----+
| | --------------->| F |
| 1 | +-----+
-------
第一幅图和第二幅图差别不大,第一幅图中如果出现了100系列响应会是错误,而在第二幅图中不会。下面是重命名过程:
+-----+ RNFR +-----+ 1,2 +-----+
| B |------------>| W |------------->| E |
+-----+ +-----+ ---->+-----+
| | |
3 | | 4,5 |
---------------- ------- |
| | | +-----+
| ----------------->| S |
| | 1,3 | | +-----+
| 2 | -----------
| | | |
V | | |
+-----+ RNTO +-----+ 4,5 -------->+-----+
| |---------->| W |------------->| F |
+-----+ +-----+ +-----+
下面是重新启动命令,其中cmd代表APPE,STOR或RETR。
+-----+ REST +-----+ 1,2 +-----+
| B |------------>| W |------------->| E |
+-----+ +-----+ ---->+-----+
| | |
3 | | 4,5 |
---------------- ------- |
| | | +-----+
| ----------------->| S |
| | 3 | | +-----+
| 2 | -----------
| | | |
V | | |
+-----+ cmd +-----+ 4,5 -------->+-----+
| |---------->| W |------------->| F |
+-----+ ---->+-----+ +-----+
| |
| 1 |
--------
下图代表登录过程:
1
+-----+ USER +-----+-------------->+-----+
| B |------------>| W | 2 ----->| E |
+-----+ +-----+------- | --->+-----+
| | | | |
3 | | 4,5 | | |
------------------- ------- | | |
| | | | |
| | | | |
| ------------ |
| 1| | | |
V | | | |
+-----+ PASS +-----+ 2 | -------->+-----+
| |------------->| W |-------------->| S |
+-----+ +-----+ ------------>+-----+
| | | | |
3 | |4,5| | |
--------------- ---------- |
| | | | |
| | | | |
| -----------------
| 1,3| | | |
V | 2 | | |
+-----+ ACCT +-----+-- | ---------->+-----+
| |------>| W | 4,5 ------------>| F |
+-----+ +-----+----------------->+-----+
7. 典型FTP过程
假设位于U的用户希望从S上(下)传文件,通常用户需要使用用户FTP进程和服务器通信,下面就是一个例子:
用户发出的本地命令 解释
ftp (host) multics 连接到S的端口L,建立控制连接
<---- 220 Service ready .
用户名 Doe
need password.
USER Doe---->
<---- 331 用户名正确
口令 PASS 口令---->
<---- 230 User logged in.
retrieve (local type) ASCII
(local pathname) test 1
(for. pathname) test.pl1
User-FTP opens local file in ASCII.
RETR test.pl1 ---->
<---- 150 文件状态正常,将打开数据连接
服务器于端口U建立数据连接
文件传输中
<---- 226 关闭数据连接,文件传输正确
type Image TYPE I ---->
<---- 200 Command OK
store (local type) image
(local pathname) file dump
(for.pathname) >udd>cn>fd
User-FTP opens local file in Image.
STOR >udd>cn>fd ---->
<---- 550 访问拒绝
中止 QUIT ---->
服务器关闭所有连接
FTP控制连接通过用户进程端口U和服务器端口L建立,这里默认的L=21。