原文地址:https://baijiahao.baidu.com/s?id=1604307221471041402&wfr=spider&for=pc
FTP(File Transfer Protocol)是文件传输协议的简称。正如其名所示:FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。
FTP支持两种方式的传输:文本(ASCII)方式和二进制(Binary)方式。通常文本文件的传输采用ASCII方式,而图象、声音文件、加密和压缩文件等非文本文件采用二进制方式传输,如果为了从一个系统上传输文件而使用了与本地系统不同的计算机字节位数,那么就必须使用Tenex模式。FTP以ASCII方式作为缺省的文件传输方式。
二、ftp的两种传输模式:主动(FTP Port)模式和被动(FTP Passive)模式。
当我们对FTP协议进行学习的时候,你首先要考虑到的一个问题是使用的是port模式(主动)的还是passive模式(被动)。在过去,客户端缺省为主动模式;近来,由于Port模式的存在安全问题(port模式下,数据信道中,FTP服务端为固定端口号20;passive模式下,数据信道中,客户端和服务端都是动态端口号。后者更安全。),许多客户端的FTP应用缺省变为了被动模式。FTP是仅基于TCP的服务,不支持UDP。 与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21-命令端口和20-数据端口。
具体用哪种模式,在于客户端的选择。在被动模式中,客户端在第一信道(控制信道)三次握手结束后,再次发了一条询问服务端是否支持passive模式的命令,服务端如果支持,则回复一个随机端口号和ip地址。在第二信道(数据信道)中,客户端就以上一步收到的随机端口为目的端口,与服务器建立连接(三次握手),同时也告诉服务端自己的随机端口号(客户端)。
而在主动模式中,客户端在第一信道(控制信道)三次握手结束后,再次发送的不是询问服务端是否支持passive模式的命令,而是通知服务端,接下来的第二信道,客户端将使用的端口号。
详细分解一:FTP Port(主动)模式
客户端从一个任意的大于1023(N)的端口连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。针对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也支持第三方 (third-party)模式,第三方模式是客户端告诉服务器端打开与另一台主机的连接;
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 PAVS(被动)模式
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的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”。然后在第2步中,服务器返回命令"PORT N(N为端口号)",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP程序允许管理员指定FTP服务器使用的端口范围。
另外客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
为了更好的理解被动模式,我们使用实验去验证学习。
试验环境:PC的IP地址为192.168.98.88,服务器的地址为:192.168.98.12,客户端软件选择cuteftp,首先采用被动模式向服务器发起数据连接。
根据源IP为192.168.98.88可知模式的选择是客户端发起的,PASV是选择被动模式的报文。服务器进行回应:
FTP报文段里显示了被动模式(Passive Mode)以及发送给客户端自己的IP地址以及提供给对方一个随机端口号,计算方式是4*256+222=1246。并打开自己的1246号端口,使其处于监听状态,等待客户端发起数据连接请求。
由上图可以看出客户端向服务器发起的LIST命令,列出文件目录是在控制连接里发起的请求,由目的端口号可以看出来。
客户端接收到这个服务器关于PASV模式的回应,根据服务器提供的IP和端口号重新建立一个新的数据连接,源端口为3399,目的端口为1246(服务器提供的端口),并且从SYN被置为1的情况下可以看出这个一个新的连接。随后的数据是通过这个连接提供的新端口号进行传输的。
FTP报文段显示的是Ftp Data,说明传输的是数据。当某几段数据传输完成之后,客户端或服务器会向对方发送一个FIN来关闭这条连接。如下图:
而控制连接,如果客户端不主动发送FIN,它将一直在整个过程中存在,在服务器上,以21号端口来确认是控制连接。
从时间上来看,第7秒到21秒,TCP的报头信息中,源端口号和目的端口号都未改变,这个连接一直存在。