FTP连接模式和原理
转载自:http://www.mamicode.com/info-detail-1747715.html
首先FTP有两种模式:主动模式(port)和被动模式(pasv).FTP标准命令TCP端口号为21,Port方式数据端口为20
不管哪种模式,都必须通过21这个端口建立起到FTP的管道连接,通过这个通道发送命令。
通过21端口可以创建文件夹,但不能创建文件。
port模式:1.通过tcp的21端口建立起通道
2.客户端在此通道发起PORT命令,并产生一个随机非特殊的端口号N(1023<N<65536)给到FTP服务器。
3.此时客户端监听N+1端口(N+1>=1025,不一定是N端口+1),同时通过21的通道发送命令通知FTP服务器客户点通过此端口接受数据传输。
4.FTP服务器接收到上一步的响应后通过自己的数据源端口20,去链接远程的客户端的N+1端口(此时是FTP服务端主动发起的一个端口链接)
5.如果此时客户端的防火墙策略是不能随意外部链接内部服务器的端口,则会造成上一步出现数据端链接失败!
6.如果没有上一步的情况,FTP客户端则会接收到服务端响应并返回响应信息,则建立起了数据链接通道。
pasv模式:1.通过tcp的21端口建立起通道
2.但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令.会产生两个随机非特殊的
端口N(1023<N<65536) 和N+1给到FTP服务器。其中N端口跟主动模式一样,会把N给到服务端的远程的21端口。相当于FTP服务端被动
接受数据端口号而不是之前port模式的主动发起连接
3.FTP服务端会则会打开N+1的端口号
4.客户端发起N+1端口的链接,并建立数据链接。
port模式:
pasv模式:
上面的图都省略了建立tcp的21端口这个步骤。
正是因为之前采用主动模式,但是测试服务器防火墙阻止了发起的数据端口的连接。也就是port模式的第5步出现问题。
因而FTPClient.listFiles(remote)或者FTPClient.retrieveFile(remote)方法时获取不了数据,就停止在那里,什么反应都没有,出现假死状态。
解决办法:在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();
这个方法的意思就是每次数据连接之前,ftp client告诉ftp server:数据连接的端口号已经告诉你了,你只需被动接受数据连接的请求就行