简单地说,支持FTP协议的服务器就是FTP服务器。

与大多数Internet服务一样,FTP也是一个C/S模式系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。

FTP协议是基于TCP协议之上的应用层协议,支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)。

Port模式

FTP 客户端首先和服务器的TCP 21端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。

具体步骤详情如下(笔者所用FTP服务器地址:10.0.1.66,客户端地址:10.0.13.222):

java得ftp使用被动模式_java得ftp使用被动模式

  1. 客户端主动发起TCP连接,连接服务器的21端口,建立用于传输命令的通道。
  2. 客户端通过第一步建立的命令传输通道发送FTP数据包(含PORT信息)。
  3. 服务器通过解析客户端发来的数据包计算所要连接客户端端口,用本地的20端口主动去与计算出的端口建立数据通道的TCP连接。

实验截图如下:

java得ftp使用被动模式_主动被动连接_02

抓包可以看到,FTP客户端(IP:10.0.13.222,端口:10100)与FTP服务器(IP:10.0.1.66,端口:21)建立三次连接。然后登陆成功(230 login successful)后FTP客户端发送 "PORT 10,0,13,222,39,136"。

java得ftp使用被动模式_客户端_03

接着可以看到服务器主动去发起TCP连接,该连接用于FTP数据传输的通道,协议包名为FTP-DATA。可以发现服务器用20端口去连接客户端的10120端口,10120其实就是客户端发送的"PORT 10,0,13,222,39,136"中根据后俩个数值得到的。

连接端口(10120) =  256 * 倒数第二位(39)+ 倒数第一位(136)

Passive模式

建立控制通道和Standard模式类似,但建立连接后发送Pasv命令。服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口传送数据。

具体步骤详情如下(笔者所用FTP服务器地址:10.0.13.222,客户端地址:10.0.13.111):

java得ftp使用被动模式_客户端_04

  1. 客户端主动发起TCP连接,连接服务器的21端口,建立用于传输命令的通道。
  2. 服务器通过第一步建立的命令传输通道发送FTP数据包(含PASS信息)。
  3. 客户端通过解析服务器发来的数据包计算所要连接服务器端口,主动去与计算出的端口建立数据通道的TCP连接,对于服务器来说此次连接是被连接。

实验截图如下:

java得ftp使用被动模式_客户端_05

 

java得ftp使用被动模式_服务器_06

主动和被动模式计算端口的方法都是相同的。