https://www.cnblogs.com/huhaoshida/p/5412615.html

(1) PORT(主动模式)

PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图。

 

 (2) PASV(被动模式)

    PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

    2.两种模式的比较

     从上面的运行原来看到,主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。

    主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。

    被动模式只需要服务器端开放端口给客户端连接就行了。

参考文献 http://www.cnblogs.com/mawanglin2008/articles/3607767.html

3.java中,内网用被动模式 ,外网连接时用主动模式,服务器相应改动(只用上线功能用被动模式去连接ftp报错连接不上)

FTPClient ftpClient = new FTPClient();

ftpClient.connect(url, port);

ftpClient.enterLocalActiveMode();    //主动模式
// ftpClient.enterLocalPassiveMode(); 被动模式
ftpClient.setControlEncoding("UTF-8");
ftpClient.changeWorkingDirectory(path);

 

https://www.cnblogs.com/guangshan/p/4386308.html

FTP主动模式与被动模式,及java FTPClient模式设置

 

FTP的主动模式与被动模式

FTP服务器使用20和21两个网络端口与FTP客户端进行通信。 
FTP服务器的21端口用于传输FTP的控制命令,20端口用于传输文件数据。


FTP主动模式: 
  FTP客户端向服务器的FTP控制端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,客户端在命令链路上用PORT的命令告诉服务器我开放了某端口,你过来连接我。于是服务器从20端口向客户端的该端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立过程中是服务器主动请求,所以称为主动模式。

  当客户端向服务端连接后,使用的是PORT模式,那么客户端B会发送一

条命令告诉服务端(客户端B在本地打开了一个端口N在等着你进行数据连接),当服务端收到这个Port命令后 就会向客户端打开的那个端口N进行连接,这种数据连接就生成。


FTP被动模式: 
  FTP客户端向服务器的FTP控制端口(默认21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端,我打开了某端口,你过来连我。于是客户端向服务器的该端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立的过程中是服务器被动等待客户机的请求,所以称被动模式。
  由上面几点可以看出,FTP服务器的主动与被动模式是以FTP服务器进行数据传送连接的主动或被动为依据的。
  对于FTP服务器与客户机之间存在的网络防火墙,不论是服务器侧还是客户机侧的网 络防火墙设置策略都要保证FTP服务器和客户端之间能够正常建立命令链路和数据链路。

  当客户端B向服务端连接后,使用的是PASV模式,服务端会发信息给客户端,这个信息是(服务端在本地打开了一个端口M,你现在去连接我吧),当客户端收到这个信息后,就可以向服务端的M端口进行连接,连接成功后,数据连接也建立了。

主动模式下: 
  客户机 与 服务器之间建立连接时,客户机是大于1024的端口上,服务器是 20 端口。
  客户机的端口是大于1024的,而服务器的端口是 21 端口接收请求,而是 20 端口给客户机回应。
  允许FTP客户机从大于1024的端口连接服务器的21端口.
  允许FTP服务器从21端口回应FTP客户机中大于1024端口的网络连接.
  允许FTP服务器从20端口主动连接FTP客户机中大于1024的端口
  允许FTP客户机从大于1024的端口回应来自FTP服务器的20端口的网络连接.
被动模式下: 
  客户机 与 服务器之间建立连接都是在大于1024的端口上的。
  客户机的端口是大于1024的,而服务器的端口是 21 端口接收请求,而是 从大于1024 端口给客户机回应。
  允许FTP客户机从大于1024的端口连接服务器的21端口.
  允许FTP服务器从21端口回应FTP客户机中大于1024端口的网络连接.
  允计FTP客户机从大于1024的端口连接FTP服务器的大于1024端口.
  允许FTP服务器从大于1024的端口回应来自FTP客户机大于1024端口的网络连接

client开启大于1024(21吧)的X端口连接服务器的21(命令端口),同时开启X+1端口 
当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后,就会开放一个大于1024的端口Y通知client,client接到通知后就会用X+1来连接服务器的Y端口,简单的说就是client主动连接服务器 。

 

 

主动与被动FTP优缺点的简要总结:  
  主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。 
  被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
   幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。 

FTP主动与被动的好处和坏处: 
  在ISA(工业标准架构体系Industry Standard Architecture是IBM PC兼容机上的一种总线 )的情况,如果采用被动模式,由于IIS是完全随机的选择一个端口,并告知客户,然后客户进行主动连接,这就意味着在ISA上,你要让所有的端口都允许动态入站连接才行,这样肯定不行,因为太危险了,等于打开了所有的端口连。   
  如果采用主动模式(PORT Mode),IIS选择好端口后,主动与客户进行连接,这时候不需要像PASV模式那样打开所有的动态入站连接,而且正好相反,我们需要打开所有的动态出站连接即可,安全性增加很多。而且由ISA的IP PACKET FILTER只对ISA本机起作用,不会造成局域网内的客户“放了羊”。

 

FTPclient在被动模式下,传送文件使用的是0端口,可以调用setActivePortRange设置主动模式时的端口范围。

在windows下使用ftpclient时,需要处理windows下一个FTP主被动模式的缺陷,需要运行如下命令:

netsh advfirewall firewall add rule name=”FTP Service” action=allow service=ftpsvc protocol=TCP dir=in
netsh advfirewall set global StatefulFTP disable