您的位置:首页 > 编程语言 > PHP开发

FTP两种连接模式-PORT(主动)和PASV(被动)

2012-05-29 15:52 936 查看
FTP的连接模式有两种:PORT(主动模式)和PASV(被动模式)。

主动模式的连接过程:

客户端动态的选择一个端口(这个端口号一定是1024以上的,因为1024以前的端口都已经预先被定义好)向服务器端的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一个命令连接。当需要传送数据时或者列出服务器的文件列表时(通常使用ls或dir命令),客户端通过命令连接告诉服务器(使用PORT命令):“我已经打开了XX端口,请你过来连接”。于是服务器使用20端口向客户端的XX端口发送连接请求,建立一条数据连接来传送数据。

被动模式的连接过程:

客户端首先使用与主动连接模式相同的方法与服务器建立命令连接。当需要传送数据时,客户端通过命令连接告诉服务器(使用PASV命令)“我要连接你的XX端口,请问是否空闲”,如果恰好该端口空闲,服务器会告诉客户端:“你请求的端口空闲,可以建立连接(ACK确认信息)”,否则服务器会说“该端口已经占用,请换个端口(UNACK信息)”。如果客户端得到的是空闲的提示,就会利用该端口建立连接,否则就换个端口重新尝试,这也就是所谓的连接建立的协商过程.

PORT模式建立数据传输通道是由服务器端发起的,服务器使用20端口连接客户端的某一个大于1024的端口;在PASV模式中,数据传输的通道的建立是由FTP客户端发起的,他使用一个大于1024的端口连接服务器的1024以上的某一个端口。如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND.

选择哪种方式进行连接是由客户端选择的。

两种方式优缺点:

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

我在想在被动模式中是不是可以这样优化:客户端和服务端建立了命令连接之后,客户端通过命令连接向服务端发送PASV和一个大于1024的xx端口号进行数据连接请求,询问此端口是否空闲可用,如果已经被使用则发送UNACK给客户端,重新进行协商,直到可用。

那么可不可以修改为,当命令连接建立后,客户端只向服务端发送PASV(不发送一个xx端口)请求和服务器建立数据连接,服务器端收到之后请求之后,发送一个可用的大于1024的端口号给客户端,“说我这个端口可用,可以进行连接”,那就不用进行重复协商了,可以提高效率。不过或许进行重复协商的概率很小,没有必要这样做。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: