Skip to main content

5.2 连接 (Connections)

服务器协议解释器应在端口L上"侦听"。用户或用户协议解释器应发起全双工控制连接。服务器和用户进程应遵循ARPA-Internet协议手册 [1] 中指定的Telnet协议约定。服务器没有义务提供命令行编辑, 并且可能要求在用户主机中完成。在所有传输和回复完成后, 服务器应根据用户的请求关闭控制连接。

user-DTP必须在指定的数据端口上"侦听"; 这可以是默认用户端口 (U) 或PORT命令中指定的端口。服务器应使用指定的用户数据端口从其自己的默认数据端口 (L-1) 发起数据连接。传输方向和使用的端口将由FTP服务命令确定。

请注意, 所有FTP实现都必须支持使用默认端口进行数据传输, 并且只有USER-PI可以发起使用非默认端口。

当数据要在两个服务器A和B之间传输时 (参见图2), user-PI C与两个server-PI建立控制连接。然后向其中一个服务器 (比如A) 发送PASV命令, 告诉它在其数据端口上"侦听"而不是在接收到传输服务命令时发起连接。当user-PI接收到对PASV命令的确认 (包括正在侦听的主机和端口的标识) 时, user-PI然后在PORT命令中将A的端口a发送到B; 返回回复。然后user-PI可以向A和B发送相应的服务命令。服务器B发起连接, 传输继续进行。命令-回复序列如下所示, 其中消息在垂直方向上是同步的, 但在水平方向上是异步的:

User-PI - Server A                User-PI - Server 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 : Connect to HOST-A, PORT-a

图3

数据连接应在建立数据连接部分中描述的条件下由服务器关闭。如果在不需要关闭连接以指示文件结束的数据传输之后要关闭数据连接, 服务器必须立即这样做。不允许等到新的传输命令之后, 因为用户进程将已经测试数据连接以查看是否需要进行"侦听"; (记住用户必须在发送传输请求之前在关闭的数据端口上"侦听")。为了防止此处出现竞争条件, 服务器在关闭数据连接后发送回复 (226) (或者如果连接保持打开, 则发送"文件传输完成"回复 (250), user-PI应在发出新的传输命令之前等待这些回复之一)。

无论何时用户或服务器看到连接正在被另一方关闭, 它都应该立即读取排队在连接上的任何剩余数据, 并在其自己的一端发出关闭。