主动FTP和被动FTP

以下来自http://blog.sina.com.cn/s/blog_7099ca0b0100pb4r.html#SinaEditor_Temp_FontName

 在做项目的时候我才发现,FTP竟然有主动FTP和被动FTP之分。FTP的设置主要是由FTP服务器设置的。同样的一段代码,在本地测试的时候一切正常,但是访问局方的FTP服务器时却不能传输数据。

       下面我先简要地自己说一下,我对主被动FTP的理解。
       众所周知,FTP是一个比较特殊的服务,它占用了20和21两个端口,21是命令端口,20是数据端口。顾名思义,21端口是用来接发命令,20端口用来传递数据。但是并不是所有的时候都用20端口来实现数据交换。
       主动FTP过程大致如下:
       1、客户端启用端口N(N>1024,因为1024之前为特殊端口,不能手动占用,把N当作客户端的命令端口)和端口N+1(客户端的数据端口),从端口N向服务器的21端口发送PORT命令,其中PORT命令包含客户端IP和数据端口
       2、服务器接收到客户端的PORT命令后,并得知客户端用N+1端口监听数据。接着,服务器向客户端发送ACK应答(ACK与TCP通信中的连接握手一样)
       3、服务器用20端口再向客户端的N+1端口发送数据请求
       4、客户端向服务器端发送数据ACK应答
       以上就是主动FTP的大致过程,但是数据请求的发起方是服务器,如果此时客户端的防火墙启用了高端端口的屏蔽的话,有可能会发生阻塞,所以主动FTP的情况下,客户端最好把防火墙关闭了。

       被动FTP过程大致如下:
       1、客户端启用端口N(同样的N>1024)和N+1,N用作命令端口,N+1用作数据端口。然后客户端向服务器端发送PASV请求,告诉服务器端,这是被动FTP请求
       2、服务器端接收到PASV请求后,启动一个M(同样>1024)端口当作数据端,并发送PORT M到客户端
       3、客户端得到服务器端的数据端口后,再由端口N+1向服务器的M端口发起数据请求
       4、服务器端通过N端口向客户端的N+1端口发送ACK应答
       以上是被动FTP的大致过程,与主动FTP请求不同,请求的发起方是客户端,这样客户端就不会为防火墙的问题感到烦恼,但是同样道理,服务器端的端口就会有了限制。
   
       所以,一般情况下。服务器端为了方便管理,一般采用被动FTP方式连接。当然客户端可以通过ftp -d host port命令向服务器发送请求,可以看出到底用的是主动FTP还是被动FTP。

       这次我就遇到了这样的问题,写FTP上传下载代码时,把网上的东西copy过来,很顺利地在本地测试通过了。但是链接到局方的服务器的时候,怎么也不能上传和下载,而且不会抛出异常。后来我也是试着添了一行代码,结果测通了,代码如下:
       FtpDefine.ftpServer.enterLocalPassiveMode();
       怎么样,看起来很简单吧。因为写代码默认情况下是主动FTP,必须通过enterLocalPassiveMode()方法设置成被动FTP才能顺利上传下载。

       另外还有很多问题需要考虑,比方说代码的可扩展性、可移植性等等。就拿这次的代码来说,我测试的时候客户端和服务器端都是Windows Xp系统,而且FTP服务器设置的是主动FTP。但是真正用的时候,客户端是Linux系统,服务器虽然是Windows的,但是他们没有用Windows自带的FTP,而是用的软件,用法与Linux系统的相似,所以因为这个问题,我配错了配置文件,结果在代码中切换服务器目录时,总是报错。所以再此,我提醒大家,万事小心谨慎!希望我写的这些会对大家有点帮助。如果觉得看不懂的话,请参考我下面列出的链接地址,那里有更详细的说明。
 
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。  

第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。 

随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。 

下面是主动与被动FTP优缺点的简要总结:  

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

幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。



### FTP 客户端中的主动模式与被动模式 #### 主动模式的工作原理 在FTP主动模式下,当客户端发起数据传输请求时,服务器会尝试通过一个临时端口(通常大于1024)来连接到客户端指定的数据端口。这意味着服务器作为主动方去建立数据通道[^2]。 ```python # Python伪代码展示主动模式下的FTP连接过程 from ftplib import FTP def active_mode_ftp_connection(server, port=21): ftp = FTP() ftp.connect(server, port) ftp.login() # 登录认证 # 设置为主动模式 ftp.set_pasv(False) active_mode_ftp_connection('example.com') ``` #### 被动模式的工作原理 相比之下,在被动模式中,客户端向服务器发送命令后,服务器会选择一个新的端口号并通知客户端;随后由客户端负责开启至该新端口的数据连接。这种方式使得防火墙配置更加容易管理,因为所有的入站连接都来自已知源——即FTP服务器本身[^3]。 ```python # Python伪代码展示被动模式下的FTP连接过程 from ftplib import FTP def passive_mode_ftp_connection(server, port=21): ftp = FTP() ftp.connect(server, port) ftp.login() # 登录认证 # 设置为被动模式 ftp.set_pasv(True) passive_mode_ftp_connection('example.com') ``` #### 使用场景分析 对于网络环境较为严格的企业内部网而言,由于大多数企业级防火墙默认阻止外部主机发起的未经许可的新连接,因此更倾向于采用被动模式来进行文件传输操作。而对于那些位于公共互联网上的开放型应用,则可以根据实际情况灵活选用两种模式之一[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值