FTP(File Transfer Protocol)是文件传输协议的简称。正如其名所示:FTP的主要作用,就是让一个用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。
FTP支持两种方式的传输:文本(ASCII)方式和二进制(Binary)方式。通常文本文件的传输采用ASCII方式,而图像、声音文件、加密和压缩文件等非文本文件采用二进制方式传输,如果为了从一个系统上传输文件而使用了与本地系统不同的计算机字节位数,那么就必须使用Tenex模式。FTP以ASCII方式作为缺省的文件传输方式。
二、ftp的两种传输模式:
主动(FTP Port)模式和被动(FTP Passive)模式。
当我们对FTP协议进行学习的时候,你首先要考虑到一个问题是使用的是port模式(主动)的还是passive模式(被动)。在过去,客户端缺省为主动模式,进来,由于Port模式的存在安全问题,许多客户端的FTP应用缺省变为了被动模式。FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用两个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口时21-命令端口,20-数据端口。
详细分解一:FTP Port(主动)模式
客户端从一个任意的大于1023(N)的端口连接到FTP服务器的命令端口(21)。然后客户端开始监听端口N+1,并发送FTP命令"Port
N+1"到 FTP 服务器。接着针对FTP服务器前面的防火墙来说,必须允许一下通讯才能支持主动方式FTP:任何端口到FTP服务器的21端口(客户端初始化的连接到FTP的服务器);FTP服务器的21端口到大于1023的端口(服务器响应客户端的控制端口);FTP服务器的20端口到大于1023的端口(服务器端初始化数据连接到客户端的数据端口);大于1023端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
Port模式的FTP详细步骤如下:
1、客户端发送一个 TCP SYN (TCP同步)包给服务器端众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;
2、服务器端发送 SYN ACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
3、客户端发送一个ACK(确认)包;客户端使用这个链接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
4、当用户请求一个列表(List)请求或者发起一个要求或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服务器再打开一个数据连接时候使用这个暂时端口;PORT命令也包含了一个IP地址,这个IP地址通常是客户端自己的IP地址,而且FTP也支持第三方(thirdparty)模式,第三方模式时客户端告诉服务器端打开与另一台主机的连接;
5、服务器端发送一个SYN包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口;
6、客户端以源端口为暂时端口,目的端口为20发送一个SYN ACK包;
7、服务器发送一个ACK包;
8、 发送数据的主机以这个链接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端发送数据,RETR表示服务器端发送数据),这些TCP段都需要对方进行ACK确认(注:因为TCP协议是一个面向连接的协议)
9、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认。
10、客户端能在控制连接上发送更多的命令。这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN。客户端用ACK来确认。
详细分解二: FTP PASV(被动)模式
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都有客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP链接时,客户端打开两个任意的本地端口(N>1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连他的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(端口号大于1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP。从任何端口到服务器的21端口(客户端初始化的连接);服务器端的21端口到任何大于1023的端口(服务器响应到客户单的控制端口的连接);从任何端口到服务器的大于1023端口(客户端初始化数据连接到服务器指定的任意端口);服务器的大于1023端口到远程的大于1023的端口(出,服务器发送ACK响应和数据到客户端的数据端口)。
对比主动模式,被动模式在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令"PASV" 。然后在第二步中,服务器返回命令"PORT N(N为端口号)",告诉客户端(服务器)用哪个端口侦听数据连接。在第三步中,客户端树池化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器再第四步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP程序允许管理员指定FTP服务器使用的端口范围。
另外客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如:Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
FTP报文段里显示了被动模式(Passive Mode)以及发送客户端自己的IP地址和提供给对方的一个随机端口号。并打开由计算得出的随机端口号,使其处于监听状态。等待客户端发起数据连接请求。
FTP报文段显示的是FTP Data,说明传输的是数据。当某几段数据传输完成之后,客户端或服务器会向对方发送一个FIN来关闭这条链路。