FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)

    在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。 
    在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通 知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。 
    总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。 

    被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而 只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。


需要有两个套接字,一个用于命令(cmdSocket),一个用于数据(dataSocket)
cmdSocket与ftp服务器21端口(如果ftp服务器没做特殊设置的话)连接,dataSocket因PASV和PORT模式不同,而有所差别。
PASV模式:
1)通过命令cmdSocket套接字发送PASV
2)server端会返回ip地址和专门的数据传输端口号
3)在命令套接字cmdSocket上发送LIST命令
4)本地建立dataSocket连接server提供的数据传输端口号(此步中,本地作为客户端)
5)server端通过cmdSocket返回150 开头的响应(需要读取cmdSocket)
6)本地通过dataSocket接收数据,即通过dataSocket的inputStream读取dataSocket中的数据
7)传输完毕(read返回-1),cmdSocket会返回226 开头的响应,关闭连接即可
PORT模式:
1)在本地启动某个端口的监听(本地作为服务端,使用ServerSocket)
2)通过命令cmdSocket套接字发送PORT,PORT命令后加参数:本地ip+刚启动监听的端口
3)server端响应200 
4)在cmdSocket上发送LIST命令
5)调用ServerSocket.accept()获得数据套接字dataSocket(ftp server作为客户连接本地的端口)
6)server端通过cmdSocket返回150 开头的响应(需要读取cmdSocket)
7)本地通过dataSocket接收数据,即通过dataSocket的inputStream读取dataSocket中的数据
8)传输完毕(read返回-1),cmdSocket会返回226 开头的响应,关闭连接即可

你可能感兴趣的:(FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP))