4.2 FTP回复 (FTP Replies)
对文件传输协议命令的回复旨在确保文件传输过程中请求和操作的同步, 并保证用户进程始终知道服务器的状态。每个命令必须生成至少一个回复, 尽管可能有多个回复; 在后一种情况下, 多个回复必须易于区分。此外, 某些命令以顺序组出现, 例如USER, PASS和ACCT, 或RNFR和RNTO。如果所有前面的命令都成功, 回复将显示中间状态的存在。序列中任何点的失败都需要从头开始重复整个序列。
命令-回复序列的详细信息在下面的一组状态图中明确说明。
FTP回复由三位数字 (作为三个字母数字字符传输) 后跟一些文本组成。数字供自动机使用以确定要进入的下一个状态; 文本供人类用户使用。预期三位数字包含足够的编码信息, 以便用户进程 (User-PI) 不需要检查文本, 可以丢弃它或适当地将其传递给用户。特别是, 文本可能依赖于服务器, 因此每个回复代码可能有不同的文本。
回复被定义为包含3位代码, 后跟空格<SP>, 后跟一行文本 (其中指定了某个最大行长度), 并由Telnet行尾代码终止。但是, 在某些情况下, 文本比单行长。在这些情况下, 完整的文本必须被括起来, 以便User-process知道何时可以停止读取回复 (即停止处理控制连接上的输入) 并去做其他事情。这需要第一行有特殊格式以指示还有更多行, 另一个在最后一行上指定它是最后一行。为了满足所有派系, 决定第一行和最后一行代码应该相同。
因此, 多行回复的格式是第一行将以所需的确切回复代码开始, 紧接着是连字符"-" (也称为减号), 后跟文本。最后一行将以相同的代码开始, 紧接着是空格<SP>, 可选的一些文本, 以及Telnet行尾代码。
示例:
123-First line
Second line
234 A line beginning with numbers
123 The last line
然后, 用户进程只需搜索在行开头后跟<SP> (空格) 的相同回复代码的第二次出现, 并忽略所有中间行。如果中间行以3位数字开头, 则服务器必须填充前面以避免混淆。
此方案允许将标准系统例程用于回复信息 (例如对于STAT回复), 并添加"人工"第一行和最后一行。在能够在任何行的开头生成三位数字和空格的这些例程的罕见情况下, 每个文本行的开头应由一些中性文本 (如空格) 偏移。
此方案假定多行回复不能嵌套。
回复的三位数字各自具有特殊意义。这旨在允许用户进程从非常简单到非常复杂的响应范围。第一位数字表示响应是好的、坏的还是不完整的。(参考状态图), 一个不复杂的用户进程将能够通过简单检查第一位数字来确定其下一步操作 (按计划进行、重做、撤退等)。想要大致了解发生了什么类型错误的用户进程 (例如文件系统错误、命令语法错误) 可以检查第二位数字, 为最细粒度的信息保留第三位数字 (例如, 没有前面RNFR的RNTO命令)。
回复代码的第一位数字有五个值:
1yz - 肯定预备回复 (Positive Preliminary reply)
请求的操作正在启动; 在继续执行新命令之前期待另一个回复。(在完成回复之前发送另一个命令的用户进程将违反协议; 但是server-FTP进程应该排队在前面命令进行时到达的任何命令。) 此类型的回复可用于指示命令已被接受, 用户进程现在可以关注数据连接, 对于同时监控困难的实现。server-FTP进程最多可以为每个命令发送一个1yz回复。
2yz - 肯定完成回复 (Positive Completion reply)
请求的操作已成功完成。可以启动新请求。
3yz - 肯定中间回复 (Positive Intermediate reply)
命令已被接受, 但请求的操作正在搁置, 等待接收进一步信息。用户应发送另一个指定此信息的命令。此回复用于命令序列组。
4yz - 暂时性否定完成回复 (Transient Negative Completion reply)
命令未被接受, 请求的操作未发生, 但错误条件是暂时的, 可以再次请求该操作。用户应返回到命令序列的开头 (如果有)。难以为"暂时"分配含义, 特别是当两个不同的站点 (Server-和User-processes) 必须就解释达成一致时。4yz类别中的每个回复可能具有略微不同的时间值, 但意图是鼓励用户进程重试。确定回复是否适合4yz或5yz (永久否定) 类别的经验法则是, 如果可以在不更改命令形式或User或Server属性的情况下重复命令 (例如, 命令拼写相同, 使用相同的参数; 用户不更改其文件访问或用户名; 服务器不实施新实现), 则回复为4yz。
5yz - 永久性否定完成回复 (Permanent Negative Completion reply)
命令未被接受, 请求的操作未发生。不鼓励User-process重复确切的请求 (按相同顺序)。即使某些"永久"错误条件可以纠正, 人类用户也可能希望在将来的某个时刻指示其User-process通过直接操作重新启动命令序列 (例如, 在拼写更改后, 或用户更改了其目录状态后)。
第二位数字编码了以下功能分组:
x0z - 语法 (Syntax)
这些回复指语法错误, 语法上正确但不适合任何功能类别的命令, 未实现或多余的命令。
x1z - 信息 (Information)
这些是对信息请求的回复, 例如状态或帮助。
x2z - 连接 (Connections)
指控制和数据连接的回复。
x3z - 身份验证和记帐 (Authentication and accounting)
用于登录过程和记帐过程的回复。
x4z - 未指定 (Unspecified as yet)
目前未指定。
x5z - 文件系统 (File system)
这些回复指示相对于请求的传输或其他文件系统操作的服务器文件系统的状态。
第三位数字在由第二位数字指定的每个功能类别中给出更精细的含义渐变。下面的回复列表将说明这一点。请注意, 与每个回复关联的文本是推荐的, 而不是强制性的, 甚至可能根据与其关联的命令而改变。另一方面, 回复代码必须严格遵循上一节中的规范; 也就是说, 服务器实现不应为与此处描述的情况仅略有不同的情况发明新代码, 而应采用已定义的代码。
诸如TYPE或ALLO之类的命令, 其成功执行不向用户进程提供任何新信息, 将导致返回200回复。如果特定Server-FTP进程未实现该命令, 因为它与该计算机系统无关, 例如TOPS20站点上的ALLO, 仍然需要肯定完成回复, 以便简单的User-process知道它可以继续其操作过程。在这种情况下使用202回复, 例如, 回复文本: "不需要存储分配。" 另一方面, 如果命令请求非站点特定的操作且未实现, 则响应为502。对此的改进是504回复, 用于已实现但请求未实现参数的命令。
4.2.1 按功能组分类的回复代码 (Reply Codes by Function Groups)
语法 (Syntax):
- 200 Command okay. (命令正常。)
- 500 Syntax error, command unrecognized. (语法错误, 命令无法识别。)
这可能包括诸如命令行太长之类的错误。 - 501 Syntax error in parameters or arguments. (参数或参数中的语法错误。)
- 202 Command not implemented, superfluous at this site. (命令未实现, 在此站点上是多余的。)
- 502 Command not implemented. (命令未实现。)
- 503 Bad sequence of commands. (错误的命令序列。)
- 504 Command not implemented for that parameter. (该参数未实现命令。)
信息 (Information):
- 110 Restart marker reply. (重启标记回复。)
在这种情况下, 文本是确切的, 不留给特定实现; 它必须为:
MARK yyyy = mmmm
其中yyyy是User-process数据流标记, mmmm是服务器的等效标记 (注意标记和"="之间的空格)。 - 211 System status, or system help reply. (系统状态或系统帮助回复。)
- 212 Directory status. (目录状态。)
- 213 File status. (文件状态。)
- 214 Help message. (帮助消息。)
关于如何使用服务器或特定非标准命令的含义。此回复仅对人类用户有用。 - 215 NAME system type. (NAME系统类型。)
其中NAME是分配号码文档中列表中的官方系统名称。
连接 (Connections):
- 120 Service ready in nnn minutes. (服务将在nnn分钟内准备就绪。)
- 220 Service ready for new user. (服务已为新用户准备就绪。)
- 221 Service closing control connection. (服务关闭控制连接。)
如果适当则已注销。 - 421 Service not available, closing control connection. (服务不可用, 关闭控制连接。)
如果服务知道必须关闭, 这可能是对任何命令的回复。 - 125 Data connection already open; transfer starting. (数据连接已打开; 传输开始。)
- 225 Data connection open; no transfer in progress. (数据连接打开; 没有正在进行的传输。)
- 425 Can't open data connection. (无法打开数据连接。)
- 226 Closing data connection. (关闭数据连接。)
请求的文件操作成功 (例如, 文件传输或文件中止)。 - 426 Connection closed; transfer aborted. (连接关闭; 传输中止。)
- 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). (进入被动模式。)
身份验证和记帐 (Authentication and accounting):
- 230 User logged in, proceed. (用户已登录, 继续。)
- 530 Not logged in. (未登录。)
- 331 User name okay, need password. (用户名正常, 需要密码。)
- 332 Need account for login. (登录需要帐户。)
- 532 Need account for storing files. (存储文件需要帐户。)
文件系统 (File system):
- 150 File status okay; about to open data connection. (文件状态正常; 即将打开数据连接。)
- 250 Requested file action okay, completed. (请求的文件操作正常, 已完成。)
- 257 "PATHNAME" created. ("PATHNAME" 已创建。)
- 350 Requested file action pending further information. (请求的文件操作等待进一步信息。)
- 450 Requested file action not taken. (未执行请求的文件操作。)
文件不可用 (例如, 文件忙)。 - 550 Requested action not taken. (未执行请求的操作。)
文件不可用 (例如, 找不到文件, 没有访问权限)。 - 451 Requested action aborted. Local error in processing. (请求的操作中止。处理中的本地错误。)
- 551 Requested action aborted. Page type unknown. (请求的操作中止。页类型未知。)
- 452 Requested action not taken. (未执行请求的操作。)
系统存储空间不足。 - 552 Requested file action aborted. (请求的文件操作中止。)
超出存储分配 (对于当前目录或数据集)。 - 553 Requested action not taken. (未执行请求的操作。)
不允许的文件名。
4.2.2 回复代码数字顺序列表 (Numeric Order List of Reply Codes)
- 110 Restart marker reply.
- 120 Service ready in nnn minutes.
- 125 Data connection already open; transfer starting.
- 150 File status okay; about to open data connection.
- 200 Command okay.
- 202 Command not implemented, superfluous at this site.
- 211 System status, or system help reply.
- 212 Directory status.
- 213 File status.
- 214 Help message.
- 215 NAME system type.
- 220 Service ready for new user.
- 221 Service closing control connection.
- 225 Data connection open; no transfer in progress.
- 226 Closing data connection.
- 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
- 230 User logged in, proceed.
- 250 Requested file action okay, completed.
- 257 "PATHNAME" created.
- 331 User name okay, need password.
- 332 Need account for login.
- 350 Requested file action pending further information.
- 421 Service not available, closing control connection.
- 425 Can't open data connection.
- 426 Connection closed; transfer aborted.
- 450 Requested file action not taken.
- 451 Requested action aborted: local error in processing.
- 452 Requested action not taken.
- 500 Syntax error, command unrecognized.
- 501 Syntax error in parameters or arguments.
- 502 Command not implemented.
- 503 Bad sequence of commands.
- 504 Command not implemented for that parameter.
- 530 Not logged in.
- 532 Need account for storing files.
- 550 Requested action not taken.
- 551 Requested action aborted: page type unknown.
- 552 Requested file action aborted.
- 553 Requested action not taken.